Перейти к содержимому



Патч ядра Joomla! 1.5x

#1 Вячеслав

Вячеслав
  • Пользователь
  • 357 сообщений
  • Репутация: 0
0

Отправлено 03 Октябрь 2009 - 17:46

Привет! Ктонибуть знает каки образом можно осуществить патч ядра Joomla при установке своего компонента? Тоесть нужно в определенный файл компонента com_content(controller/icon.php) внести в определенное место совой код, и потом при деинсталляци своего компонента осуществить откат на первоночальный вид. Как такое вообще возможно в PHP это какаето функция делает, или в самой Joomla уже есть метод или клас который это позволяет делать?

 

 

  • 0

#2 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 03 Октябрь 2009 - 18:41

никак только ручками
  • 0

#3 Вячеслав

Вячеслав
    Topic Starter
  • Пользователь
  • 357 сообщений
  • Репутация: 0

Отправлено 04 Октябрь 2009 - 17:33

Ручками то и пытаюсь сделаь)) только нужно чтоб это срабатывало именно при инсталляции/деинсталляции тк не каждый кто будет этот компонент ставить сможет в нужном месте подправить код :)

проблема в том как правильно в файле найти определенную строку по маске и потом ПОСЛЕ ЭТОЙ СТРОКИ вставить свой код, а в дальнейшем и удалить такимже способом при UNINSTALL

Вот с помощью функции fopen я открываю нужный фал на чтение затем в цикле (до того как в файл не закончится) с помощью функции fgets считываю построчно все символы (5 500) и заношу все это дело в переменную $subject, затем создаю "маску" по которой в тексте(который в переменной) буду искать соответствие.

Но вот чтото я нетак зписал или не так это использую, короче выводит Вхождение не найдено. гдеж я ошибся то? :'(

<?php
$fp = fopen("icon.php", "r"); // Открываем файл в режиме чтения
if ($fp)
{
while (!feof($fp))
{
$subject = fgets($fp, 5500);
$pattern = "/\b<?php\b/i";
//echo $mytext."<br />";
if (preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3)) {
echo "Вхождение найдено.";
} else {
echo "Вхождение не найдено.";
}

}
}
else echo "Ошибка при открытии файла";
fclose($fp);
?>


  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 06 Октябрь 2009 - 18:49

Вячеслав, Обычно системы подобного уровня разрабатываются так, что вносить изменения в ядро не приходится, нужно только в правильном направлении копнуть. Возможно нужно просто поменять состояние объекта, переменной. Вот в этом направлении надо копать, найти, что и где нужно вставить в компонент, чтобы изменить уже существующее состояние ядра. Для подобных ухищрений нужно досконально изучить движок, чтобы знать все тонкости организации и формирования данных, а так же сборку(связку) с компонентами модулями и плагинами.
  • 0

#5 Вячеслав

Вячеслав
    Topic Starter
  • Пользователь
  • 357 сообщений
  • Репутация: 0

Отправлено 08 Октябрь 2009 - 14:40

Задача сводится к тому чтобы добавить в файл icon.php свой код при установке собственного расширения(компонента), и удалении этого кода при деинсталляции. Понятно что легче и правилнее* поменять значение переменной, но здесь немного не та ситуация(наверно...). Так вот, в файле icon.php находится класс class JHTMLIcon который содержит методы по формированию иконок-ссылок, с нужными параметрами - url, id, cat window.open... И нужно просто расширить этот класс, но расширить извне* тоесть из другого компонента не получалось (этого класса на видно из нашего компонента). Поэтому было решено использовать функции открытия файла
$file = file("icon.php"); // Считываем весь файл в массив

И функции замены
preg_replace($pattern, $replacement, $string)

С помощью первой считываем все содержимое файла в массив, затем все его элементы склеиваем с помощью функции:
$string = implode("", $file);		//Склеиваем массив - элементы в одну строку

И далее с помощью preg_replace осуществляем поиск по этой строке, находим тужную часть кода с помощью регулярного выражения:
$pattern = "/(?<=\})[\s*]*(?=\})/"; //Условие поиска

(?<=\}) - это Ретроспективная проверка - проверка слева, то что должно быть слева от искомой области в строке(после знака "=" предполагаемый текст или символ(в данном примере это \} которую экранируем обратным слешем.
Тоесть с помощью этой части условия мы находимзакрывающью скобку последнего метода нашего класса.
Далее указываем что идет после тоесть справа - (?=\}) - Опережающая проверка
Это мы определили закрывающую скобку нашего класса
И указываем то что должно идти между этими проверками - [\s*]* - сколько угодно пробелов и минимум 1.
Далее указываем что будем вставлять:
$replacement = "//PDF TO EMAIL___START ................. //PDF TO EMAIL___END";

