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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Помогите создать скрипт, реализующий примерно следующее.
Есть материал article1, в котором имеется следующий html:
Код: html4strict
<dl>

  <dt><a name="anchor1"></a>bla-bla</dt>
  <dd>bla-bla-bla-bla-bla</dd>

  <dt><a name="anchor2"></a>bla-bla</dt>
  <dd>bla-bla-bla-bla-bla</dd>

  <dt><a name="anchor3"></a>bla-bla</dt>
  <dd>bla-bla-bla-bla-bla</dd>

</dl>

Есть материал article2, в котором имеются ссылки на /article1.html#anchor1, /article1.html#anchor2 и /article1.html#anchor3

При клике на эти ссылки мне нужно перейти по якорю и после этого съэмулировать клик на родительском <dt>, как будто бы пользователь изначально кликал по этому <dt>

Поскольку в js не силен, мозг уже 4 дня сломан.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Re: Перехват ссылки на якорь на js
« Ответ #1 : 19.03.2014, 00:06:24 »
вобще клик в javascript событие всплывающее, при клики на линк, сначало будет обработано событие которое на вы на линк повесили а потом и на все родительские элементы. можете в этом убедится:
Код: javascript
var link = document.getElementsByName('anchor1')[0];
link.parentNode.onclick = function () {
alert('Клик по dt');
}
вам возможно просто текст нужен внутри анкора поместить?
<dt><a name="anchor1">bla-bla</a></dt>
интернет-блог: http://websiteprog.ru
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Перехват ссылки на якорь на js
« Ответ #2 : 19.03.2014, 01:32:34 »
http://learn.javascript.ru/play/TGkWtb
Код: javascript
    <script>
      window.onload = function () {
        var allslink = document.querySelectorAll("a[href^='#anchor']"),
          len = allslink.length,
          clickMe = function () {
            var ancel = document.querySelector("[name="+this.hash.slice(1)+"]"),
              par = ancel.parentNode || ancel.parentElement;
            par.onclick();
          };
        while (len) {
          allslink[--len].onclick = clickMe;
        };
      };
    </script>
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #3 : 19.03.2014, 09:08:50 »
А если имя якоря заранее неизвестно, потому что якорь вставляется пользователем, но известен класс <dl class="classname">, поскольку вся конструкция формируется плагином? Для <dt> также можно присвоить класс: <dt class="dtid-N">
При этом скрипт в плагине.

В консоли: TypeError: par.onclick is not a function
« Последнее редактирование: 19.03.2014, 09:11:57 от AlekVolsk »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Перехват ссылки на якорь на js
« Ответ #4 : 19.03.2014, 12:32:34 »
Цитировать
В консоли: TypeError: par.onclick is not a function
потому как на dt не навешен обработчик это видно в примере так как там все работает
Смысл отсылать клик на dt если он не обрабатывается. Нет обработчика соответственно ошибка
Цитировать
также можно присвоить класс: <dt class="dtid-N">

http://learn.javascript.ru/play/eTZTL
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #5 : 19.03.2014, 17:07:06 »
На dt есть обработчик, и он работает:
Код: javascript
jQuery(function() {
  jQuery('dl.tabs dt').click(function() {
    jQuery(this)
    .siblings().removeClass('selected').end()
    .next('dd').andSelf().addClass('selected');
  });
});
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Перехват ссылки на якорь на js
« Ответ #6 : 19.03.2014, 18:42:24 »
Код: javascript
par.click();
http://learn.javascript.ru/play/YpTFSb
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #7 : 19.03.2014, 18:53:04 »
значение id у dt обязательно должно совпадать при этом с именем якоря? или это просто для демонстрации скрипта?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Перехват ссылки на якорь на js
« Ответ #8 : 19.03.2014, 19:03:27 »
О боже, сами не могли проверить?
Конечно, нет. Я просто демонстрирую работоспособность скрипта Федора.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #9 : 19.03.2014, 19:08:33 »
а не работает...
если интересно, именно в этом плагине пытаюсь реализовать: http://joomlaforum.ru/index.php/topic,273591.0/all.html
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #10 : 19.03.2014, 19:39:02 »
http://volskstroylicey.ru/entrant.html#paid-edu - при переходе сюда должна активироваться вторая вкладка, причем переход может быть из другого материала, из меню, с адресной строки браузера, с другого сайта.

