0 Пользователей и 1 Гость просматривают эту тему.
  • 16 Ответов
  • 1077 Просмотров
*

zahar_92

  • Захожу иногда
  • 315
  • 8 / 0
Всем привет!
Не отображается стандартный модуль последних товаров. При публикации модуля получаю ошибку
Код
Fatal error: Call to a member function setModel() on boolean in /var/www/market.ru/modules/mod_jshopping_latest_products/mod_jshopping_latest_products.php on line 70
В этом районе код такой
Код
	
addLinkToProducts($rows, 0, 1);

$productlist = JSFactory::getModel('productList', 'jshop');
$productlist->setModel($product);
$productlist->load();

if ($enable_addon){
$dispatcher->trigger('onBeforeDisplayProductList', array(&$rows));
$view = new stdClass();
$view->rows = $rows;
$dispatcher->trigger('onBeforeDisplayProductListView', array(&$view, &$productlist));
$rows = $view->rows;
}
Если закомментировать строки
Код
//$productlist = JSFactory::getModel('productList', 'jshop');
//$productlist->setModel($product);
//$productlist->load();
то все вроде ок, модуль появляется, товары отображаются. Но на сколько это решение верное и за что отвечают эти строки? Не наврежу ли я такими действиями?
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
какая у вас версия ЖШ?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

kit2m2

  • Живу я здесь
  • 3264
  • 267 / 0
  • Беру сайты на полное сопровождение
От сюда качали модуль?
Расширения для JoomShopping | Расширения на заказ | Сайты и магазины под ключ: Дизайн, Верстка, Программирование, СЕО-оптимизация, Сопровождение, Перенос на Joomla 4+ и JoomShopping 5+
*

zahar_92

  • Захожу иногда
  • 315
  • 8 / 0
какая у вас версия ЖШ?
Пардон, забыл.. Joomla 3.9.8 , JS 4.18.3
От сюда качали модуль?
Да, версия 4.1.4
4.1.3 тоже ставил, результат тот же.
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
JSFactory::getModel('productList', 'jshop')
Не находит он эту модель. Она есть вообще?
*

zahar_92

  • Захожу иногда
  • 315
  • 8 / 0
JSFactory::getModel('productList', 'jshop')
Не находит он эту модель. Она есть вообще?
Как это проверить? Модуль публикую на главной. Сам компонент на другой странице.

На страницах JS (категория, товар), модуль работает штатно, без ошибок.
« Последнее редактирование: 19.06.2019, 18:52:46 от zahar_92 »
*

ST_Rage

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Цитировать
Как это проверить?
В коде вашего шаблона. В самом начале файла index.php.
*

zahar_92

  • Захожу иногда
  • 315
  • 8 / 0
В коде вашего шаблона. В самом начале файла index.php.
Шаблон protostar. На сколько я понимаю, в шаблоне Joomla эта модель не должна присутствовать. Повторюсь, если на странице присутствует компонент JS,  то модуль работает как надо, если нет компонента, не работает. Причем модуль бестселлеры работает нормально.
*

D. Tkachenko

  • Захожу иногда
  • 69
  • 15 / 0
Если закомментировать строки
Код
//$productlist = JSFactory::getModel('productList', 'jshop');
//$productlist->setModel($product);
//$productlist->load();
то все вроде ок, модуль появляется, товары отображаются. Но на сколько это решение верное и за что отвечают эти строки? Не наврежу ли я такими действиями?

Если нигде в плагинах вот этот триггер не используется - не навредите (он ниже по коду).

Код
$dispatcher->trigger('onBeforeDisplayProductListView', array(&$view, &$productlist));

Но его лучше тогда либо тоже закомментировать, либо переписать под старую версию так:

Код
$dispatcher->trigger('onBeforeDisplayProductListView', array(&$view));

По сути вопроса - и не должно было работать. Ибо откуда Joomla знает где искать модель компонента, когда последний не подгружен и не указан в классе JSFactory. Можно еще решить вот так (без комментирования), вставит в модуле где-нибудь до:

Код
$productlist = JSFactory::getModel('productList', 'jshop');

следующий код:

Код
JLoader::import('productlist', JPATH_ROOT.'/components/com_jshopping/models');

Тогда модель будет определяться верно на любой странице и весь код будет работать верно.
Ошибка не ваша, конечно, а разработчиков, но чтобы было понятно - разжевал.
Завтра напишу им багрепорт на форум.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
следующий код:
лучше тогда
Код
JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_jshopping/models');
вдруг еще какую модель захочется подключить
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

D. Tkachenko

  • Захожу иногда
  • 69
  • 15 / 0
лучше тогда
Код
JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_jshopping/models');
вдруг еще какую модель захочется подключить

Да, и подключить модели прям в factory.php. Как раз собираюсь им об этом написать. А если только в модуле, как по мне, все же лучше явно подключать модель, чтобы путаницы не было. В целом, вообще не понимаю целесообразности того кода что они добавили. Мало того, что он там явно лишний и создает дополнительную ненужную нагрузку на БД, так еще и ломает плагины написанные под старую версию триггера.

