0 Пользователей и 1 Гость просматривают эту тему.
  • 20 Ответов
  • 11487 Просмотров
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
Т.к. разработчики не позаботились о возможности создания плагинов для этого компонента. На досуге реализовал такую возможность.
Для обработки доступны следующие события:
* onAfterItemSave
Код: php
function onAfterItemSave(&$item, $isNew)
        {
                global $mainframe;
                    // Code
 return true;
* onAfterItemRemove
Код: php
function onAfterItemRemove( &$item)
        {
                global $mainframe;
                      // Code
                return true;
}
В файле установки обязательно группу указываем zoo - group="zoo".

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

Для работы события onAfterItemSave необходимо добавить следующий код в файлы  item.php (/site/administrator/components/com_zoo/controllers/) и submission.php (/site/components/com_zoo/controllers/)  в функцию save() перед  $this->setRedirect($link, $msg):
Код: php
 
    JPluginHelper::importPlugin('zoo');
    $dispatcher =& JDispatcher::getInstance();
    if ($cid || (int) $this->item->id) {
        $isNew = '0';
      } else {
         $isNew = '1';
      }
    $dispatcher->trigger( 'onAfterItemSave', array(&$item, $isNew) );
Для работы события оnAfterItemRemove необходимо добавить следующий код в файлы  item.php (/site/administrator/components/com_zoo/controllers/) и submission.php (/site/components/com_zoo/controllers/)  в функцию remove(). Тут посложнее, находим
Код: php
// delete items
foreach ($cid as $id) {
  $table->delete($table->get($id));
}
Внутрь foreach, перед $table->delete($table->get($id)) вставляем - $item = $table->get($id), а после $table->delete($table->get($id)) - код ниже, а для submission.php - только вставляем ниже приведенный код после $table->delete($item) :
Код: php
JPluginHelper::importPlugin('zoo');
$dispatcher =& JDispatcher::getInstance();    
$dispatcher->trigger( 'onAfterItemRemove', array(&$item) );

На этом все. Оригинал статьи можете почитать на моем сайте, там же можете скачать первую пару плагинов для Yootheme Zoo, которые написаны по данной методике: плагин для пинга (думаю, будет полезен всем) и плагин для публикации в ленте активности JomSocial.
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

voland

  • Легенда
  • 11030
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
То есть это все таки хак?
Кроме того, зу сейчас понимает контентные плагины, этого недостаточно?
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
То есть это все таки хак?
Хак только для того, чтобы реализовать вызов плагина. Легче один раз сделать в ядре вызов, чем каждый раз лезть в компонент и редактировать под свои потребности.
Цитировать
Кроме того, зу сейчас понимает контентные плагины, этого недостаточно?
Этого недостаточно. Напр., для меня нужен был момент сохранения итема, а контент-плагин только текст обрабатывает.
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
В Zoo 2.4 реализовали систему событий. Уже и хак не требуется. Кто-то пробовал разобратся, т.к. документации 0?
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

voland

  • Легенда
  • 11030
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
И так продолжаем тему.
Как создать плагин для Zoo 2.4.x?
Плагин для данного компонента является системным, поэтому пишем как обычный системный плагин.
Основная функция плагина - onAfterInitialise()
в которой подключаем конфигурацию компонента
Код: php
// load ZOO config
require_once(JPATH_ADMINISTRATOR.'/components/com_zoo/config.php');
Создаем экземпляр компонента
Код: php
// Get the ZOO App instance
$zoo = App::getInstance('zoo');
Регистрируем и присоединяем обработчик событий
Код: php
// register event
$zoo->event->dispatcher->connect('item:saved', array('plgSystemZooevent', 'itemSaved'));
Создаем дополнительную функцию, которая будет обрабатывать событие
Код: php
function itemSaved($event) {
      $item = $event->getSubject();
      $new = $event['new'];

      // do whatever you'd like to do
}
На этом создание плагина закончено.

Посмотреть какие события для Zoo реализованы и какие параметры принимаются и возращаются можно посмотреть в administrator/components/com_zoo/config.php и  administrator/components/com_zoo/events/
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

topos

  • Захожу иногда
  • 78
  • 10 / 0
у кого нить получилось написать плагин для 2.4 используя события?
*

topos

  • Захожу иногда
  • 78
  • 10 / 0
подскажите как получить в плагине значение элемента по имени ?
*

topos

  • Захожу иногда
  • 78
  • 10 / 0
Есть значение поля elements

Код
<?xml version="1.0" encoding="utf-8"?>
<elements>

<myelement identifier="0bd05834-bda4-4d47-8a7d-f15e2ffc3e8b">
  <value1><![CDATA[011115]]></value1>
  <value2><![CDATA[100]]></value2>
</myelement>
</elements>

Как получить значения value1 и value2?
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
Как получить значения value1 и value2?
Только методом парсинга XML файла. Можно попробовать использовать simple XML.
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

topos

  • Захожу иногда
  • 78
  • 10 / 0
Код
$xml = $item->elements;
$xml_arr = simplexml_load_string($xml);
$value1 = $xml_arr->myelement->value1;
$value2 = $xml_arr->myelement->value2;
:)
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
Нашел баг в процессе написания плагинов.
Суть в том, что плагины являются системными и работают не только на сайте, а и в админке тоже.
Ну так вот при использовании в плагине функции рендеринга:
Код: php
$renderer = $this->app->renderer->create('item')->addPath(array($this->app->path->path('component.site:'), $this->app->path->path('plugins:plugin/zooplugin/')));
echo $renderer->render('item.default', array('item' => $item));
и если где-то в шаблоне для данного плагина выводится ссылка (напр., ссылка привязана к картинке), то при срабатывании плагина в админке возникает такая ошибка - Class 'JSite' not found in /****/***/public_html/administrator/components/com_zoo/helpers/route.php on line 268. (JSite::getMenu();)
Если сделать проверку места вызова и вместо "component.site" в админке использовать "component.administration" вылезет другая - Renderer Layout "element.default" not found. (File: /administrator/components/com_zoo/classes/renderer/item.php, Line: 131).
Т.е. пока разработчики что-то не сделать с существующей привязкой ссылок к меню и если нужно использовать данный код в плагине то возможными путями решения проблемы являются:
 - отказ от использования ссылки на итем
 - или если последнее нежелательно - делать проверку, и только когда плагин вызывается во фронт-энде рендерить итем.
Вот такие получаются пироги.
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

topos

  • Захожу иногда
  • 78
  • 10 / 0
Работаем с элементами в плагине.
У нас есть функция которая срабатывает при сохранении item
Код
function itemSaved($event) {

        $item = $event->getSubject();

1) Получаем все  типы элементов которые есть в item:

Допустим у нас есть елементы link, download, text

Код
foreach ($item->getElements() as $elements)
{
echo $elements->getElementType().',';

}

Получим
Код
link,text,download,

2) Получаем нужный нам элемент по названию
      
Код
		foreach ($item->getElements() as $element)
{
if ($element->getElementType() == "myelement" ){
$myelement = $item->getElement($element->identifier);
  }
}

Далее мы можем работать с этим элементом как с обьектом. Тоесть мы можем обратится к любой своей функции в этом элементе. Если у нас есть функция в элементе "myelement" которая по запросу возвращает нам значение текстового поля "text"

Код
	public function _getText(){

return  $this->_data->get('text');

}

то мы можем, в нашем плагине, получить это значение

Код
$text = $myelement->_getText()
*

vaa20003

  • Новичок
  • 7
  • 0 / 0
Попытался использовать плагин пинга.
Вот что вылазит:
PingService: http://ping.blogs.yandex.ru/RPC2 - <-1> - HTTP/1.0 400 Bad Request
PingService: http://api.my.yahoo.com/RPC2 - <-1> - HTTP/1.0 303 See Other
Я так понимаю, что это ошибки.
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
Попытался использовать плагин пинга.
Вот что вылазит:
PingService: http://ping.blogs.yandex.ru/RPC2 - <-1> - HTTP/1.0 400 Bad Request
PingService: http://api.my.yahoo.com/RPC2 - <-1> - HTTP/1.0 303 See Other
Я так понимаю, что это ошибки.
тут нужно подбирать, какие сервисы для пинга сработают. Аналогичное наблюдается и оригинальном плагине blogping.
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

