Новости Joomla

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
@joomlafeed#joomla #php #webdev

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

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Подскажите новичку как это сделать...
$item->id - не помогает
$this->item->id - тоже не помогает....

Уже 3 дня бьюсь....
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
До сих пор незнаю....  :(
Гуру К2 подскажите пожалуйста....
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Контроллер большой, сформулируйте вопрос конкретнее.
И вообще за каким вы полезли в контроллер, что вас там не устраивает?
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Хочу прикрутить AUP к K2. В частности сделать так, чтобы при публикации статьи пользователю начислялось определенное количество баллов.
Нашел на форуме схему http://joomlaforum.ru/index.php/topic,121359.0.html
Согласно этой теме, а также руководству для разработчиков от AUP, необходимо вставить правило вслед за выполнением пользователем действия.

Выдержка из документации для разработчика AUP:
Спойлер
[свернуть]

Как я понял /com_k2/controllers/item.php  отвечает за работу со статьями, и в частности функция
Спойлер
[свернуть]
отвечает за публикацию статьи с фронта.
Вставляю после этой функции правило AUP:

$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ( file_exists($api_AUP))
{
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'function_name', '', 'reference_key');
}

Вместо 'reference key' хочу использовать id статьи, чтобы баллы начислялись за публикацию каждой статьи только один раз.
И НЕ начислялись за редактирование.

Когда используется просто запись 'reference_key', происходит начисление баллов только за публикацию(сохранение) только одной статьи. За вторую и последующие статьи этого автора баллы уже не начисляются. В таблицу AUP записывается строка reference_key.

Хочу вместо него подставить id статьи, тогда в графу должно записываться для каждой статьи свое значение. И, соответственно, начисление баллов будет происходить за публикацию каждой статьи, а за редактирование баллы начислять не будут.

