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

katjuha6

  • Захожу иногда
  • 173
  • 0 / 0
Все доброго времени суток!
Ребят, возникла надобность подправить функцию в файле components\com_virtuemart\themes\default\theme.php

Код
function vmlistAdditionalImages( $product_id, $images, $title='', $limit=1000 ) {
global $sess;
$html = '';
$i = 0;
foreach( $images as $image ) {
$thumbtag = ps_product::image_tag( $image->file_name, 'class="browseProductImage"', 1, 'product', $image->file_image_thumb_width, $image->file_image_thumb_height );
$fulladdress = $sess->url( 'index2.php?page=shop.view_images&image_id='.$image->file_id.'&product_id='.$product_id.'&pop=1' );

if( $this->get_cfg('useLightBoxImages', 1 )) {
$html .= vmCommonHTML::getLightboxImageLink( $image->file_url, $thumbtag, $title ? $title : $image->file_title, 'product'.$product_id );
}
else {
$html .= vmPopupLink( $fulladdress, $thumbtag, 640, 550 );
}
$html .= ' ';
if( ++$i > $limit ) break;
}
return $html;
}

дополнительное изображение выводится в виде
a img.browseProductImage.
как можно сделать так, чтобы было
a p img.browseProductImage.
вместо "p" можно любой другой тег. я перепробовала разные способы, но с php пока не дружу и даже образно не представляю где это прописывается. буду очень признательна за любую подсказку.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
А можно узнать, для чего вам нужен тэг p (кстати, неправильно размещать его внутри a)?
Насколько я знаю, дополнительные thumb_images ссылаются только на дополнительные images. Вам нужно, чтобы они ссылались на что-то другое?
Если хотите, поройтесь в htmlTools.class.php. Там находятся все функции getLightboxImageLink, hyperLink, vmPopupLink..., которые выводятся в переменной $html.
Но я не понимаю, зачем все это.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

katjuha6

  • Захожу иногда
  • 173
  • 0 / 0
Код
А можно узнать, для чего вам нужен тэг p (кстати, неправильно размещать его внутри a)?
спасибо, я знаю =) там совершенно фиолетово какой тег. песня в том, что сейчас изображения "img" приклеивается к верхней части "a", (кстати, вот яркий пример http://test.katalliana.org/ru/internet-magazin/category/product/44-nabori-dlya-grilya/83-nabor-dlya-grilya-1095.html) потому что у "a" float:left. для того, чтобы изображения выравнивались по центру блока, нужно задавать "а" - display:table-cell. я думаю, что не надо объяснять, что эти 2 свойства прицепить к одному блоку в данной ситуации нереально. именно для этого и нужен дополнительный тег (грубо говоря "p"), чтобы было так: a p img
a {
display:block;
float:left;}
p {
display:table-cell;
vertical-align:middle;}

надеюсь понятно объяснила. формирование вывода дополнительных изображений проходит в этой функции. но я не знаю, КАК туда это всунуть.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Делайте так:
В /templates/time-eco/css.css добавить
Код
div.image-sec a{
display:inline-block;
vertical-align:middle;
}
или
Код
div.image-sec a img{
display:inline-block;
vertical-align:middle;
}
Не будь паразитом, сделай что-нибудь самостоятельно!
*

katjuha6

  • Захожу иногда
  • 173
  • 0 / 0
а это ничего, что "inline-block" с "vertical-align" не применяется?  ;)
не работает. уважаемый Роберт, варианты с CSS я уже перебрала. самое простое решение для меня на данном этапе - это всунуть что-нибудь между а и img. я буду очень благодарна, если Вы подскажете как это сделать.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Странно, что не работает.
Если хотите все-таки всунуть что-то между <a> и <img>, то измените следующую строку функции hyperLink в htmlTools.class.php
Код
return '<a href="'.vmAmpReplace($link).'"'.$target.$title.$attributes.'>'.$text.'</a>';
И данном случае $text - это <img>.
Но лучше этого не делать, не могу представить, какие косяки могут быть у вас.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

katjuha6

  • Захожу иногда
  • 173
  • 0 / 0
Огромное спасибо!
строку
Код
return '<a href="'.vmAmpReplace($link).'"'.$target.$title.$attributes.'>'.$text.'</a>';
изменила на
Код
return '<a href="'.vmAmpReplace($link).'"'.$target.$title.$attributes.'><i>'.$text.'</i></a>';
в CSS добавила свойства
.image-sec a i {
display: table-cell;
width: 80px;
height: 80px;
vertical-align: middle;}
и все работает. еще раз спасибо! если расскажете как поставить "+" - обязательно отмечусь =)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Рад, что смог чем-то помочь.
Да, правильно: display: table-cell;, а я писал inline-block.
И помните, что все ссылки (не только для доп.изображений), генерируемые hyperLink, теперь будут содержать тэг i.
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Настройки отображения товара

Автор wectra

Ответов: 2
Просмотров: 4156
Последний ответ 12.07.2017, 22:12:27
от wectra
Несколько изображений для товара/ Лупа для изображения/ Magic Zoom

Автор antoha333

Ответов: 41
Просмотров: 26674
Последний ответ 13.11.2015, 16:08:16
от sonics
Как реализовать на VirtueMart такую карточку товара?

Автор AdmbVlad

Ответов: 0
Просмотров: 1774
Последний ответ 14.10.2015, 17:01:55
от AdmbVlad
Вставить картинку в карточку товара через URL и создать его миниатюру

Автор sashgera

Ответов: 8
Просмотров: 3009
Последний ответ 14.02.2015, 21:12:46
от sashgera
Как изменить сортировку товара ?

Автор Timer

Ответов: 0
Просмотров: 1666
Последний ответ 21.01.2015, 23:49:28
от Timer