Перенес сайт с 1.0.13 на 1.5.7, понадобился плагин, наподобие MOS File для 1.0.хх. Не найшел ничего похожего и написал свой плагин. Но получилось не совсем так, как нужно. Создаю в .xml параметр Root, в котором можно было бы задавать корневую папку для плагина, откуда нужно тянуть файлы, но по $params->get('Root') получаю пустую строку. Xml-файл выглядит так: Код (CODE): <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd"> <install version="1.5" type="plugin" group="content"> <name>Content - Direct File Download</name> <author>Melnyk</author> <authorEmail>Melnyk@academy.sumy.ua</authorEmail> <creationDate>2009-01-27</creationDate> <license>GPL</license> <version>0.9</version> <files> <filename plugin="dfd_plg">dfd_plg.php</filename> </files> <params> <param name="Root" type="text" default="" label="Root directory" /> </params> </install> Код выглядит так: Код (CODE): <?php // no direct access defined( '_JEXEC' ) or die( 'Restricted access' ); $mainframe->registerEvent('onPrepareContent','onPrepareDirectFileDownload'); //jimport('joomla.event.plugin'); function onPrepareDirectFileDownload(&$row, &$params) { $root = $params->get('Root'); $pattern = "({dfd (.+?)})"; // $a_link = "<a href=\"images/stories/"."$2\">"; $a_link = "<a href=\"".$root."$2\">"; $row->text = preg_replace("{".$pattern."}", "$a_link", $row->text); $pattern = "{/dfd}"; $a_link = '</a>'; $row->text = preg_replace("{".$pattern."}", $a_link, $row->text); } ?> Т.е. если я ставлю прямое указание, что корнем для ссылок на файлы есть директория image\stories, то все прекрасно работает - {dfd melnyk\xyz.jpg}Имя для ссылки{/dfd} заменяется ссылкой. Но хотелось сделать полноценный плагин, а не выходит. Хотя в модуле тестовом значение берется на ура по $params->get(). Я что-то упускаю, или же в плагинах нельзя пользоваться этой конструкцией, или еще что-то?
Я не совсем уверен, что этот params тот самый объект. Сделай var_dump и смотри что это и откуда прилетает. Плюс, по-моему так раньше было, параметры доступны после первого их сохранения.
Вот у меня точно такая же проблема возникает периодически. То ли что-то гдето надо по ссылке передавать, то ли запрашивать параметры где-то вне функций. Например, взялся перекроить под себя плагин для VM SEF ServiceMap. Создал свою функцию в нем и прописал в XML свою опцию. Было Код (PHP): function com_virtuemart_bot ($level,$link,$Itemid,$params) { virtuemart_category_list(0,$level,$Itemid,$params); } Стало Код (PHP): function com_virtuemart_bot ($level,$link,$Itemid,$params) { //virtuemart_category_list(0,$level,$Itemid,$params); $show_mode = intval($params->get( 'show_mode', '2' )) ; if($show_mode==2) virtuemart_only_product_list ($level,$Itemid,$params,'flypage.tpl'); else virtuemart_category_list(0,$level,$Itemid,$params); } И здесь как раз $params->get возвращает пустую строку, хотя в функции virtuemart_category_list он срабатывает нормально. В чем же дело?
Хммм... что же гласят нам доки ? Код (PHP): defined( '_JEXEC' ) or die( 'Restricted access' ); jimport( 'joomla.plugin.plugin' ); class plgSystemTest extends JPlugin { /** * Constructor * * For php4 compatibility we must not use the __constructor as a constructor for plugins * because func_get_args ( void ) returns a copy of all passed arguments NOT references. * This causes problems with cross-referencing necessary for the observer design pattern. * * @access protected * @param object $subject The object to observe * @param array $config An array that holds the plugin configuration * @since 1.0 */ function plgSystemTest( &$subject, $config ) { parent::__construct( $subject, $config ); // Do some extra initialisation in this constructor if required } /** * Do something onAfterInitialise */ function onAfterInitialise() { // Perform some action } } забудьте про функционально программирование в Джумле, все уже придумано до Вас Код (CODE): * @param object $subject The object to observe не ждали ? ) А теперь получаем параметры в любом методе класса: Код (PHP): $myParam = $this->params->get( 'show_mode', '2' ); оп оп оп , читаем мат-часть
Тут прикол как раз в том, что я не свой плагин пишу, а докурочиваю к готовому свою функцию по образу и подобию существующих. И разработан он как-то странно: класса в нем нет, есть только функции. И во всех функциях работает $params->get, а в моей - нет... Ну и $this->params->get, естественно, тоже не сработал
Ну раз написан через ж, то и доставать надо через то же место. Попробуй Код (PHP): $plg = JPluginHelper::getPlugin('pluguinType','PluginName'); $params = new JParameter($plg->params); $paramName = $params->get('paramName','paramDef');
botanist, точно, именно так! Код (PHP): $plg = JPluginHelper::getPlugin('com_sefservicemap','com_virtuemart_bot'); $params = new JParameter($plg->params); $show_mode = intval($params->get( 'show_mode', '2' )) ; И всё зафурыкало. Спасибо!
Вопрос в продолжении темы хмл-файл: Код (CODE): <!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/plugin-install.dtd"> <extension version="2.5" type="plugin" group="category" method="upgrade"> <name> filtersearchplugin </name> <author> ashustov </author> <authorEmail> </authorEmail> <version> 1.0 </version> <copyright/> <description> Filter </description> <files> <filename plugin="filtersearch"> filtersearch.php </filename> </files> <config> </config> <scriptfile/> <sql> </sql> <params/> </extension> filtersearch.php : Код (CODE): <?php // Запрет прямого доступа. defined('_JEXEC') or die; class plgCategoryfiltersearch extends JPlugin { function onBeforeDisplayProductList(&$products) { print_r("hjkhfd"); $newproducts = array(); foreach($products AS $product) if ($product['product_id'] == 1) $newproducts[] = $product; $products = $newproducts; } } ?> Не пойму почему не распечатывается моя строка print_r("hjkhfd"); Помогите, пожалуйста или хотя бы подскажите где читать мануалы.
Неужели никто ничего не подскажет? Нужно мне подписаться на событие компонента COM_jshopping, чтобы выполнить свои действия с продуктами ((
вот интересно где это в J в эту функцию передаются параметры!!!! P.S. когда найдёшь где и как туда передаются параметры тут же ответишь на свой вопрос
Разобрался. Не правильно указал группу плагина. Почему-то думал, что связь плагина происходит не в классе компонента.