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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Есть число с фиксированным набором знаков, необходимое кол-во знаков дописывается нулями в начале перед числом. Число вообще может быть равно 0, в этом случае оно будет выглядеть как '000000000000'. Число храниться в базе как строка и выводится во фронт компонентом. Вывод нужно сделать с форматированием, вставив пробелы в качестве разделителя групп: '000 000 000 000'. Как это можно реализовать быстро? number_format($this->escape($this->item->code), 0, '', ' ') выводит '0'. Имеется ли в php функция, аналогичная number_format, но учитывающая необходимое фиксированное кол-во знаков в результате?
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #1 : 07.11.2014, 22:11:34 »
можно так
Код
$code = '000000000000'.$this->item->code;
$code = substr($code, -12);

$res = '';
$g = 0;
for ($i = 0; $i < strlen($code); $i++) {
  if ($g == 3) {
    $res .= ' ';
    $g = 0;
  }

  $g++;
  $res .= $code[$i];
}

echo $res;
« Последнее редактирование: 07.11.2014, 23:58:42 от icom »
*

passer

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

fsv

  • Живу я здесь
  • 2781
  • 411 / 2
Re: Форматирование числа в ведущими 0
« Ответ #3 : 07.11.2014, 23:01:34 »
sprintf / printf / +доработать
Веб-разработка: заказ. Только новая разработка.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Форматирование числа в ведущими 0
« Ответ #4 : 07.11.2014, 23:48:45 »
Велосипед:
Код: php
  /*
   * string форматируемое число
   * int общее кол-во символов
   * int кол-во символов в блоке
  */
  function f_number($num,$rlenght,$rcount) {
    $num = preg_replace("[^0-9]",'',$num);
    if ($rlenght) {
      if (strlen($num) < $rlenght) {
        $num = str_pad($num, $rlenght, '0', STR_PAD_LEFT);
      } else if (strlen($num) > $rlenght) {
        $num = substr($num,0,$rlenght);
      }
    } else {
      $rlenght = strlen($num);
    }

    $result = '';
    while (strlen($num) > $rcount) {
      $result = substr($num,-$rcount).' '.$result;
      $num = substr($num,0,-$rcount);
    }
    if (strlen($num))
      $result = $num.' '.$result;

    return $result;
  }
Работает, меня устраивает. Оптимизация приветствуется.
« Последнее редактирование: 07.11.2014, 23:55:06 от AlekVolsk »
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #5 : 08.11.2014, 00:00:14 »
можно так
Код
$code = '000000000000'.$this->item->code;
$code = substr($code, -12);

$res = '';
$g = 0;
for ($i = 0; $i < strlen($code); $i++) {
  if ($g == 3) {
    $res .= ' ';
    $g = 0;
  }

  $g++;
  $res .= $code[$i];
}

echo $res;

а лучше так
Код
echo chunk_split(str_pad($this->item->code, 12, '0', STR_PAD_LEFT), 3, ' ');
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Форматирование числа в ведущими 0
« Ответ #6 : 08.11.2014, 00:09:42 »
Хороший рефакторинг )) но кол-во знаков может быть и не кратным кол-ву знаков в блоке, т.е. не 12 и 3, а 9 и 4, тогда
Код: php
echo chunk_split(str_pad('0', 9, '0', STR_PAD_LEFT), 4, ' ');
вернет '0000 0000 0', а надо '0 0000 0000', т.о. chunk_split() не подходит, ибо разбиение не стой стороны начинает.
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #7 : 08.11.2014, 00:26:01 »
Код: php
echo strrev(chunk_split(strrev(str_pad('0', 9, '0', STR_PAD_LEFT)), 4, ' '));
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Форматирование числа в ведущими 0
« Ответ #8 : 08.11.2014, 00:28:15 »
Шиворот-навыворот-задом-наперед )))

Код: php
  function f_number($num,$rlenght,$rcount) {
    return strrev(chunk_split(strrev(str_pad($num, $rlenght, '0', STR_PAD_LEFT)), $rcount, ' '));
  }
Работает, решено.
« Последнее редактирование: 08.11.2014, 00:32:19 от AlekVolsk »
*

icom

  • Давно я тут
  • 830
  • 202 / 4
Re: Форматирование числа в ведущими 0
« Ответ #9 : 08.11.2014, 00:33:38 »
Код: php
function f_number($num,$rlenght,$rcount) {
    return strrev(chunk_split(strrev(str_pad($num, $rlenght, '0', STR_PAD_LEFT)), $rcount, ' '));
}
окончательный вариант)

UPD: а, уже исправил)
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Форматирование числа в ведущими 0
« Ответ #10 : 08.11.2014, 00:41:41 »
Общая длина может быть произвольной, а может и фиксированной, согласно заданным параметрам (используется в компоненте).
Если длина фиксированная, а строка больше заданной длины, сделаем ей обрезание.
А еще бывают случаи, когда строка уже содержит лишние пробелы не в тех местах где нужно (данные импортируются на сайт извне).

Окончательный вариант пока так:
Код: php
  protected function f_number($num,$rlenght,$rcount) {
    $num = preg_replace("[^0-9]",'',$num);
    if ($rlenght) {
      if (strlen($num) > $rlenght)
        $num = substr($num,0,$rlenght);
    } else {
      $rlenght = strlen($num);
    }
    return strrev(chunk_split(strrev(str_pad($num, $rlenght, '0', STR_PAD_LEFT)), $rcount, ' '));
  }
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Форматирование текста. Вопрос связан с MySQL

Автор Аня

Ответов: 6
Просмотров: 1186
Последний ответ 06.05.2018, 00:35:31
от Аня
Сортировка материалов категории, содержащии в названии числа

Автор RezistoR

Ответов: 2
Просмотров: 1061
Последний ответ 15.12.2015, 23:49:36
от robert