Ну и также точно для того чтобы потом это удалить, да и чтобы удальть нужно перед\после вставляемым кодом поставить указатели

//PDF TO EMAIL___START ................. //PDF TO EMAIL___END

по которым потом будит осуществлятся поиск и удаления(замена на пробел).
Ниже код icon.php, index.php(который вставляет код), index_preg_replace.php(который удалят код):
<?php
/**
* @version $Id: icon.php 10381 2008-06-01 03:35:53Z pasamio $
* @package Joomla
* @subpackage Content
* @copyright Copyright © 2005 - 2008 Open Source Matters. All rights reserved.
* @license GNU/GPL, see LICENSE.php
* Joomla! is free software. This version may have been modified pursuant to the
* GNU General Public License, and as distributed it includes or is derivative
* of works licensed under the GNU General Public License or other free or open
* source software licenses. See COPYRIGHT.php for copyright notices and
* details.
*/

// no direct access
defined('_JEXEC') or die('Restricted access');

/**
* Content Component HTML Helper
*
* @static
* @package Joomla
* @subpackage Content
* @since 1.5
*/
class JHTMLIcon
{
function create($article, $params, $access, $attribs = array())
{
$url = 'index.php?task=new&id=0&sectionid='.$article->sectionid;

if ($params->get('show_icons')) {
$text = JHTML::_('image.site', 'new.png', '/images/M_images/', NULL, NULL, JText::_('New') );
} else {
$text = JText::_('New').'&nbsp;';
}

$attribs = array( 'title' => JText::_( 'New' ));
return JHTML::_('link', JRoute::_($url), $text, $attribs);
}

function pdf($article, $params, $access, $attribs = array())
{
$url = 'index.php?view=article';
$url .= @$article->catslug ? '&catid='.$article->catslug : '';
$url .= '&id='.$article->slug.'&format=pdf';

$status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,wid
th=640,height=480,directories=no,location=no';

// checks template image directory for image, if non found default are loaded
if ($params->get('show_icons')) {
$text = JHTML::_('image.site', 'pdf_button.png', '/images/M_images/', NULL, NULL, JText::_('PDF'));
} else {
$text = JText::_('PDF').'&nbsp;';
}

$attribs['title'] = JText::_( 'PDF' );
$attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";
$attribs['rel'] = 'nofollow';

return JHTML::_('link', JRoute::_($url), $text, $attribs);
}

function email($article, $params, $access, $attribs = array())
{
//$link = JURI::base()."index.php?view=article&id=".$article->slug;
$uri =& JURI::getInstance();
$base = $uri->toString( array('scheme', 'host', 'port'));
$link = $base.JRoute::_( "index.php?view=article&id=".$article->slug, false );
$url = 'index.php?option=com_mailto&tmpl=component&link='.base64_encode( $link );

$status = 'width=400,height=300,menubar=yes,resizable=yes';

if ($params->get('show_icons')) {
$text = JHTML::_('image.site', 'emailButton.png', '/images/M_images/', NULL, NULL, JText::_('Email'));
} else {
$text = '&nbsp;'.JText::_('Email');
}

$attribs['title'] = JText::_( 'Email' );
$attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";

$output = JHTML::_('link', JRoute::_($url), $text, $attribs);
return $output;
}

function edit($article, $params, $access, $attribs = array())
{
$user =& JFactory::getUser();

if ($params->get('popup')) {
return;
}

if ($article->state < 0) {
return;
}

if (!$access->canEdit && !($access->canEditOwn && $article->created_by == $user->get('id'))) {
return;
}

JHTML::_('behavior.tooltip');

$url = 'index.php?view=article&id='.$article->slug.'&task=edit';
$icon = $article->state ? 'edit.png' : 'edit_unpublished.png';
$text = JHTML::_('image.site', $icon, '/images/M_images/', NULL, NULL, JText::_('Edit'));

if ($article->state == 0) {
$overlib = JText::_('Unpublished');
} else {
$overlib = JText::_('Published');
}
$date = JHTML::_('date', $article->created);
$author = $article->created_by_alias ? $article->created_by_alias : $article->author;

$overlib .= '&lt;br /&gt;';
$overlib .= JText::_($article->groups);
$overlib .= '&lt;br /&gt;';
$overlib .= $date;
$overlib .= '&lt;br /&gt;';
$overlib .= $author;

$button = JHTML::_('link', JRoute::_($url), $text);

$output = '<span class="hasTip" title="'.JText::_( 'Edit Item' ).' :: '.$overlib.'">'.$button.'</span>';
return $output;
}


function print_popup($article, $params, $access, $attribs = array())
{
$url = 'index.php?view=article';
$url .= @$article->catslug ? '&catid='.$article->catslug : '';
$url .= '&id='.$article->slug.'&tmpl=component&print=1&page='.@ $request->limitstart;

$status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,wid
th=640,height=480,directories=no,location=no';

// checks template image directory for image, if non found default are loaded
if ( $params->get( 'show_icons' ) ) {
$text = JHTML::_('image.site', 'printButton.png', '/images/M_images/', NULL, NULL, JText::_( 'Print' ) );
} else {
$text = JText::_( 'ICON_SEP' ) .'&nbsp;'. JText::_( 'Print' ) .'&nbsp;'. JText::_( 'ICON_SEP' );
}

$attribs['title'] = JText::_( 'Print' );
$attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";

return JHTML::_('link', JRoute::_($url), $text, $attribs);
}

function print_screen($article, $params, $access, $attribs = array())
{
// checks template image directory for image, if non found default are loaded
if ( $params->get( 'show_icons' ) ) {
$text = JHTML::_('image.site', 'printButton.png', '/images/M_images/', NULL, NULL, JText::_( 'Print' ) );
} else {
$text = JText::_( 'ICON_SEP' ) .'&nbsp;'. JText::_( 'Print' ) .'&nbsp;'. JText::_( 'ICON_SEP' );
}
return '<a href="#" onclick="window.print();return false;">'.$text.'</a>';
}

}]


