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

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Ajaxupload
« : 01.02.2015, 20:54:08 »
Здравствуйте, использую ajaxupload, почему -то не возвращается ответ  (response) из контроллера
js код
Код
	var button = $('#download'), interval;

$.ajax_upload(button, {
action : 'index.php?option=com_apartment&task=apartment.upload',
name : 'file',
onSubmit : function(file, ext) {
// показываем картинку загрузки файла
                            
                            if (! (ext && /^(jpg|png|jpeg|JPG|PNG)$/.test(ext)) || mas.length>='5' )
                            {
                              // extension is not allowed
                               if (mas.length>='5') {$('#status').text('Вы можете загрузить не больше 5 фото!');} else
                               {$('#status').text('Поддерживаемые форматы JPG или PNG');}
                               return false;
                               $("img#load").attr("src", "/components/com_apartment/images/loadstop.gif");
                            }

                            this.disable();
                            $("img#load").attr("src", "/components/com_apartment/images/load.gif");

},
onComplete: function(file, response)
                        {
// убираем картинку загрузки файла
$("img#load").attr("src", "/components/com_apartment/images/loadstop.gif");

this.enable();

// показываем что файл загружен
                               if(response!="error" && response!='maxsize')
                                {
                                   $('#status').text("");
                                   alert(response);
                                   myfile=response;
  mas.push(myfile); // заносим в массив имя файла
                                   $("#jform_imgpath").val(mas.toString());  // заносим в поле image название всех фото
                                   myclass=Math.floor((Math.random() * 100000000) + 1);  

                                    $("#files").html($("#files").html()+"<li class='"+myclass+"'><img src='/tmp_img/"+myfile+"' /><label class='closeimg' data-img='"+myfile+"' data-li='"+myclass+"'>X</label></li>");
                                 }
                                 else
                                 {
                                    $('#status').text('Размер фото превышает 2Мб');//размер загрузки в php.ini
                                 }
}
});  


Контроллер
Код
public function upload()
 {
       $generate=rand(1,10000000000);// генерируем имя
       $ext = substr($_FILES['file']['name'], strpos($_FILES['file']['name'],'.'), strlen($_FILES['file']['name'])-1); //расширение
 
       $file=$generate.$ext;//$_FILES['file']['name']
       $uploaddir = $_SERVER['DOCUMENT_ROOT'].'/tmp_img/';
       $uploadfile = $uploaddir.$file;
      
        if ($_FILES['file']['size']>1024*2*1024 )
{
           echo "maxsize";  
        }
   elseif (move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile))
        {
          echo $file;
        }
        else
        {
            echo "error";
        }  
 }

мне нужно получить переменную $file оно содержит переименованное имя
« Последнее редактирование: 01.02.2015, 21:56:33 от spirit1086 »
*

spirit1086

  • Захожу иногда
  • 115
  • 1 / 0
Re: Ajaxupload
« Ответ #1 : 01.02.2015, 22:14:21 »
нужно было выводить вот так
Код
           JFactory::getDocument()->setMimeEncoding( 'application/json' );
           print_r($file);
           JFactory::getApplication()->close();

Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться