Vladimir
Сейчас надо реварс поправить еще один косяк и перевод делаю на выхах
Vladimir
Vladimir
Надо короче собирать вот такие отзывы к маркетплейсам, чтобы развеивать сказки про «все сейчас продают только на маркетплейсах»
Vladimir
Сейчас, когда мне поступает заказ на "Озоне", я пишу покупателю, что он может заказать товар в моем интернет-магазине, а через маркетплейс я ничего ему отправлять не буду.
Vitaly
Всем доброго дня! Пытаюсь понять, как же всё-таки работает com_ajax в J4 для модулей. В модулях J4 файл хелпера перенесли, но в com_ajax его поиск остался в прежнем месте. Но файл этот теперь должен загружаться и с нового места. Но не работает оно у меня через com_ajax никак. Всё, что, собственно, было добавлено в J4 в com_ajax:
$moduleInstance = $app->bootModule('mod_' . $module, $app->getName());
if ($moduleInstance instanceof \Joomla\CMS\Helper\HelperFactoryInterface && $helper = $moduleInstance->getHelper(substr($class, 3)))
{
$results = method_exists($helper, $method . 'Ajax') ? $helper->{$method . 'Ajax'}() : null;
}
Я никак не могу понять смысл этого действа. Первая часть IF выполняется, а вторая ведет на интерфейс без реализации. Оно должно работать по умолчанию как-то? Или нужно делать реализацию для getHelper обязательно?
Vitaly
Если $results не определен, то будет поиск в старом хелпере от J3. А его нет. Ну и, соответственно, никакого возврата данных по AJAX-запросу к модулю через com_ajax.
Dmitry
@wedalru а сейчас у тебя модуль по структуре тройки?
Vitaly
Dmitry
Мхм
Dmitry
Мне кажется, что ошибка
Dmitry
У них )
Dmitry
Модуль не может быть инстансом интерфейса хелпера
Dmitry
А, не, может... Глянул исходники
Dmitry
Всем доброго дня! Пытаюсь понять, как же всё-таки работает com_ajax в J4 для модулей. В модулях J4 файл хелпера перенесли, но в com_ajax его поиск остался в прежнем месте. Но файл этот теперь должен загружаться и с нового места. Но не работает оно у меня через com_ajax никак. Всё, что, собственно, было добавлено в J4 в com_ajax:
$moduleInstance = $app->bootModule('mod_' . $module, $app->getName());
if ($moduleInstance instanceof \Joomla\CMS\Helper\HelperFactoryInterface && $helper = $moduleInstance->getHelper(substr($class, 3)))
{
$results = method_exists($helper, $method . 'Ajax') ? $helper->{$method . 'Ajax'}() : null;
}
Я никак не могу понять смысл этого действа. Первая часть IF выполняется, а вторая ведет на интерфейс без реализации. Оно должно работать по умолчанию как-то? Или нужно делать реализацию для getHelper обязательно?
Тут просто проверяется что расширение типа модуль наследует интерфейс. Если это так, то идёт попытка получить хелпер.
Dmitry
И если попытка удачная, то вызывается метод Ajax
Дмитрий
Дмитрий
Это просто проверка интерфейсов
Дмитрий
Что соответствие идёт
Dmitry
Vitaly
Ладно, сформулирую вопрос иначе: есть ли хоть один модуль под J4 в котором работает com_ajax? Хотелось бы посмотреть реализацию... Я ничего не нашел толкового.
Vitaly
Это просто проверка интерфейсов
Вот у меня эта часть всегда 0 возвращает, а раз 0, то всё условие с && уходить в 0 и, соотвественно, не выполняется. А дальше только хелпер от J3.
Дмитрий
function(Interface $protocol) { }
Дмитрий
я хз
Дмитрий
надл смотреть что там делает метод boot
Дмитрий
я еще не смотрел
Dmitry
Он в контейнер модуль засовывает ))
Дмитрий
предполагается что инстанс этот должен быть имплементирован от HelperFactoryInterface
Dmitry
Там дальше loadextension
Дмитрий
от фабрики интерфейса
Дмитрий
я хз,смотреть надо
Дмитрий
если судить по этому коду
Дмитрий
хз, читать логику надо =)))
Dmitry
Vitaly
В общем, для J4 всё упирается в эти три строчки и вариантов нет, т.к в J3 класс хелпера начинался с mod", а в 4 - без него. Я очень плохо представляю, как обеспечить обратную совместимость, учитывая это. Даже если добавить выбор файла хелпера в зависимости от версии Joomla, то всё равно получается, что имена классов разные для 3 и 4 должны быть. Т.е. остается выбросить автозагрузку хелпера через неймспейсы и новое место его расположения, и новое именование, а просто грузить helper.php в корневой папке модуля и использовать класс хелпера с "mod".
Либо бросать поддержку J3 и переделывать все на J4. Но тут непонятно с AJAX. Я так и не смог загрузить метод из хелпера через com_ajax.
Dmitry
Dmitry
Насколько я понимаю, должен
Vitaly
Будет, он почти и работает. Но в 4 всё по другому же теперь, по фен-шую
Dmitry
Dmitry
В модулях по феншую только неймспейсы
Dmitry
Остальное же не меняется
Dmitry
Ну хелпер в другое место перенесли, но это ерунда
Vitaly
Dmitry
Ну надо им issue накатать тогда
Vitaly
Vitaly
https://issues.joomla.org/tracker/joomla-cms/32291
Vitaly
Последний там пост:
Hi guys, I know this issue is already closed but has this issue really been resolved? It's still returning The file at mod_articles_categories/helper.php does not exist in Joomla 4.0.3. and com_ajax still looks for Mod class prefix in helper class name.
А уже почти год прошел.
Vitaly
Он должен через вот это проверку проходить для выполнения:
$moduleInstance = $app->bootModule('mod_' . $module, $app->getName());
if ($moduleInstance instanceof \Joomla\CMS\Helper\HelperFactoryInterface && $helper = $moduleInstance->getHelper(substr($class, 3)))
{
$results = method_exists($helper, $method . 'Ajax') ? $helper->{$method . 'Ajax'}() : null;
}
Vitaly
Но $helper = $moduleInstance->getHelper(substr($class, 3)) у меня всегда 0 на выходе
Igor
Vitaly
Лежит helper j4 в другом месте?
модуль/src/Helper/
Я уже несколько раз сравнил с другими модулями J, родными. Все четко. Но там нигде com_ajax не используется
Vitaly
А так без него всё работает без проблем
Igor
Igor
будет у тебя пока что 2 helper а
Igor
Тобишь сохранить совместимость j3-j5 без костылей в любом случае не выйдет.
Vitaly
Igor
Vitaly
Vitaly
А нужно чтобы $moduleInstance->getHelper(substr($class, 3)) был не 0
Igor
Нужна фактория модулей. bootModule от сюда начинать.
Dmitry
Dmitry
Походу они неверный фикс накатили ))
Igor
Там всё ок
Верю. Просто там можно посмотерть что нужно для подключения helper
Dmitry
Интерфейс походу
Dmitry
Ну по логике гетхелпер должен всё делать
Igor
Dmitry
Если бы делал, всё бы завелось ))
Vitaly
Вот он
Vitaly
Igor
Тобишь на этот момент класс уже должен быть подключен
Vitaly
Я так понимаю его bootModule должен загрузить, который перед этим выполняется.
Igor