Прошу помощи : (
*

fsv

  • Живу я здесь
  • 2781
  • 411 / 2
Re: Перехват ссылки на якорь на js
« Ответ #11 : 19.03.2014, 21:13:15 »
#paid-edu - при переходе сюда должна активироваться вторая вкладка, причем переход может быть из другого материала, из меню, с адресной строки браузера, с другого сайта.

Код: javascript
jQuery(function($) {
  var url = location.href;
  if( url.indexOf("#paid-edu")!== -1 ) {
    $('#tabs_tab1').find('dt').eq(0).removeClass('selected').end().eq(1).addClass('selected');
    $('#tabs_tab1').find('dd').eq(0).removeClass('selected').end().eq(1).addClass('selected');
  }
});
Веб-разработка: заказ. Только новая разработка.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #12 : 19.03.2014, 21:25:58 »
Нет, не работает, к сожалению.
К тому же это решение для частного указанного случая, а мне нужно решение универсальное, для вставки в плагин, т.к. плагин используется на нескольких сайтах, вкладок на каждом много.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Перехват ссылки на якорь на js
« Ответ #13 : 19.03.2014, 21:29:44 »
fsv, и это его не устраивает, потому что опять не договаривает. Как я понял, он использует Tabs Plugin от ELLE и хочет инициировать клик по вкладкам из текста.
AlekVolsk, скрипт Федора работает, но ваш якорь скрыт. Положите его в название вкладки и клик сработает.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #14 : 19.03.2014, 21:31:46 »
Могу реализовать, чтобы анкор изначально формировался плагином:
<dt class="tabid1"><a name="tabid1"></a>Вкладка 1</dt>
...
<dt class="tabid2"><a name="tabid2"></a>Вкладка 2</dt>
...

Если это поможет, конечно.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #15 : 19.03.2014, 21:33:17 »
fsv, и это его не устраивает, потому что опять не договаривает. Как я понял, он использует Tabs Plugin от ELLE и хочет инициировать клик по вкладкам из текста.
Да, именно это.

AlekVolsk, скрипт Федора работает, но ваш якорь скрыт. Положите его в название вкладки и клик сработает.
Это как? не понял, а сейчас тогда он где?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #16 : 19.03.2014, 23:44:44 »
Как правильно написать: у всех элементов tabs dt убрать selected и одному dd id=tab добавить selected:
$(tabs).find('dt').removeClass('selected').end().(tab).addClass('selected');

здесь tabs = "#tabs1"; tab = "#tab1";
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #17 : 20.03.2014, 00:04:04 »
Сейчас имею сформированный html:
Код: html4strict
<dl id="tabs1" class="tabs">

    <dt id="tab1" class="selected">  <a name="tabs1-tab1"></a> Вкладка 1  </dt>
    <dd id="tab1" class="selected"></dd>

    <dt id="tab2" class=""> <a name="tabs1-tab2"></a> Вкладка 2 </dt>
    <dd id="tab2" class=""></dd>

</dl>

Перехожу на якорь #tabs1-tab2

Скрипт:
Код: javascript
jQuery(function($) {
  var url = location.href; // получили URL
  if( url.indexOf("#tabs")!== -1 ) { // посмотрели, имеется ли якорь на вкладку
    url_tmp = url.split("#"); // разбили URL на до и после #
    url_arr = url_tmp[1].split("-"); // получили из имени якоря id
    tabs = '#'+url_arr[0]; // id группы вкладок
    tab = '#'+url_arr[1];  // id вкладки в группе
    $(tabs).find('dt').removeClass('selected').end(); // все заголовки - неактивны
    $(tabs).find('dd').removeClass('selected').end(); // все содержимое вкладок скрыть
    $(tabs).find(tab).addClass('selected'); // вкладку с нужным id активировать и отобразить
  }
});

Получаю эффект: заголовок второй вкладки активен (selected), а сама вкладка невидна (не selected). Где я ошибся?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #18 : 20.03.2014, 00:33:00 »
Вот так работает:
Код: javascript
jQuery(function($) {
  var url = location.href;
  if( url.indexOf("#tabs")!== -1 ) {
    url_tmp = url.split("#");
    url_arr = url_tmp[1].split("-");
    tabs = '#'+url_arr[0];
    tab = '#'+url_arr[1];
    $(tabs).find('dt').removeClass('selected').end();
    $(tabs).find('dd').removeClass('selected').end();
    $(tabs+' '+tab).click();
  }
});

Всем спасибо. fsv, Вам +: именно ваша подсказка натолкнула в правильном направлении.

Решено.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Re: Перехват ссылки на якорь на js
« Ответ #19 : 20.03.2014, 00:35:26 »
id всегда должен быть уникален
Код: javascript
if( url.indexOf("#tabs") == -1 ) return;
url.hash - єто якорь
Код: javascript
alert(url.hash);
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #20 : 20.03.2014, 00:48:21 »
Уникальность id обеспечивается плагином вполне, проверено, т.к. групп вкладок может быть несколько.
http://joomlaforum.ru/index.php/topic,273591.msg1441197/topicseen.html#msg1441197
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Перехват ссылки на якорь на js
« Ответ #21 : 20.03.2014, 00:52:43 »
Скрипт Федора тоже работает: http://learn.javascript.ru/play/HEE4jc
« Последнее редактирование: 20.03.2014, 08:42:52 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #22 : 20.03.2014, 01:00:53 »
robert, я не спорю, но, к сожалению, у меня не получилось его запустить.
Я думаю, многие будут Вам признательны, если Вы внедрите его в плагин и поделитесь готовым решением, в виде готового к установке плагина, благо это решение более универсальное и удобное.
Мне уже не надо - меня устраивает вышеприведенное работоспособное решение, спасибо.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #23 : 20.03.2014, 20:10:23 »
robert, специально смоделировал несколько раз: если скрипт Федора помещаю в head - он работает, если скрипт помещаю в файл скрипта плагина - не работает.
*

fsv

  • Живу я здесь
  • 2781
  • 411 / 2
Re: Перехват ссылки на якорь на js
« Ответ #24 : 20.03.2014, 21:52:57 »
если скрипт помещаю в файл скрипта плагина - не работает.
возможно, не в то событие в плагине

$(tabs).find('dt').removeClass('selected').end();
зачем?
Веб-разработка: заказ. Только новая разработка.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Перехват ссылки на якорь на js
« Ответ #25 : 20.03.2014, 21:55:17 »
Специально поставил плагин для проверки, у меня работает. А по-другому и не должно быть: что в head, что в отдельный js-файл - никакой разницы нет, нужно лишь порядок загрузки соблюдать.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #26 : 20.03.2014, 22:58:31 »
возможно, не в то событие в плагине

$(tabs).find('dt').removeClass('selected').end();
зачем?
Действительно, чего это я...
Если и так реализуется клик, смысл дополнительно предварительно убирать selected отпадает сам собой. убрал из скрипта это - и так работает:
Код: javascript
    $(tabs).find('dt').removeClass('selected').end();
    $(tabs).find('dd').removeClass('selected').end();

Зачем .end() в конце? а и сам не знаю...

Последняя версия:
Код: javascript
jQuery(function($) {
  var url = location.href;
  if( url.indexOf("#tabs") == -1 ) return;
  if( url.indexOf("#tabs")!== -1 ) {
    url_arr = url.split("#")[1].split("-");
    $('#'+url_arr[0]+' #'+url_arr[1]).click();
  }
});
« Последнее редактирование: 20.03.2014, 23:04:19 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #27 : 20.03.2014, 23:05:33 »
robert, можно вашу версию script.js полностью?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Перехват ссылки на якорь на js
« Ответ #28 : 20.03.2014, 23:25:29 »
Да я ничего нового не добавил
Вот содержимое script.js
Спойлер
[свернуть]
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Re: Перехват ссылки на якорь на js
« Ответ #29 : 20.03.2014, 23:36:32 »
Блин, ну не работает у меня:
Спойлер
[свернуть]
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Переход по ссылки и запуск функции? [РЕШЕНО]

Автор warlocksp

Ответов: 19
Просмотров: 1455
Последний ответ 21.02.2020, 12:06:24
от warlocksp
Дублируется адрес сайта при формировании ссылки если используется ssl

Автор denism300

Ответов: 0
Просмотров: 935
Последний ответ 08.11.2017, 19:47:25
от denism300
Рефф ссылки на каждую страницу?

Автор magastom89

Ответов: 6
Просмотров: 1508
Последний ответ 16.01.2015, 14:38:38
от magastom89