vaa20003

  • Новичок
  • 7
  • 0 / 0
Спасибо. Сам уже разобрался. В нете куча списков сервисов, которые не работают, или работают с оговорками как например http://ping.blogs.yandex.ru/RPC2   
*

playthetechno

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Подскажите пожалуйста!У меня есть компонент поиска (jxfinder), к которому ставишь плагин для ZOO и он работает. Ситуация такая!
С Zoo 2.0 все нормально, ставлю версию 2.4 (та с которой мне было бы удобно работать) компонент поиска пишет
An Error Has Occurred

Fatal error: Class 'YTable' not found in C:\AppServ\www\sputnik\plugins\finder\zoo2_items.php on line 342


в этой строчке находится:
$zooItem   = YTable::getInstance('item')->get($item->id);

Что делать? Ютемовцы наверно изменили что-то, и плагин теперь не работает :(
К тому же, работа над плагином вроде прекращена. не знаю что и делать :( помогите пожалуйста!
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
Подскажите пожалуйста!У меня есть компонент поиска (jxfinder), к которому ставишь плагин для ZOO и он работает. Ситуация такая!
С Zoo 2.0 все нормально, ставлю версию 2.4 (та с которой мне было бы удобно работать) компонент поиска пишет
An Error Has Occurred

Fatal error: Class 'YTable' not found in C:\AppServ\www\sputnik\plugins\finder\zoo2_items.php on line 342


в этой строчке находится:
$zooItem   = YTable::getInstance('item')->get($item->id);

Что делать? Ютемовцы наверно изменили что-то, и плагин теперь не работает :(
К тому же, работа над плагином вроде прекращена. не знаю что и делать :( помогите пожалуйста!
По идее под 2.5 должно быть:
$zooItem   = $this->app->table->item->get($item->id);
но там еще вылезут баги
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
*

worstinme

  • Захожу иногда
  • 82
  • 10 / 0
  • hawkeye 57 lvl.
Привет. Хочу сделать плагин для zoo, который при сохранении материала дублировал бы данные элемента в специально созданную таблицу. Начал делать плагин по инструкции в этой теме и не пойму вообще как он работает, на данном этапе я просто хочу вывести к примеру

это

Код
foreach ($item->getElements() as $elements)
{
echo $elements->getElementType().',';

}

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

ps: в настройках плагин включен, я просто взял плагин zooevents, который устанавливается вместе с ZOO разкомментировал все необходимые строки. ну и добавил функцию вывода элементов

psps. ну, кажется с базой плагин такие работает и функции нужного мне элемента выполняет корректно, а большего пока и не надо ;) но все еще интересно, куда именно выводятся результаты echo $elements->getElementType().',';    
« Последнее редактирование: 17.06.2012, 20:51:44 от worstinme »
*

alex_next

  • Захожу иногда
  • 137
  • 2 / 0
Ребят ...в планах попытаться наковырять или создать свой вариант рейтинга для zoo item-ов, суть в том что бы рейтинг высчитывался из колличества просмотров+шаров в соц сеть (при помощи кнопок соц сетей стандартных для zoo)+количества комментариев, подскажите с чего начать? Для реализации нужно создавать новое расширение для zoo или копать стоит в стандартном элементе рейтинга?
*

MetaSpirit

  • Завсегдатай
  • 1370
  • 106 / 0
  • R.A.S.Lab[.org]
подскажите с чего начать?
Для начала нарисуйте логику работы: что и откуда берется? как плюсуется? как выглядит? и т.д.
можно написать и новый, а можно и внести изменения в стандартный.
R.A.S.Lab[.org]: ZOOvirtue - корзина для ZOO, Яндекс.Карты для ZOO, ItemPanes - табы для ZOO, ZOOlendar - календарь для ZOO  и др.
Создание расширений для YOOtheme ZOO на заказ. Становитесь в очередь.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться