Модификация/откат файлов ядра при инсталляции/деинсталляции своего компонента

Тема в разделе "Создание расширений для Joomla", создана пользователем toorr2p, 03.10.2009.

  1. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    Подскажите существует ли возможность модификации файлов ядра Joomla при установке своего компонента? Тоесть нужно в определенный файл компонента com_content(controller/icon.php) внести в определенное место свой код, и потом при деинсталляци своего компонента осуществить откат на первоночальный вид. Как такое вообще возможно в PHP это какаето функция делает, или в самой Joomla уже есть метод или клас который это позволяет делать?
     
    Последнее редактирование: 03.10.2009
  2.  
  3. Asylum
    Offline

    Asylum специалист

    Регистрация:
    09.02.2007
    Сообщения:
    2 573
    Симпатии:
    152
    Пол:
    Мужской
    Если в с[B]о[/B]вой, то это уже хак
     
  4. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    ))) мне без разницы хак, кряк, патч, подскажите как это можно реализовать, с помощью чего?
     
  5. Asylum
    Offline

    Asylum специалист

    Регистрация:
    09.02.2007
    Сообщения:
    2 573
    Симпатии:
    152
    Пол:
    Мужской
    Ну то что написал в таблицы и ихие префиксы знаешь, вот их и удаляй
     
  6. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    Дык мнеж не таблицу нужно изменять, а ссам файл icon.php тоесть код в него свой добавить!
     
  7. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    В чем проблема-то? Либо diff ищешь под php, либо простым preg_match находишь нужные места и правишь, либо копируешь поверх старого свой файл.

    Проблема я так понимаю именно в том, что бы сделать это при инсталляции. В принципе возможность есть, я не знаю какая версия джумлы, для 1.0.х был файл xxx.install.php и xxx.uninstall.php которые исполнялись в заданных случаях. Может и в 1.5 что-то есть.
     
  8. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    Спасибо за ответ по существу.

    С инсталляционными файлами проблем не возникает)) проблема как правильно в них прописать функцию которая будет нахотить определенную строку в модифицируемом файле, и после нее вставлять нужный код?

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

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

    Код (PHP):
    1. <?php
    2.    $fp = fopen("icon.php", "r"); // Открываем файл в режиме чтения
    3.    if ($fp)
    4.    {
    5.    while (!feof($fp))
    6.    {
    7.    $subject = fgets($fp, 5500);
    8.    $pattern = "/\b<?php\b/i";
    9.       //echo $mytext."<br />";
    10.       if (preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3)) {
    11.          echo "Вхождение найдено.";
    12.       } else {
    13.          echo "Вхождение не найдено.";
    14.       }
    15.      
    16.    }
    17.    }
    18.    else echo "Ошибка при открытии файла";
    19.    fclose($fp);
    20. ?>
     
  9. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Давай конкретный фрагмент - что и на что менять. Регулярка странная у тебя.
     
  10. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    Вот таким образом я в файле icon.php удаляю строку в которой закрывающая скобка класса :

    Код (PHP):
    1. class JHTMLIcon
    2. {здесь методы
    3. }


    Код который это делает:

    Код (PHP):
    1. <?php
    2.  
    3.     $num_stroka = 162;                      //Удалим 163 строку из файла
    4.     $file = file("icon.php");               // Считываем весь файл в массив
    5.    
    6.     for($i = 0; $i < sizeof($file); $i++)   //Перебираем все строки в файле в цикле
    7.     if($i == $num_stroka) unset($file[$i]); //Когда строка равна указанной удаляем ее (как элемент массива)
    8.    
    9.     $core_text = implode("", $file);        //Склеиваем массив с удаленным элементом(строка) в одну строку
    10.     $my_text = "
    11.         function pdf2email(\$article, \$params, \$access, \$attribs = array())
    12.         {  
    13.             \$url  = 'index.php?option=com_pdf2email&view=pdf2email';
    14.             \$url .= '&id='.\$article->slug.'&tmpl=component';
    15.    
    16.             \$status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=600,height=600,directories=no,location=no';
    17.    
    18.             if (\$params->get('show_icons')) {
    19.                 \$text = JHTML::_('image.site', 'pdf_button.png', '/images/M_images/', NULL, NULL, JText::_('PDF to E-mail'));
    20.             } else {
    21.                 \$text = JText::_('PDF to E-mail').'&nbsp;';
    22.             }
    23.    
    24.             \$attribs['title']  = JText::_( 'PDF to E-mail' );
    25.             \$attribs['onclick'] = \"window.open(this.href,'win2','\".\$status.\"'); return false;\";
    26.             \$attribs['rel']     = 'nofollow';
    27.    
    28.             return JHTML::_('link', JRoute::_(\$url), \$text, \$attribs);
    29.         }
    30.     }
    31. ";
    32.    
    33.     $fp = fopen("icon.php", "w");       //Создаем новый файл и удаляем существующий
    34.     fputs($fp, $core_text.$my_text);    //Записываем  пустой файл
    35.     fclose($fp);                        //Закрываем файл
    36.  
    37. ?>


    Все вставляется нормально, но теперь следущая проблема! Как удалить этот всталенный код?

    Как прописать регулярное выражение чтобы вырезался кусок кода который был вставлен в предидущем примере? Вот этот код работает но я низнаю как устовие поиска задать (тоесть шаблон) :

    Код (PHP):
    1. <?php  
    2.     $file = file("icon.php");
    3.        
    4.     $string = implode("", $file);
    5.     $pattern = "/^functiopdf2email$/";//function\spdf2email\(\$article,\s\$params,\s\$access,\s\$attribs\s\=\sarray\(\)\)
    6.     $replacement = "\\";
    7.     if($result = preg_replace($pattern, $replacement, $string)){
    8.    
    9.         $fp = fopen("icon.php", "w");
    10.         fputs($fp, $result);       
    11.         fclose($fp);                       
    12.         echo "строка ".$pattern." удалена";
    13.     }else{
    14.         echo"Error";
    15.     }
    16. ?>
     
  11. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Дак обрами свой код какими-нибудь уникальными строками, типа XXXXXXXX___START и XXXXXXXX___END, а потом регулярками выцепляй

    $str = preg_replace("|XXXXXXXX___START(.*)XXXXXXXX___END|Umsi","\\1",$str);
     
  12. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    Именно это и нужно мне! :)) Можеш обьяснить суть вот этого

    Код (PHP):
    1. ("|XXXXXXXX___START(.*)XXXXXXXX___END| Umsi","\\1",$str)
    чтоб я больше этих вопросов не задовал :)
     
  13. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Какую часть тебе пояснить? Именно регулярки - так это долго и не интересно.
     
  14. toorr2p
    Offline

    toorr2p Недавно здесь

    Регистрация:
    04.09.2009
    Сообщения:
    37
    Симпатии:
    2
    Пол:
    Мужской
    Ненадо обьяснять, просто условие поиска в словах - типо как "Искать такуето строку где..." я просто непойму что например такое Umsi и \\1 - это переменная да?
     
  15. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Umsi - это флаги какие-то. Читай про preg_match. Возможно я затупил и в preg_replace они не нужны. А \\1 это первая найденная переменная (то есть то, что в скобках).
     
  16. toorr2p
    Offline

    toorr2p Недавно здесь

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

    И функции замены
    Код (CODE):
    1. preg_replace($pattern, $replacement, $string)

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

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

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

    Ну и также точно для того чтобы потом это удалить, да и чтобы удальть нужно перед\после вставляемым кодом поставить указатели
    по которым потом будит осуществлятся поиск и удаления(замена на пробел).
    Ниже код icon.php, index.php(который вставляет код), index_preg_replace.php(который удалят код):
    Код (CODE):
    1. <?php
    2. /**
    3.  * @version     $Id: icon.php 10381 2008-06-01 03:35:53Z pasamio $
    4.  * @package     Joomla
    5.  * @subpackage  Content
    6.  * @copyright   Copyright © 2005 - 2008 Open Source Matters. All rights reserved.
    7.  * @license     GNU/GPL, see LICENSE.php
    8.  * Joomla! is free software. This version may have been modified pursuant to the
    9.  * GNU General Public License, and as distributed it includes or is derivative
    10.  * of works licensed under the GNU General Public License or other free or open
    11.  * source software licenses. See COPYRIGHT.php for copyright notices and
    12.  * details.
    13.  */
    14.  
    15. // no direct access
    16. defined('_JEXEC') or die('Restricted access');
    17.  
    18. /**
    19.  * Content Component HTML Helper
    20.  *
    21.  * @static
    22.  * @package     Joomla
    23.  * @subpackage  Content
    24.  * @since 1.5
    25.  */
    26. class JHTMLIcon
    27. {
    28.     function create($article, $params, $access, $attribs = array())
    29.     {
    30.         $url = 'index.php?task=new&id=0&sectionid='.$article->sectionid;
    31.  
    32.         if ($params->get('show_icons')) {
    33.             $text = JHTML::_('image.site', 'new.png', '/images/M_images/', NULL, NULL, JText::_('New') );
    34.         } else {
    35.             $text = JText::_('New').'&nbsp;';
    36.         }
    37.  
    38.         $attribs    = array( 'title' => JText::_( 'New' ));
    39.         return JHTML::_('link', JRoute::_($url), $text, $attribs);
    40.     }
    41.  
    42.     function pdf($article, $params, $access, $attribs = array())
    43.     {
    44.         $url  = 'index.php?view=article';
    45.         $url .=  @$article->catslug ? '&catid='.$article->catslug : '';
    46.         $url .= '&id='.$article->slug.'&format=pdf';
    47.  
    48.         $status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,wid
    49. th=640,height=480,directories=no,location=no';
    50.  
    51.         // checks template image directory for image, if non found default are loaded
    52.         if ($params->get('show_icons')) {
    53.             $text = JHTML::_('image.site', 'pdf_button.png', '/images/M_images/', NULL, NULL, JText::_('PDF'));
    54.         } else {
    55.             $text = JText::_('PDF').'&nbsp;';
    56.         }
    57.  
    58.         $attribs['title']   = JText::_( 'PDF' );
    59.         $attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";
    60.         $attribs['rel']  = 'nofollow';
    61.  
    62.         return JHTML::_('link', JRoute::_($url), $text, $attribs);
    63.     }
    64.  
    65.     function email($article, $params, $access, $attribs = array())
    66.     {
    67.         //$link = JURI::base()."index.php?view=article&id=".$article->slug;
    68.         $uri     =& JURI::getInstance();
    69.         $base  = $uri->toString( array('scheme', 'host', 'port'));
    70.         $link   = $base.JRoute::_( "index.php?view=article&id=".$article->slug, false );
    71.         $url    = 'index.php?option=com_mailto&tmpl=component&link='.base64_encode( $link );
    72.  
    73.         $status = 'width=400,height=300,menubar=yes,resizable=yes';
    74.  
    75.         if ($params->get('show_icons'))     {
    76.             $text = JHTML::_('image.site', 'emailButton.png', '/images/M_images/', NULL, NULL, JText::_('Email'));
    77.         } else {
    78.             $text = '&nbsp;'.JText::_('Email');
    79.         }
    80.  
    81.         $attribs['title']   = JText::_( 'Email' );
    82.         $attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";
    83.  
    84.         $output = JHTML::_('link', JRoute::_($url), $text, $attribs);
    85.         return $output;
    86.     }
    87.  
    88.     function edit($article, $params, $access, $attribs = array())
    89.     {
    90.         $user =& JFactory::getUser();
    91.  
    92.         if ($params->get('popup')) {
    93.             return;
    94.         }
    95.  
    96.         if ($article->state < 0) {
    97.             return;
    98.         }
    99.  
    100.         if (!$access->canEdit && !($access->canEditOwn && $article->created_by == $user->get('id'))) {
    101.             return;
    102.         }
    103.  
    104.         JHTML::_('behavior.tooltip');
    105.  
    106.         $url = 'index.php?view=article&id='.$article->slug.'&task=edit';
    107.         $icon = $article->state ? 'edit.png' : 'edit_unpublished.png';
    108.         $text = JHTML::_('image.site', $icon, '/images/M_images/', NULL, NULL, JText::_('Edit'));
    109.  
    110.         if ($article->state == 0) {
    111.             $overlib = JText::_('Unpublished');
    112.         } else {
    113.             $overlib = JText::_('Published');
    114.         }
    115.         $date = JHTML::_('date', $article->created);
    116.         $author = $article->created_by_alias ? $article->created_by_alias : $article->author;
    117.  
    118.         $overlib .= '&lt;br /&gt;';
    119.         $overlib .= JText::_($article->groups);
    120.         $overlib .= '&lt;br /&gt;';
    121.         $overlib .= $date;
    122.         $overlib .= '&lt;br /&gt;';
    123.         $overlib .= $author;
    124.  
    125.         $button = JHTML::_('link', JRoute::_($url), $text);
    126.  
    127.         $output = '<span class="hasTip" title="'.JText::_( 'Edit Item' ).' :: '.$overlib.'">'.$button.'</span>';
    128.         return $output;
    129.     }
    130.  
    131.  
    132.     function print_popup($article, $params, $access, $attribs = array())
    133.     {
    134.         $url  = 'index.php?view=article';
    135.         $url .=  @$article->catslug ? '&catid='.$article->catslug : '';
    136.         $url .= '&id='.$article->slug.'&tmpl=component&print=1&page='.@ $request->limitstart;
    137.  
    138.         $status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,wid
    139. th=640,height=480,directories=no,location=no';
    140.  
    141.         // checks template image directory for image, if non found default are loaded
    142.         if ( $params->get( 'show_icons' ) ) {
    143.             $text = JHTML::_('image.site',  'printButton.png', '/images/M_images/', NULL, NULL, JText::_( 'Print' ) );
    144.         } else {
    145.             $text = JText::_( 'ICON_SEP' ) .'&nbsp;'. JText::_( 'Print' ) .'&nbsp;'. JText::_( 'ICON_SEP' );
    146.         }
    147.  
    148.         $attribs['title']   = JText::_( 'Print' );
    149.         $attribs['onclick'] = "window.open(this.href,'win2','".$status."'); return false;";
    150.  
    151.         return JHTML::_('link', JRoute::_($url), $text, $attribs);
    152.     }
    153.  
    154.     function print_screen($article, $params, $access, $attribs = array())
    155.     {
    156.         // checks template image directory for image, if non found default are loaded
    157.         if ( $params->get( 'show_icons' ) ) {
    158.             $text = JHTML::_('image.site',  'printButton.png', '/images/M_images/', NULL, NULL, JText::_( 'Print' ) );
    159.         } else {
    160.             $text = JText::_( 'ICON_SEP' ) .'&nbsp;'. JText::_( 'Print' ) .'&nbsp;'. JText::_( 'ICON_SEP' );
    161.         }
    162.         return '<a href="#" onclick="window.print();return false;">'.$text.'</a>';
    163.     }
    164.  
    165. }]


    Код (CODE):
    1. <?php
    2.     echo "Вставка";
    3.  
    4.     $file = file("icon.php");               // Считываем весь файл в массив
    5.        
    6.     $string = implode("", $file);       //Склеиваем массив - элементы в одну строку
    7.     $pattern = "/(?<=\})[\s*]*(?=\})/"; //Условие поиска
    8.     $replacement = "//PDF TO EMAIL___START
    9.         function\spdf2email\(\$article\,\s\$params\,\s\$access\,\s\$attribs\s\=\sarray\(\)\)
    10.         {
    11.             $url  = 'index.php?view=article';
    12.             $url .=  @$article->catslug ? '&catid='.$article->catslug : '';
    13.             $url .= '&id='.$article->slug.'&format=pdf';
    14.    
    15.             $status = 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,wid
    16. th=640,height=480,directories=no,location=no';
    17.    
    18.             // checks template image directory for image, if non found default are loaded
    19.             if ($params->get('show_icons')) {
    20.                 $text = JHTML::_('image.site', 'pdf_button.png', '/images/M_images/', NULL, NULL, JText::_('PDF'));
    21.             } else {
    22.                 $text = JText::_('PDF').'&nbsp;';
    23.             }
    24.    
    25.             $attribs['title']   = JText::_( 'PDF' );
    26.             $attribs['onclick'] = \"window.open(this.href,'win2','\".$status.\"'); return false;\";
    27.             $attribs['rel']  = 'nofollow';
    28.    
    29.             return JHTML::_('link', JRoute::_($url), $text, $attribs);
    30.         }
    31.  
    32.     //PDF TO EMAIL___END
    33.     ";
    34.     if($result = preg_replace($pattern, $replacement, $string)){
    35.    
    36.         $fp = fopen("icon.php", "w"); //Создаем новый файл и удаляем существующий
    37.         fputs($fp, $result);          //Записываем  пустой файл
    38.         fclose($fp);                  //Закрываем файл
    39.         echo "строка ".$pattern." добавлена в файл";
    40.     }else{
    41.         echo"Error";
    42.     }
    43.  
    44. ?>


    Код (CODE):
    1. <?php  
    2.     $file = file("icon.php");
    3.        
    4.     $string = implode("", $file);
    5.     $pattern = "/(?<=START)[.\W\d\D\s*]*(?=\/\/PDF TO EMAIL___END)/";
    6.     $replacement = " ";
    7.     if($result = preg_replace($pattern, $replacement, $string)){
    8.    
    9.         $fp = fopen("icon.php", "w");
    10.         fputs($fp, $result);       
    11.         fclose($fp);                       
    12.         echo "строка ".$pattern." удалена";
    13.     }else{
    14.         echo"Error";
    15.     }
    16. ?>


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

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Универсальней - если это используется в своем компоненте - создать класс, наследующий данный и добавить в него нужный метод.
     

Поделиться этой страницей

Загрузка...