Я бы рекомендовал просто закомментировать код и изменить триггер как было раньше. Или использовать стабильную более старую версию модуля.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
так еще и ломает плагины написанные под старую версию триггера
ну раньше 1 параметр передавался, а сейчас 2. в любом случае надо переделывать. и разве передача большего количества параметров в плагин ломает его? по моему больше можно, меньше нельзя.

Я бы рекомендовал просто закомментировать код и изменить триггер как было раньше.
если есть плагины, которые требуют 2 параметра, это точно так же выкинет исключение. тогда плагины надо переделывать, делать в методе второй параметр необязательным. но тоже вопрос - а если плагину нужна модель, он с ней работает?
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

D. Tkachenko

  • Захожу иногда
  • 69
  • 15 / 0
Вы тоже, товарищи, пишите багрепорты, если обнаружили ошибку. Тестировали ведь на последних версиях, значит явно баг с их стороны. Админ там с переводом с русского на английский дружит, я даже не заморачиваюсь - пишу на русском (т.к., с разговорным английским не супер). Так что не стесняйтесь - помогайте сообществу.

Надеюсь, вскоре поправят.
https://www.joomshopping.com/forum/posts/12/13776.html?lang=ru
*

D. Tkachenko

  • Захожу иногда
  • 69
  • 15 / 0
ну раньше 1 параметр передавался, а сейчас 2. в любом случае надо переделывать. и разве передача большего количества параметров в плагин ломает его? по моему больше можно, меньше нельзя.
если есть плагины, которые требуют 2 параметра, это точно так же выкинет исключение. тогда плагины надо переделывать, делать в методе второй параметр необязательным. но тоже вопрос - а если плагину нужна модель, он с ней работает?

Вы правы, если передать больше параметров - исключения ошибки не будет. Или забыл или не знал. Я считаю так лучше не делать. С точки зрения стандарта - неправильно вызывать метод передавая ему больше параметров чем у него. Работает, наверное, потому что используется свой механизм распаковки массива в CMS.

А передавать меньше параметров вполне можно и соответствует стандарту. Достаточно в плагине объявить параметры по умолчанию. Например:

function onBefore...($product, $limit=12)

По поводу модели, если триггер срабатывает с компонента где эта модель подключена, то вызов getModel отработает в плагине корректно. А если триггер одного компонента, а в плагине getModel другого компонента, то без JLoader::import не обойтись, иначе будет также как с модулем по теме.

P.S. Ну, да, вы же за необязательный аргумент и написали. Прочитал невнимательно, неправильно понял.
« Последнее редактирование: 23.06.2019, 14:22:26 от D. Tkachenko »
*

D. Tkachenko

  • Захожу иногда
  • 69
  • 15 / 0
Вы правы, если передать больше параметров - исключения ошибки не будет. Или забыл или не знал. Я считаю так лучше не делать. С точки зрения стандарта - неправильно вызывать метод передавая ему больше параметров чем у него. Работает, наверное, потому что используется свой механизм распаковки массива в CMS.

Все-таки забыл. Это не фича CMS, а стандартный функционал PHP. В старых версиях php даже использовали func_get_args (и сейчас проверил, работает) для получения переменного кол-ва аргументов. Но всё равно, отчасти как СИшник так делать сейчас не советую, плохая практика. Лучше тогда использовать function main(...$array) при передаче переменного количества аргументов. Ко всему PHP идет по пути строгой типизации, вполне вероятно, что могут объявить подобное использование устаревшим.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Лучше тогда использовать function main(...$array) при передаче переменного количества аргументов
вы правы, так и есть, я сейчас все свои плагины перевожу именно на такой способ, чтоб не зависеть от количества параметров. но только следует помнить, что это работает только в php5.6+
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

D. Tkachenko

  • Захожу иногда
  • 69
  • 15 / 0
вы правы, так и есть, я сейчас все свои плагины перевожу именно на такой способ, чтоб не зависеть от количества параметров. но только следует помнить, что это работает только в php5.6+

Хорошее замечание. Правда, сегодня запускать проекты в продакшн на более низкой версии по меньшей мере странно. А старый код, да, нужно переводить уже сейчас, иначе если затянуть, потом будет проще с нуля переписать, чем с таким легаси морочить голову.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль карусели товаров JoomShopping на Swiper.js для Joomla

Автор sergeytolkachyov

Ответов: 1
Просмотров: 369
Последний ответ 10.01.2024, 19:54:00
от sergeytolkachyov
Фильтр товаров для JoomShopping 5

Автор Lemonez

Ответов: 5
Просмотров: 506
Последний ответ 04.01.2024, 22:06:03
от Biss
Модуль Сбероплата - перестал корректно завершать заказы

Автор urry

Ответов: 6
Просмотров: 466
Последний ответ 28.11.2023, 17:10:54
от kit2m2
Вывести название категории в списке товаров

Автор ataman

Ответов: 9
Просмотров: 3441
Последний ответ 15.09.2023, 20:31:11
от Alex_gs
Убрать модуль в карточке товара JoomShopping

Автор alexkraym

Ответов: 35
Просмотров: 4411
Последний ответ 21.08.2023, 07:17:53
от delchev