X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Патч ядра Joomla! 1.5x, есть ли функция для записи в существующий файл PHP
toorr2p
toorr2p
Topic Starter сообщение 3.10.2009, 18:46; Ответить: toorr2p
Сообщение #1


Привет! Ктонибуть знает каки образом можно осуществить патч ядра Joomla при установке своего компонента? Тоесть нужно в определенный файл компонента com_content(controller/icon.php) внести в определенное место совой код, и потом при деинсталляци своего компонента осуществить откат на первоночальный вид. Как такое вообще возможно в PHP это какаето функция делает, или в самой Joomla уже есть метод или клас который это позволяет делать?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
sc2r2bey
sc2r2bey
сообщение 3.10.2009, 19:41; Ответить: sc2r2bey
Сообщение #2


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


--------------------
Заметки о разработке и не только
программирую web и для we
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
toorr2p
toorr2p
Topic Starter сообщение 4.10.2009, 18:33; Ответить: toorr2p
Сообщение #3


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

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

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

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

[php]<?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);
?>[/php]
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 6.10.2009, 19:49; Ответить: ZiTosS
Сообщение #4


Вячеслав, Обычно системы подобного уровня разрабатываются так, что вносить изменения в ядро не приходится, нужно только в правильном направлении копнуть. Возможно нужно просто поменять состояние объекта, переменной. Вот в этом направлении надо копать, найти, что и где нужно вставить в компонент, чтобы изменить уже существующее состояние ядра. Для подобных ухищрений нужно досконально изучить движок, чтобы знать все тонкости организации и формирования данных, а так же сборку(связку) с компонентами модулями и плагинами.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
toorr2p
toorr2p
Topic Starter сообщение 8.10.2009, 15:40; Ответить: toorr2p
Сообщение #5


Задача сводится к тому чтобы добавить в файл icon.php свой код при установке собственного расширения(компонента), и удалении этого кода при деинсталляции. Понятно что легче и правилнее* поменять значение переменной, но здесь немного не та ситуация(наверно...). Так вот, в файле icon.php находится класс class JHTMLIcon который содержит методы по формированию иконок-ссылок, с нужными параметрами - url, id, cat window.open... И нужно просто расширить этот класс, но расширить извне* тоесть из другого компонента не получалось (этого класса на видно из нашего компонента). Поэтому было решено использовать функции открытия файла
[php]$file = file("icon.php"); // Считываем весь файл в массив[/php]
И функции замены
[php]preg_replace($pattern, $replacement, $string)[/php]
С помощью первой считываем все содержимое файла в массив, затем все его элементы склеиваем с помощью функции:
[php]$string = implode("", $file); //Склеиваем массив - элементы в одну строку[/php]
И далее с помощью preg_replace осуществляем поиск по этой строке, находим тужную часть кода с помощью регулярного выражения:
[php]$pattern = "/(?<=\})[\s*]*(?=\})/"; //Условие поиска[/php]
(?<=\}) - это Ретроспективная проверка - проверка слева, то что должно быть слева от искомой области в строке(после знака "=" предполагаемый текст или символ(в данном примере это \} которую экранируем обратным слешем.
Тоесть с помощью этой части условия мы находимзакрывающью скобку последнего метода нашего класса.
Далее указываем что идет после тоесть справа - (?=\}) - Опережающая проверка
Это мы определили закрывающую скобку нашего класса
И указываем то что должно идти между этими проверками - [\s*]* - сколько угодно пробелов и минимум 1.
Далее указываем что будем вставлять:
[php]$replacement = "//PDF TO EMAIL___START ................. //PDF TO EMAIL___END";[/php]
Ну и также точно для того чтобы потом это удалить, да и чтобы удальть нужно перед\после вставляемым кодом поставить указатели
//PDF TO EMAIL___START ................. //PDF TO EMAIL___END
по которым потом будит осуществлятся поиск и удаления(замена на пробел).
Ниже код icon.php, index.php(который вставляет код), index_preg_replace.php(который удалят код):
[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]

[php]<?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]

[php]<?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";
}
?>[/php]

Посоветуйте может чтото можно сделать более универсальней?
Прикрепленные файлы
Прикрепленный файл  index.php ( 1,5 килобайт ) Кол-во скачиваний: 89
Прикрепленный файл  index_preg_replace.php ( 379 байт ) Кол-во скачиваний: 87
Прикрепленный файл  icon.php ( 5,59 килобайт ) Кол-во скачиваний: 91
 
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 11.10.2009, 12:29; Ответить: ZiTosS
Сообщение #6


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

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Горячая тема (нет новых ответов) Разработка сайтов Joomla Wordpress Opencart
Разработка, верстка, оптимизация веб сайтов.
77 WoWeb 40301 3.9.2023, 16:52
автор: Sawich
Открытая тема (нет новых ответов) [Продам] базы сайтов на CMS Wordpress/Joomla/Drupal/Magento/...
14 phosphoruss 13674 16.8.2023, 15:27
автор: SmmPanelUS
Открытая тема (нет новых ответов) Тема имеет прикрепленные файлыТехподдержка сайтов на движках Joomla, Netcat, Opencart
5 54web 4260 22.1.2023, 13:27
автор: kikimora17
Открытая тема (нет новых ответов) Заказать Копирайтинг | Проработка Семантического ядра | Составление ТЗ
0 yehCANA 923 19.9.2022, 18:33
автор: yehCANA
Открытая тема (нет новых ответов) Готовые семантические ядра по разным тематикам
Готовые семантические ядра по разным тематикам
0 NewSeoDay 1421 13.12.2021, 23:48
автор: NewSeoDay


 



RSS Текстовая версия Сейчас: 29.3.2024, 17:57
Дизайн