Новости 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 Гость просматривают эту тему.
  • 27 Ответов
  • 1629 Просмотров
*

x_files_1

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
Перехватить ошибку
« : 03.03.2014, 07:59:53 »
Добрый день. Сразу к сути. Таблицы в базе данных связаны. И при удалении записи которая используется в другой таблице - соответственно Joomla3 выдает ошибку о нарушении целостности бд. НО... как сделать эту ошибку дружелюбную - без описания sql запроса и так далее. Просто хочется вывести сообщение о том что "удаляемая запись используется в другой таблице". Как реализовать это?
*

x_files_1

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
Re: Перехватить ошибку
« Ответ #2 : 03.03.2014, 08:10:25 »
http://www.php.net/manual/ru/language.exceptions.php

Благодарю за описание exceptions. Где именно то отловить ошибку целостности? буду рад примеру связанному с данной ситуацией.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Re: Перехватить ошибку
« Ответ #3 : 03.03.2014, 08:13:00 »
Ошибку отлавливать нужно там, где удаляется запись, примеров масса в самом коде Joomla. Если у вас не 3, то там есть свои функции вывода ошибок, которые в 3 устаревают и скоро исчезнут из фреймворка.
*

x_files_1

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
Re: Перехватить ошибку
« Ответ #4 : 03.03.2014, 08:32:53 »
Ошибку отлавливать нужно там, где удаляется запись, примеров масса в самом коде Joomla. Если у вас не 3, то там есть свои функции вывода ошибок, которые в 3 устаревают и скоро исчезнут из фреймворка.