Вот  ^-^ задумка такая ^-^, только указанными в первом сообщении способами id статьи не определяется ((((. В таблицу AUP ничего не записывается ((( или записывается 0 (((

*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Если бы вы глянули в код контроллера повнимательнее, то сосредоточились бы всё же на модели item.

А в модели в функции save мы имеем событие плагина, и даже не одного

Код
		$dispatcher->trigger('onAfterK2Save', array(&$row, $isNew));
if(K2_JVERSION == '16') {
$dispatcher->trigger('onContentAfterSave', array(&$row, $isNew));
}
else {
$dispatcher->trigger('onAfterContentSave', array(&$row, $isNew));
}

Следовательно незачем делать хаки в контроллер или в модель.

В плагине id материала вы получите как $row->id
Признак $isNew поможет вам определить, происходит ли создание нового материала или редактирование существующего.
« Последнее редактирование: 04.07.2012, 19:13:42 от SDKiller »
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
SDKiller, я еще только начинающий... И разбираюсь и учусь  ^-^
Версия K2 v2.5.7

10 раз прочитал, пока не врубился (((

Можно немного подробнее? Ну, или попроще  ^-^ Для чайников, так сказать  ^-^
« Последнее редактирование: 04.07.2012, 19:52:18 от VIKING21 »
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Создайте плагин - либо группы content либо группы k2 (если предполагается работать только с материалами К2 - лучше последний).

Примеры плагинов можете посмотреть в папке plugins

Вся ваша логика будет в соответствующей функции плагина:

для плагина группы k2 - onAfterK2Save(&$row, $isNew)

для плагина группы content - в зависимости от версии Joomla onContentAfterSave или onAfterContentSave

В функцию из модели передаются объект сохраняемого материала и признак $isNew
(это уже предусмотрено, так что ваша задача только - написать, установить и опубликовать плагин)

*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Спасибо :) Теперь понятнее... Сейчас попробую и отпишусь  ^-^
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Плагин первый раз писать буду, так что займет немного больше времени  ^-^

Насколько я понял, нужно чтобы в плагине была следующая функция? :

Код
function onAfterK2Save(&$row, $isNew) {
$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ( file_exists($api_AUP))
{
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', '$row->id');
}
}
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Да.
Можете добавить условие, если я правильно понял ваши потребности

Код
$app = JFactory::getApplication();
if ($app->isSite() && $isNew) {
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}

Но это в общем случае сработает корректно если функция newpoints объявлена как public static
Иначе может потребоваться создать экземляр класса и вызывать функцию так
Код
$helper = new AlphaUserPointsHelper();
$helper->newpoints( 'plgaup_takeoutpublicitem', '', $row->id);

Впрочем попробуйте сначала как написано в мануале.

p.s. Не надо брать в кавычки $row->id
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Вот я и написал свой первый плагин!  ^-^
Плагин состоит из 2 файлов: plugin.php и plugin.xml

Содержимое файла plugin.php

Код
<?php

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

/**
 * MY K2 Plugin.
 */

// Load the K2 Plugin API
JLoader::register('K2Plugin', JPATH_ADMINISTRATOR.DS.'components'.DS.'com_k2'.DS.'lib'.DS.'k2plugin.php');

// Initiate class to hold plugin events
class plgK2MY1 extends K2Plugin {

// Some params
var $pluginName = 'MY1';
var $pluginNameHumanReadable = 'MY1 K2 Plugin';

function plgK2Example( & $subject, $params) {
parent::__construct($subject, $params);
}

function onK2PrepareContent( &$item, &$params, $limitstart) {
$mainframe = &JFactory::getApplication();
//$item->text = 'It works! '.$item->text;
}

function onAfterK2Save(&$row, $isNew) {
$mainframe = &JFactory::getApplication();
$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ( file_exists($api_AUP))
{
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}
return true;
}


} // END CLASS


Сделал просто по примеру плагина k2 example.

Думаю несколько лишнего оставил...
По идее вот эти параметры я в функции не использую
Код
// Some params
var $pluginName = 'MY1';
var $pluginNameHumanReadable = 'MY1 K2 Plugin';

А также не понял для чего вот это:
Код
function onK2PrepareContent( &$item, &$params, $limitstart) {
$mainframe = &JFactory::getApplication();
//$item->text = 'It works! '.$item->text;
}


SDKiller огромное Вам спасибо!  *DRINK*
Плагин заработал, баллы начисляются только за создание новой статьи, а за редактирование не начисляются...
В таблицу AUP записывается ID статьи. И все это БЕЗ ХАКОВ!  :D
Осталось только привести плагин в правильный вид, убрав все лишнее  ^-^
« Последнее редактирование: 05.07.2012, 10:50:33 от VIKING21 »
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Цитировать
А также не понял для чего вот это:
Код
function onK2PrepareContent( &$item, &$params, $limitstart) {

Это событие вызывается при подготовке контента к выводу на фронте.

P.S. Всё же посмотрите условие, которое я приводил выше.
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Цитировать
Сделал просто по примеру плагина k2 example.

Думаю несколько лишнего оставил...
По идее вот эти параметры я в функции не использую
Код
// Some params
var $pluginName = 'MY1';
var $pluginNameHumanReadable = 'MY1 K2 Plugin';

А также не понял для чего вот это:
Код
function onK2PrepareContent( &$item, &$params, $limitstart) {
$mainframe = &JFactory::getApplication();
//$item->text = 'It works! '.$item->text;
}


Видимо и правда это было лишним...
Удалил код из плагина, ничего не изменилось.
Теперь плагин выглядит так:
Код
<?php

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


// Load the K2 Plugin API
JLoader::register('K2Plugin', JPATH_ADMINISTRATOR.DS.'components'.DS.'com_k2'.DS.'lib'.DS.'k2plugin.php');

// Initiate class to hold plugin events
class plgK2MY2 extends K2Plugin {


function plgK2Example( & $subject, $params) {
parent::__construct($subject, $params);
}

function onAfterK2Save(&$row, $isNew) {
$mainframe = &JFactory::getApplication();
$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ( file_exists($api_AUP))
{
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}
return true;
}
}


Сейчас пробую условие...
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Правильно ли я понял, что вместо:

Код
function onAfterK2Save(&$row, $isNew) {
$mainframe = &JFactory::getApplication();
$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ( file_exists($api_AUP))
{
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}
return true;
}

Нужно сделать:

Код
	function onAfterK2Save(&$row, $isNew) {
$app = JFactory::getApplication();
                $api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ($app->isSite() && $isNew)
{
require_once ($api_AUP);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}
return true;
}

Если так, то в нижнем виде тоже все работает  ^-^
Только визуально во время работы разницы не видно...
А функционально в чем отличие понять не могу?

PS Еще момент, что баллы начисляются за сохранение статьи... А как можно сделать начисление за публикацию?
Т.е. чтобы при сохранении статьи без публикации баллы не начислялись. За публикацию статьи - начислялись только один раз, а если пользователь снимет с публикации статью, а потом по новой опубликует, то баллы повторно не начисляются...
« Последнее редактирование: 05.07.2012, 11:44:08 от VIKING21 »
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Не работал с AlphaUserPoints, поэтому блок проверки попробуйте реализовать самостоятельно

Код

function onAfterK2Save(&$row, $isNew) {
$app = JFactory::getApplication();
                $api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
                require_once ($api_AUP);
if ($app->isSite() )
{
if ($row->published == 1) {
                                if ($isNew) {
                  AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
                                } else {
                                        ...
                                        тут проверка, были ли ранее начислены баллы за этот $row->id, если не были - также вызываем функцию newpoints
                                        ...
                                }
                        }

}
return true;
}

*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
А по предыдущему сообщению подскажите пожалуйста в чем разница ^-^

Код
 $mainframe = &JFactory::getApplication();
$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ( file_exists($api_AUP))

и

Код
$app = JFactory::getApplication();
$api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
if ($app->isSite() && $isNew)
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
$app->isSite() - проверяем фронт или админка (вам же требовалось при создании материала на фронте начислять)

$isNew - признак нового материала
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Точно!  ^-^ Спасибо за разъяснения  *DRINK*
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Ура!  ^-^
Сделал так:
   
Код
function onAfterK2Save(&$row, $isNew) {
$app = JFactory::getApplication();
                $api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
                require_once ($api_AUP);
if ($app->isSite() )
{
if ($row->published == 1) {
                                if ($isNew) {
                  AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
                                } else {
                                              $array = AlphaUserPointsHelper:: getUserInfo ( $keyreference );
      $keysearch = array_search($row->id, $array);
      if ($keysearch == FALSE) {
                                                                         AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
                                                                                       }
                                }
                        }

}
return true;
}


} // END CLASS

Пока все сработало. Создаем неопубликованную статью - не начисляется, потом публикуем её - начисляется, создаем опубликованную статью - начисляется, повторная публикация - не начисляется.

Как Вам, SDKiller? Нормальный код?
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Я не знаю API AlphaUserPoints, поэтому ничего не могу сказать насчёт getUserInfo ( $keyreference )

Сделайте строгую проверку на false (3 знака равенства), иначе результат будет ошибочно интерпретироваться если будет возвращён нулевой индекс массива.

Код
if ($keysearch === false) {

можно вообще сократить

Код
if (array_search($row->id, $array) === false) {
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Выдержка из API AlphaUserPoints
Спойлер
[свернуть]

Почему то после публикации и теста плагина не могу зайти в админку...
Пишет: У вас нет доступа к панели управления сайтом.

Сейчас попробую перезагрузиться и откатить... Еще тестирую...

PS Сократил, спасибо  ^-^
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
После перезагрузки доступ в админку восстановился. Так и не понял из за чего произошло...
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
getUserInfo ( $keyreference );

Я так понимаю что в качестве $keyreference должен быть id пользователя

А где вы объявляете эту переменную?


И второе - а вы уверены что по getUserInfo вы получаете именно массив записей баллов пользователя а не вообще всю информацию его профиля в AUP?
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
1) Когда ставлю тройное равенство так:
Код
if (array_search($row->id, $arraykeyreference) === FALSE) {
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}

То условие
Код
$arraykeyreference = AlphaUserPointsHelper:: getUserInfo ( $keyreference );
 if (array_search($row->id, $arraykeyreference) === FALSE) {
             AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
перестает работать. Т.е. при создании опубликованной статьи баллы начисляются, а если создать неопубликованную и потом опубликовать, то начисление баллов не происходит.

Когда ставлю двойное равенство - все работает...

2)В качестве keyreference используется $row->id, его значение записывается в таблицу AUP_details в столбец keyreference. В той же таблице есть столбец referreid.
Переменную сам нигде не объявляю...  :(

А вот тут
Цитировать
И второе - а вы уверены что по getUserInfo вы получаете именно массив записей баллов пользователя а не вообще всю информацию его профиля в AUP?
надо подумать... Совсем не уверен. Скорее всего так и есть ... :(
« Последнее редактирование: 05.07.2012, 15:13:05 от VIKING21 »
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Вот это вся документация для разработчиков API AUP.
Спойлер
[свернуть]
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Попробовал так
Код
else {
$referreid = AlphaUserPointsHelper::getAnyUserReferreID($userID);        // Определяем переменную $referreid для текущего пользователя
        $arraykeyreference = AlphaUserPointsHelper:: getUserInfo ('',$referreid->keyreference);        // Выбираем содержимое столбца keyreference для текущего пользователя в массив
        if (array_search($row->id, $arraykeyreference) == FALSE) {
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', '', $row->id);
}
Вроде все работает...  Но как посмотреть что попадает в массив $arraykeyreference незнаю  :( Может подскажете?

И все-таки почему то условие не работает при тройном знаке равенства  :(
так
Код
 if (array_search($row->id, $arraykeyreference) === FALSE) 
*

SDKiller

  • Moderator
  • 2705
  • 329 / 5
  • ...ergo sum
Цитировать
Но как посмотреть что попадает в массив

для этого есть var_dump()

Сдаётся мне, вам надо определиться что к чему привязывается - баллы к пользователю, баллы к материалу, материал к пользователю...
Вы сейчас жонглируете разными объектами и результат, который получаете, непредсказуем.

Далее - если использовать в качестве reference просто id - возможны совпадения (пользователь с тем же id, ещё какое-нибудь событие для начисления баллов с таким же id).
Думаю нужен префикс, чтобы однозначно гарантировать уникальность.

Например конструкция 'k2_item_id_'.$row->id даст нам для материала 42 референс следующего вида k2_item_id_42
И тогда его точно не спутаешь ни с пользователем 42 ни ещё с чем-нибудь с id 42.

А вообще - смотрите в таблицах AUP что куда пишется, тогда и апи будет понятнее
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Только по таблицам и разбираюсь  ^-^
ОГРОМЕННОЕ СПАСИБО!  *DRINK*
SDKiller, благодаря вам все оказывается несложно, когда начинаешь понимать  ^-^. Теперь все условия работают.

Выкладываю полный текст плагина:
Код
// no direct access
defined('_JEXEC') or die ('Restricted access');

// Загрузка K2 Plugin API
JLoader::register('K2Plugin', JPATH_ADMINISTRATOR.DS.'components'.DS.'com_k2'.DS.'lib'.DS.'k2plugin.php');

// Initiate class to hold plugin events
class plgK2K2_AUP_topi_plugin extends K2Plugin {


function plgK2K2_AUP_topi_plugin( & $subject, $params) {
parent::__construct($subject, $params);
}

function onAfterK2Save(&$row, $isNew) {
        $api_AUP = JPATH_SITE.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php';
        require_once ($api_AUP);
if ($row->published == 1) {
                    $aupid = AlphaUserPointsHelper::getAnyUserReferreID($row->created_by);
AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', $aupid, 'k2_item_id_'.$row->id);
                   }
return true;
}
} // END CLASS

Функционал:
1) При создании опубликованной статьи баллы начисляются пользователю;
2) При создании неопубликованной статьи баллы не начисляются;
3) При публикации статьи автором, баллы начисляются автору;
4) При публикации статьи администратором (из админки - ранее не учел этот случай), баллы начисляются автору статьи;
5) За повторную публикацию баллы не начисляются никому (Оказывается AUP сам проверяет уникальность поля keyreference в таблице).

Спасибо за совет
Код
 'k2_item_id_'.$row->id 
Сделал поле уникальным  ^-^

Теперь осталось допилить напильником  ^-^

В админке работает только если публикуешь в режиме редактирования статьи. Т.е. когда в списке статей нажимаешь опубликовать, баллы не начисляются. В принципе понятно, что при публикации через список статей сохранения статьи не происходит, а условие работает на сохранение...
Так вот, может быть возможно добавить еще какое-то условие, чтобы при публикации статьи из списка статей в админке (нажатием кнопки опубликовать), баллы начислялись бы также автору...?
По логике понимаю, что при нажатии на кнопку опубликовать выполняется функция, которая изменяет содержимое поля published в таблице K2_items.
Только не знаю как оно называется и можно ли на него ссылаться в плагине?

*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
SDKiller, помогайте, с меня пиво  *DRINK*
Осталась пара вопросов  ^-^

1.
Цитировать
В админке работает только если публикуешь в режиме редактирования статьи. Т.е. когда в списке статей нажимаешь опубликовать, баллы не начисляются. В принципе понятно, что при публикации через список статей сохранения статьи не происходит, а условие работает на сохранение...
Так вот, может быть возможно добавить еще какое-то условие, чтобы при публикации статьи из списка статей в админке (нажатием кнопки опубликовать), баллы начислялись бы также автору...?
По логике понимаю, что при нажатии на кнопку опубликовать выполняется функция, которая изменяет содержимое поля published в таблице K2_items.
Только не знаю как оно называется и можно ли на него ссылаться в плагине?

2. Организовал списание (начисление отрицательного числа) баллов за публикацию статьи.
Как установить условие, что если баллов у пользователя недостаточно (за это отвечает код
Код
if (AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', $aupid, 'k2_item_id_'.$row->id, '', '', true))

то статья не публикуется, а просто сохраняется (даже если радиокнопка опубликовать установлена на "Да")
А если достаточно, то сохраняется и публикуется.
Мои мысли: Делать это как вы и советовали - плагином. Встроить его на событие типа "проверка перед сохранением материала". Проверять, и если баллов недостаточно, то сохранять, но не публиковать. А если достаточно, то сохранять и публиковать.
Думаю так  ^-^, а как в коде прописать пока незнаю ))) Подскажите как это в коде реализовать...


PS По пункту 2.
Т.к. написанный плагин срабатывает по событию onAfterK2Save (т.е. уже после сохранения данных формы, и публикации в том числе), то думаю можно добавить в него запрос (только не знаю как называется  ^-^ JQuery или JsetQuery или еще как-то...) который при выполнении условия установит значение поля published в таблице items как "1", а при невыполнении условия выполнится другой запрос, который установит значение поля "0"... Только вот как этот запрос выглядит...
« Последнее редактирование: 09.07.2012, 00:37:35 от VIKING21 »
*

VIKING21

  • Осваиваюсь на форуме
  • 38
  • 0 / 0
Ура! Может кому пригодится, пункт 2 реализовал!
Код
if (AlphaUserPointsHelper::newpoints( 'plgaup_takeoutpublicitem', $aupid, 'k2_item_id_'.$row->id, '', '', true)); /*проверяем условие*/		
{ /*Если выполняется - то:*/
$db =& JFactory::getDBO();
$sql = "UPDATE K2_items SET published=1 WHERE id=$row->id";
$db->setQuery($sql);
if(!$db->query()){
echo __LINE__.$db->stderr();}
}    /*Если не выполняется - то:*/
$a = $row->id;
$db =& JFactory::getDBO();
$sql = "UPDATE K2_items SET published=0 WHERE id=$row->id";
$db->setQuery($sql);
if(!$db->query()){
echo __LINE__.$db->stderr();}
« Последнее редактирование: 09.07.2012, 13:51:05 от VIKING21 »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Автоматическая дата снятия с публикации материала

Автор kozhenevsky

Ответов: 10
Просмотров: 4309
Последний ответ 17.11.2023, 08:08:49
от Vastriet
Разные страницы с результатами поиска на одном сайте com_k2

Автор NIKOLY

Ответов: 0
Просмотров: 2158
Последний ответ 22.08.2023, 15:44:05
от NIKOLY
В Joomla! 3.9.1 в к2 не меняется порядок расположения материала

Автор sergspb

Ответов: 0
Просмотров: 826
Последний ответ 12.06.2021, 15:20:52
от sergspb
Ошибка ПРИ создании материала В К2 - РЕШЕНО

Автор korchaga

Ответов: 1
Просмотров: 927
Последний ответ 28.12.2020, 03:21:46
от korchaga
Ошибка components\com_k2\views\itemlist\view.html.php on line 485

Автор NIKOLY

Ответов: 5
Просмотров: 1132
Последний ответ 09.12.2020, 16:56:01
от NIKOLY