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

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Код
$this->input->post->get
Разве post-> не лишнее?
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
$data = $app->input->post->get( 'jform', array(), 'array' );
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
версия Joomla у меня 2.5, в итоге при отправке данных ошибка Fatal error: Call to a member function get() on a non-object
ругается на строку
Код
 $data = $this->input->post->get( 'jform', array(), 'array' );
Потому что у вас не объявлен объект JInput Вот и ругается!

Добавьте в вашем контроллере строки выделенные синим:
class FormControllerForm extends JControllerForm
{   
       private $input;
   function __construct( $config = array() )
   {
      $this->view_list = 'result';
      parent::__construct( $config );
      $this->input = JFactory::getApplication()->input;
   }
....
}
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Потому что у вас не объявлен объект JInput Вот и ругается!

Добавьте в вашем контроллере строки выделенные синим:
class FormControllerForm extends JControllerForm
{   
       private $input;
   function __construct( $config = array() )
   {
      $this->view_list = 'result';
      parent::__construct( $config );
      $this->input = JFactory::getApplication()->input;
   }
....
}

большое спасибо, как всегда помогли)
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Istaan, а про это что думаете?
возникла ещё одна проблемка, хотел сделать валидацию формы не на стороне сервера, а на стороне клиента, добавил JHtml::_( 'behavior.formvalidation' ); но при нажатии на кнопку открывается страница с каракулями...привожу код ниже, что я сделал не то?
Код
<?php

defined( '_JEXEC' ) or die;
?>
<div class="item-page">
<h1>Форма</h1>

<form action="<?php echo JRoute::_( 'index.php?view=form' )?>" method="post" class="form-validate">

<div class="control-group form-inline">
            <div class="control-label"><?php echo $this->form->getLabel( 'fam' ); ?></div>
            <div class="controls"><?php echo $this->form->getInput( 'fam' ); ?></div>
        </div>

<div class="control-group form-inline">
            <div class="control-label"><?php echo $this->form->getLabel( 'name' ); ?></div>
            <div class="controls"><?php echo $this->form->getInput( 'name' ); ?></div>
        </div>


<input type="hidden" name="task" value="form.save" />
        <input type="submit" value="Отправить" />
        <?php echo JHtml::_( 'behavior.formvalidation' ); ?>
</form>
</div>
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
После: <?php echo JHtml::_( 'behavior.formvalidation' ); ?>
Добавьте: <?php echo JHtml::_( 'form.token' ); ?>
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
После: <?php echo JHtml::_( 'behavior.formvalidation' ); ?>
Добавьте: <?php echo JHtml::_( 'form.token' ); ?>
уже добавлял, но всё равно проверка идёт на стороне сервера...ничего не понимаю
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
У вас ошибка происходит уже в контроллере т.к "...Declaration of FormControllerForm::allowSave().." выводитcя . Есть такое подозрение что в методе save не происходит банально редирект попробуйте добавить $this->redirect(); перед  return false;
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
уже добавлял, но всё равно проверка идёт на стороне сервера...ничего не понимаю
Код модели покажите и код контроллера из controllers/form.php

И попробуйте менять кодировку в браузере, может узнаете что там за каракули
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Код модели покажите и код контроллера из controllers/form.php

И попробуйте менять кодировку в браузере, может узнаете что там за каракули
код модели
Код
<?php

defined( '_JEXEC' ) or die;

jimport( 'joomla.application.component.modeladmin' );


class FormModelForm extends JModelAdmin
{

private $input;


public function __construct( $config = array() )
{
parent::__construct( $config );
$this->input = JFactory::getApplication()->input;
}


public function getForm( $data = array(), $loadData = true )
{
$form = $this->loadForm( '', 'form', array( 'control' => 'jform', 'load_data' => $loadData ) );
if ( empty( $form ) ) {
return false;
}
return $form;
}


public function getTable( $type = 'messages', $prefix = 'Table', $config = array() )
{
return JTable::getInstance( $type, $prefix, $config );
}


protected function loadFormData()
{
$data = JFactory::getApplication()->getUserState( 'com_form.edit.form.data', array() );
if ( empty( $data ) ) {
$data = $this->getItem();
}
return $data;
}


public function save( $data )
{

    $rn =  "\r\n";
$adm = array_pop(JAccess::getUsersByGroup(8));
$date = JFactory::getDate();


    $body .= 'Уважаемый администратор!'. $rn;
$body .= 'текст:'. $rn;

    
    $params = JComponentHelper::getParams( 'com_form' );
    
    $recipient = $params->get( 'recipient' );
    
    $subject = $params->get( 'subject' );
    
    $table = $this->getTable( 'messages' );
    
    $archiveData = array(
        'subject' => 'Сообщение,
'user_id_from' => $adm,
'user_id_to' => $adm,
'folder_id' => '0',
'date_time' => $date->toMySQL(),
        'message' => $body
    );
    
    $table->bind( $archiveData );
    
    if ( $table->store() ) {
        return true;
    }
    
    return false;
}

}
код контроллера
Код
<?php