Прошу прощения за наглость) А можно все таки на пальцах и с кодом пример! не могу допереть куда что вставлять. Брал за основу своего компонента один из учебных компонентов HelloWorld. Тут в коде даже нет функции удаления(
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Re: Перехватить ошибку
« Ответ #5 : 03.03.2014, 08:50:06 »
Как вы удаляете запись? И какая Joomla у вас?
*

x_files_1

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
Re: Перехватить ошибку
« Ответ #6 : 03.03.2014, 08:56:21 »
Как вы удаляете запись? И какая Joomla у вас?
Если быть честным то не знаю. В тех исходниках которые я взял за основу именно функции удаления нет. Такое ощущение что запускается delete от родительского класса и все!

Joomla 3.2.2
« Последнее редактирование: 03.03.2014, 09:02:35 от x_files_1 »
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Re: Перехватить ошибку
« Ответ #7 : 03.03.2014, 09:00:43 »
Ну тогда боюсь я не знаю как вам помочь, посмотрите контроллеры, там должно быть удаление, может в родительских контроллерах, тогда можно переписать функцию удаления в дочерний и сделать ее по своему.
*

x_files_1

  • Осваиваюсь на форуме
  • 31
  • 0 / 0
Re: Перехватить ошибку
« Ответ #8 : 03.03.2014, 09:04:20 »
Ну тогда боюсь я не знаю как вам помочь, посмотрите контроллеры, там должно быть удаление, может в родительских контроллерах, тогда можно переписать функцию удаления в дочерний и сделать ее по своему.
Тогда очередной глупый вопрос - функция на удаления должна быть в контроллере от редактирования одной записи или от полного списка (таблицы)?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Re: Перехватить ошибку
« Ответ #9 : 03.03.2014, 10:19:07 »
Скорее всего  в контроллере списка.
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #10 : 13.05.2014, 16:25:57 »
вопрос по теме:
дано:
Код: php
//контроллер:
function delcomment()
    {
        // Clean page cache if System Cache plugin is enabled
        if(JPluginHelper::isEnabled('system', 'cache'))
        {
            $this->cleancache();
        }
            $model = $this->getModel('entry');

            if(!$model->delcomment())
            {
                $msg = JText::_('COM_CONTENTS_ERROR_COMMENT_COULD_NOT_BE_DELETED');
                $type = 'error';
            }
            else
            {
                $msg = JText::_('COM_CONTENTS_COMMENT_DELETED');
                $type = 'success';
            }
}

//модель:
function delcomment()
    {
        $row = $this->getTable('Comments', 'ContentsTable');

        if(!$row->delete($this->_id))
        {
            $this->setError($this->_db->getErrorMsg());
            return false;
        }

        return true;
    }
//Таблица:
class ContentsTableComments extends JTable
{
        public $id = null;
        /**
         * Class constructor
         * @param Object $db (database link object)
         */
        function __construct( &$db )
        {
                parent::__construct( '#__contents_comments', 'id', $db );
        }

        /**
         * Method for loading data into the object field
         * @param Array $array (Featured in the field of data)
         * @param String $ignore
         * @return Boolean result
         */
        public function bind( $array, $ignore = '')
        {
                $users = JFactory::getUser();
                if ( empty( $array['created'] ) ) {
                        $array['created'] = date( 'Y-m-d H:i:s' );
                }
                if ( empty( $array['lastip'] ) ) {
                        $array['lastip'] = $_SERVER["REMOTE_ADDR"];
                }
                if ( empty( $array['username'] ) ) {
                        $array['username'] = $users->get('username');
                }

                return parent::bind( $array, $ignore );
        }

}

собственно вопрос, при удалении записи даже если её нет в бд, выводит положительный результат.
как всё таки поймать в модели ошибку "$this->_db->getErrorMsg()"
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Перехватить ошибку
« Ответ #11 : 13.05.2014, 16:57:52 »
А что выдаст $this->_db->getNumRows()? Ошибка то не будет, если записи такой нету, так что тут надо по количеству возвращаемых записей проверять. Должно вернутся 0.
интернет-блог: http://websiteprog.ru
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #12 : 13.05.2014, 17:55:03 »
А что выдаст $this->_db->getNumRows()? Ошибка то не будет, если записи такой нету, так что тут надо по количеству возвращаемых записей проверять. Должно вернутся 0.
попробовал вывести
Код: php
var_dump($this->_db->getNumRows());
ответ: NULL
в $this->_id передается значение
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Перехватить ошибку
« Ответ #13 : 13.05.2014, 18:04:47 »
http://ссылка вырезана, так как домен распространяет вирусы/blog/joomla/rabota-s-bazoj-dannykh-v-joomla-2-5 можете почитать методы которые предоставляет класс для работы с БД!
Конкретно вам можно сделать так:
Код: php
$db = JFactory::getDbo();
$db->setQuery( 'DELETE  FROM #__table1 WHERE id=8' )->execute();
if(!$db->getAffectedRows()){ echo 'Ничего не удалено!';  }
echo $db->getAffectedRows();
$db->getAffectedRows() покажет количество строк затронутые последним запросом!

Ещё вариант: вы можете сначала проверить или запись существует через SELECT * ...
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #14 : 13.05.2014, 18:06:53 »
...
сейчас посмотрим, я копал сейчас в сторону JTable
и запрос идет через query а хотелось бы реализовать стандартным методом JTable
« Последнее редактирование: 13.05.2014, 18:21:20 от Hishchnik »
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Перехватить ошибку
« Ответ #15 : 13.05.2014, 18:16:19 »
сейчас посмотрим, я копал сейчас в сторону JTable
Как вариант:

Код: php
$id = 10;
$table->load( $id );
if ( !empty( $table->id ) ) {
echo 'Запись не найдена';
} else {
$table->delete( $id );
}
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #16 : 13.05.2014, 18:37:30 »
если реализовать на проверку существования записи, и последующего удаления:

if($row->load($this->_id)){
        
$row->delete($this->_id);
        return 
true;
        }
        return 
false;

то можно сделать вывод сообщения на удален, и отсутствия записи,
а может ли конструкция $row->delete($this->_id) выдать ошибку
или она всегда отработает, (одно условие "$this->_id" всегда существует)
?
« Последнее редактирование: 13.05.2014, 18:49:33 от Hishchnik »
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Перехватить ошибку
« Ответ #17 : 13.05.2014, 18:54:11 »
может, в случае ошибки метод delete вернет false и вызовет исключение. Вы же исходники смотрите, там все есть..
интернет-блог: http://websiteprog.ru
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #18 : 13.05.2014, 18:59:47 »
может, в случае ошибки метод delete вернет false и вызовет исключение. Вы же исходники смотрите, там все есть..
я имел в виду JTable класс стандартная функция delete
Спойлер
[свернуть]
« Последнее редактирование: 13.05.2014, 19:05:12 от Hishchnik »
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Перехватить ошибку
« Ответ #19 : 13.05.2014, 19:06:42 »
метод delete класса jtable и я про него.
Вобще они в разных версиях разные. Лучше конечно ошибки ловить используя jdatabase класса методы
« Последнее редактирование: 13.05.2014, 19:15:31 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #20 : 13.05.2014, 19:19:05 »
то бишь то, что предложил Istaan http://joomlaforum.ru/index.php/topic,289883.msg1458410.html#msg1458410
остановлюсь на такой вариации:
Код: php
function delentry()
    {
        $row = $this->getTable('Items', 'ContentsTable');
        if($row->load($this->_id)){
        $row->delete($this->_id);
        return true;
        }
        return false;

    }

так как запросы, и работа с бд в основном в контроллере выполняется, в модель не хочу с прямыми запросами лезть
мой вопрос закрыт.
« Последнее редактирование: 13.05.2014, 19:29:49 от Hishchnik »
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Перехватить ошибку
« Ответ #21 : 13.05.2014, 19:23:41 »
ага комбинируйте getAffectedRows() и getErrorNum() для проверки, так оно надежней имхо
upd вот только в версиях 3 и выше getErrorNum() помечен как depricated и рекомендовано использовать обработку исключений, хотя вроде бы еще не выпилили..
« Последнее редактирование: 13.05.2014, 19:33:39 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Перехватить ошибку
« Ответ #22 : 13.05.2014, 19:41:49 »
в модель не хочу с прямыми запросами лезть
Не понял юмора, в модели же и должны быть запросы по логике а не в котроллере )
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #23 : 13.05.2014, 19:47:07 »
Не понял юмора, в модели же и должны быть запросы по логике а не в котроллере )
путаю? хм.... ведь для модели JTable зачем там quote.....
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Перехватить ошибку
« Ответ #24 : 13.05.2014, 19:50:19 »
путаю? хм.... ведь для модели JTable зачем там quote.....
Ну JTable это же не модель, это класс для работы с записью таблицы как с объектом, а вообще по стандартам J в модели работа с базой, в контроллере, запуск задач, подготовка данных, а уж в виде отображение!
*

Hishchnik

  • Захожу иногда
  • 253
  • 19 / 1
  • ©
Re: Перехватить ошибку
« Ответ #25 : 13.05.2014, 19:56:53 »
Ну JTable это же не модель, это класс для работы с записью таблицы как с объектом, а вообще по стандартам J в модели работа с базой, в контроллере, запуск задач, подготовка данных, а уж в виде отображение!
благодарю за разъяснения
чем больше изучаю J тем больше понимаю, что я её вообще не знаю :-(
1. Помог? Благодарность выражается кнопочкой "+" ;)
2. Остановите землю я сойду!
3.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: Перехватить ошибку
« Ответ #26 : 13.05.2014, 19:59:57 »
благодарю за разъяснения
чем больше изучаю J тем больше понимаю, что я её вообще не знаю :-(
Ну а вы как думали?) Знания за пяти минут не приходят ) Я уже более 5 лет с Joomla работаю, потому и имею какой то багаж знаний, но все равно есть места в которых плаваю ))
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Перехватить ошибку
« Ответ #27 : 13.05.2014, 20:03:37 »
Кстатии вот такой вариант более универсальный по идее:
Код: php
try 
{
   ...
   $row->delete()
   if (!$this->_db->getAffectedRows())
        throw new RuntimeException("Запись не найдена");
   ...
}
catch (RuntimeException $e)
{
    echo $e->getMessage();
}  

если возникнет ошибка в  базе в любом случае будет вызвано исключение
« Последнее редактирование: 13.05.2014, 20:10:08 от zomby6888 »
интернет-блог: http://websiteprog.ru
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Как исправить ошибку Only variables should be assigned by reference?

Автор nypreh

Ответов: 4
Просмотров: 42897
Последний ответ 16.01.2013, 16:34:56
от b2z