<?php
echo "Вставка";

$file = file("icon.php"); // Считываем весь файл в массив

$string = implode("", $file); //Склеиваем массив - элементы в одну строку
$pattern = "/(?<=\})[\s*]*(?=\})/"; //Условие поиска
$replacement = "//PDF TO EMAIL___START
function\spdf2email\(\$article\,\s\$params\,\s\$access\,\s\$attribs\s\=\sarray\(\)\)
{
$url = 'index.php?view=article';
$url .= @$article->catslug ? '&catid='.$article->catslug : '';
$url .= '&id='.$article->slug.'&format=pdf';

$status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,wid
th=640,height=480,directories=no,location=no';

// checks template image directory for image, if non found default are loaded
if ($params->get('show_icons')) {
$text = JHTML::_('image.site', 'pdf_button.png', '/images/M_images/', NULL, NULL, JText::_('PDF'));
} else {
$text = JText::_('PDF').'&nbsp;';
}

$attribs['title'] = JText::_( 'PDF' );
$attribs['onclick'] = \"window.open(this.href,'win2','\".$status.\"'); return false;\";
$attribs['rel'] = 'nofollow';

return JHTML::_('link', JRoute::_($url), $text, $attribs);
}

//PDF TO EMAIL___END
";
if($result = preg_replace($pattern, $replacement, $string)){

$fp = fopen("icon.php", "w"); //Создаем новый файл и удаляем существующий
fputs($fp, $result); //Записываем пустой файл
fclose($fp); //Закрываем файл
echo "строка ".$pattern." добавлена в файл";
}else{
echo"Error";
}

?>


<?php	
$file = file("icon.php");

$string = implode("", $file);
$pattern = "/(?<=START)[.\W\d\D\s*]*(?=\/\/PDF TO EMAIL___END)/";
$replacement = " ";
if($result = preg_replace($pattern, $replacement, $string)){

$fp = fopen("icon.php", "w");
fputs($fp, $result);
fclose($fp);
echo "строка ".$pattern." удалена";
}else{
echo"Error";
}
?>


Посоветуйте может чтото можно сделать более универсальней?

Прикрепленные файлы

  • Прикрепленный файл  icon.php   5,59К   Количество загрузок: 65
  • Прикрепленный файл  index.php   1,5К   Количество загрузок: 70
  • Прикрепленный файл  index_preg_replace.php   379байт   Количество загрузок: 63

  • 0

#6 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 11 Октябрь 2009 - 11:29

Вячеслав, для подобных вещей пишут плагины, Как раз ты заменишь сформированное ядром, своим кодом. Просто надо будет создать класс основанный на JHTMLIcon, переписать функции которые нужно, и вызвать с помощью обработчика.
http://kjoomla.com/s...ginsjoomla.html
Вообще тебе нужно написать плагин типа Content
  • 0


Оформление форума – IPBSkins.ru