defined( '_JEXEC' ) or die;

jimport( 'joomla.application.component.controllerform' );


class FormControllerForm extends JControllerForm
{

private $input;

function __construct( $config = array() )
{
$this->view_list = 'result';
parent::__construct( $config );
$this->input = JFactory::getApplication()->input;
}

public function allowSave()
{
return true;
}


public function save( $key = null, $urlVar = null )
{
    
    $app = JFactory::getApplication();
    $data = $this->input->post->get( 'jform', array(), 'array' );
    $model = $this->getModel();
    $form = $model->getForm( $data, false );
    $validData = $model->validate( $form, $data );
    $recordId = $this->input->getInt( $urlVar );
    $context = "$this->option.edit.$this->context";
    $session = JFactory::getSession();
    if ( (int)$session->get( 'mycaptcha' )!= (int)$data['mycaptcha'] ) {
        $app->setUserState( $context . '.data', $validData );
        $this->setError( JText::sprintf( 'Неверная сумма цифр', $this->getModel()->getError() ) );
        $this->setMessage( $this->getError(), 'error' );
        $this->setRedirect(
            JRoute::_(
                'index.php?option=' . $this->option . '&view=' . $this->view_item
                . $this->getRedirectToItemAppend( $recordId, $urlVar ), false
            )
        );
 
        return false;
    }
    return parent::save( $key, $urlVar );
}
}
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
уверенны что CAPTCHA совпадает?
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
уверенны что CAPTCHA совпадает?
абсолютно уверен, ибо если ввести неверную, то будет ошибка, а если всё заполнить верно, то данные отправляются
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Ещё раз всем привет)
возникла новая трудность, точнее делаю другой компонент, и вот в чём проблемка:
допустим, есть select меню. юзер выбрал например первый пункт, нажимает на отправку, и нужно выполнить первый кейс, и так для каждого кейса.
не пойму, как связать select и case между собой?
например select я создаю так:
Код
$arr = array(
  JHTML::_('select.option', 'one', JText::_('Первый пункт')),
  JHTML::_('select.option', 'two', JText::_('Второй пункт')),
  JHTML::_('select.option', 'three', JText::_('Третий пункт'))
);
$current = 'one';

<?php echo JHTML::_('select.genericlist', $arr, 'beta', null, 'value', 'text', $current); ?>
надеюсь понятно объяснил суть проблемы
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Цитировать
switch($selectValue){
case 'one':
break;
case 'two':
break;
.......
}
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0

простите, но это и так понятно, меня больше интересует, как именно в Joomla передать в параметр выбранный номер селекта.
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Отправить форму с этим селектором нужной странице.
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
возникла новая трудность, точнее делаю другой компонент, и вот в чём проблемка:
допустим, есть select меню. юзер выбрал например первый пункт, нажимает на отправку, и нужно выполнить первый кейс, и так для каждого кейса.
не пойму, как связать select и case между собой?

может ли кто-нибудь помочь хоть куском кода для Joomla?на чистом php то не трудно такой код сделать, можно и костылей всяких привинтить, но хотелось бы сделать по правилам всё....
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Здравствуйте!
возникла вот какая проблемка: например юзер выбирает пункт в select, получаю номер этого пункта, и заношу значение в переменную.
нужно передать эту переменную в задачу save, которая находится в контроллере form, каким образом это можно сделать?
заранее спасибо.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Если в форме, то либо $_GET, либо $_POST (JInput). Есть еще $_SESSION (JFactory::getSession()). Других способов не знаю.
юзер выбирает пункт в select, получаю номер этого пункта, и заношу значение в переменную.
Где вы это делаете?
нужно передать эту переменную в задачу save, которая находится в контроллере form, каким образом это можно сделать?
А зачем лишнюю переменную придумать?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

DaGGeR

  • Осваиваюсь на форуме
  • 36
  • 0 / 0
Где вы это делаете?
значит смотрите: делаю я это в форме, в виде компонента отображаю селект, привинтил к селекту ява скрипт, при выборе пункта из селекта пользователю показывается таблица с полями для заполнения, для каждого пункта из селекта разное количество полей.
при нажатии на отправить, выполняется задача save из файла form(который лежит в models), а именно, берутся введенные данные из всех полей, и добавляются в таблицу БД.
я получаю id выбранного селекта через пост
Код
$id = $_POST['sel'];
вот мне эту переменную и нужно передать в метод save, чтобы сделать проверку через case на то, значение каких именно полей добавлять в таблицу.
надеюсь понятно объяснил, зараннее спасибо
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Код: php-brief
$id = $_POST['sel'];
Так и получите из $_POST, как и значения других полей.
Только я обычно получаю все переменные в контроллере, а уже оттуда вызываю модель.
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться