Новости Joomla

Вышли релизы безопасности Joomla 5.3.4 и Joomla 4.4.14

Релиз безопасности Joomla 5.3.4

Проект Joomla спешит сообщить о выпуске Joomla 5.3.4 и Joomla 4.4.14. Это релиз безопасности для серии Joomla 5.3 и релиз безопасности для серии Joomla 4.4.

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

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
Joomla 4 демо


Функционал избранных товаров для JoomShopping, реализован с помощью cookie. В стандартной комплектации список желаний отображается только в карточке товара. В случае написания каких-либо хаков для добавления кнопки в список товаров стандартный вишлист перенаправляет в карточку товара, в случае если у товара есть зависимые атрибуты (влияют на цену), так как по сути wishlist - это копия корзины, а корзине нужен выбранный атрибут.

WT JoomShopping Favorites - это альтернативный список пожеланий (избранные товары) для JoomShopping, который решает эти проблемы. Скачать и подробная информация

Возможности
  • добавление кнопки в карточку товара (19 позиций)
  • добавление кнопки в список товаров (11 позиций)
  • можно создать пункт меню для избранных товаров
  • вывод модуля с иконкой и количеством добавленных в избранное товаров
  • поддержка 6 шаблонов JoomShopping
  • добавление своего шаблона копированием одного файла, скорее всего даже без его редактирования
Версия 2.0.2 Совместимость проверена: Joomla 5.0.3 JoomShoppng 5.3.5 Дата: 03.04.2024
Начиная с версии 1.3.0 поддерживается только Joomla 4. Разработка версий для Joomla 3 заморожена.
Joomla 3 видео


Состав пакета
  • Плагин WT JoomShopping Favorite - в нём производятся основные настройки.
  • Модуль WT JoomShopping Favorite - выводит иконку и ссылку на избранные товары и их количество
  • Файл: controller и view для JoomShopping, позволяет отображать избранные товары, а так же создать пункт меню для них.
  • Файл: комплект файлов для шаблонов JoomShopping

    • default

Во всех этих шаблонах по сути используется один и тот же файл. Расширение WT JoomShopping Favorites устроено таким образом, что для отображения списка избранных товаров используется макет категории товаров из шаблона JoomShopping. Поэтому, если у Вас шаблон JoomShopping, которого нет в списке выше, Вы можете просто скопировать папку wtjshoppingfavorites, например, components/com_jshopping/templates/default/wtjshoppingfavorites в Ваш шаблон и всё должно заработать.

#Changelog
Спойлер
[свернуть]

Расширение бесплатное, развивается за счет пожертвований.
*

ft990

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
Подскажите, пожалуйста, какой модуль сравнения у вас используется в демо шаблона магазина?
*

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
Здравствуйте. Это WT JShopping Compare. Писался под заказчика. В качестве референса - МВидео. Но я его так пока и не оформил в пакет, который можно просто скачать и установить. На это требуется время, которого пока  нет. Буду откровенен: все упирается как всегда в одно и то же - время и деньги. Практически все версии расширений, которые я выкладываю оплачены заказчиками и выложены в бесплатный открытый доступ с их согласия в качестве поддержки Joomla-сообщества, за что я им весьма признателен.
*

ft990

  • Осваиваюсь на форуме
  • 27
  • 1 / 0
Здравствуйте. Это WT JShopping Compare. Писался под заказчика. В качестве референса - МВидео. Но я его так пока и не оформил в пакет, который можно просто скачать и установить. На это требуется время, которого пока  нет. Буду откровенен: все упирается как всегда в одно и то же - время и деньги. Практически все версии расширений, которые я выкладываю оплачены заказчиками и выложены в бесплатный открытый доступ с их согласия в качестве поддержки Joomla-сообщества, за что я им весьма признателен.

Большое спасибо! Было бы хорошо, если бы получилось оформить. Спрос есть!
*

Biss

  • Давно я тут
  • 995
  • 101 / 0
Я давно работаю с джумшопом. Если есть исходники, то я могу попробовать собрать пакеты модулей или плагинов для установки. Так, ради практики, авторство останется вашим конечно.
*

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
Я давно работаю с джумшопом. Если есть исходники, то я могу попробовать собрать пакеты модулей или плагинов для установки. Так, ради практики, авторство останется вашим конечно.

Спасибо за предложение помощи. Она может пригодиться в целом, но конкретно с этим расширением проблема не в том, чтоб просто собрать. Там часть настроек хардкодом, жёсткая привязка к bootstrap. Если делать public  решение, то нужно привести его в Божий вид. Настройки в админку вынести. Предусмотреть возможность смены макета вывода, так как у кого-то сайт на UIKit или на самописе вообще. По хорошему js переписать без jquery.
*

intcorp

  • Захожу иногда
  • 456
  • 12 / 0
Отличное расширение! Правда есть недочет: если товар опубликован в нескольких категориях, то и в списке пожеланий будут дубли товара.
*

Mushu-svbk

  • Осваиваюсь на форуме
  • 24
  • 2 / 0
Версия 1.3.4 от 10.08.2022г.
Здравствуйте, помогите пожалуйста его настроить. Шаблон Cassiopeia, Joomla 4, JoomShopping 5. Кнопка выводится, но никакой реакции при нажатии на нее. И ошибка при нажатии на для просмотра избранного Call to undefined method stdClass::getContext()
 Заранее спасибо
« Последнее редактирование: 28.10.2022, 03:29:11 от Mushu-svbk »
*

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
Версия 2.0.0
✔️ Рефакторинг кода. Пакет расширений переписан согласно новым канонам Joomla 4. Это означает, что расширения должны без проблем работать на Joomla 5 (выйдет осенью 2023 года) и в дальнейшем на Joomla 6 (ожидается в 2025 году).
✔️ Отказ от jQuery. Javascript код теперь не требует использования библиотеки jQuery.
✔️ Совместимость PHP 8.1. Протестирована работоспособность расширений на PHP 8.1. Исправлены все замеченные ошибки, предупреждения и уведомления.
*

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
v.2.0.2
- Рефакторинг кода
Улучшение совместимости пакета расширений с Joomla 5.
- WT Product model
Из состава пакета удалено расширение типа файл WT Products - Web Tolk JoomShopping custom model. Теперь в нём нет необходимости. Вы можете безбоязненно удалить его в разделе Система - Расширения - Управление.
- Добавлены позиции вывода
Добавлены позиции для вывода кнопки, появившиеся в последних версиях JoomShopping.
*

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
Цитировать
Отличное расширение! Правда есть недочет: если товар опубликован в нескольких категориях, то и в списке пожеланий будут дубли товара.

В этой версии должна быть решена проблема. Обновитесь, проверьте.
*

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
Удобное расширение.
Но при отсутствии товаров в списке, пункт меню выдает ошибку:

"Call to undefined method stdClass::getContext()"

 ver 2.0.2 / Joomla 5.3.2 / JShop 5.0.8
*

sergeytolkachyov

  • Захожу иногда
  • 207
  • 20 / 0
  • @sergeytolkachyov https://web-tolk.ru
Включите отладку и показ ошибок максимального уровня. В какой строке и каком файле ошибка. Не сталкивался с таким поведением.
*

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
1   ()   JROOT\plugins\jshoppingproducts\sortingorderby\sortingorderby.php:27
2   plgjshoppingproductssortingorderby->onBeforeDisplayProductListView()   JROOT\libraries\src\Plugin\CMSPlugin.php:311
3   Joomla\CMS\Plugin\CMSPlugin->Joomla\CMS\Plugin\{closure}()   JROOT\libraries\vendor\joomla\event\src\Dispatcher.php:454
4   Joomla\Event\Dispatcher->dispatch()   JROOT\libraries\src\Application\EventAware.php:111
5   Joomla\CMS\Application\WebApplication->triggerEvent()   JROOT\components\com_jshopping\Controller\WtjshoppingfavoritesController.php:113
6   Joomla\Component\Jshopping\Site\Controller\WtjshoppingfavoritesController->view()   JROOT\components\com_jshopping\Controller\WtjshoppingfavoritesController.php:28
7   Joomla\Component\Jshopping\Site\Controller\WtjshoppingfavoritesController->display()   JROOT\libraries\src\MVC\Controller\BaseController.php:730
8   Joomla\CMS\MVC\Controller\BaseController->execute()   JROOT\components\com_jshopping\Controller\BaseController.php:44
9   Joomla\Component\Jshopping\Site\Controller\BaseController->execute()   JROOT\libraries\src\Dispatcher\ComponentDispatcher.php:143
10   Joomla\CMS\Dispatcher\ComponentDispatcher->dispatch()   JROOT\libraries\src\Component\ComponentHelper.php:361
11   Joomla\CMS\Component\ComponentHelper::renderComponent()   JROOT\libraries\src\Application\SiteApplication.php:217
12   Joomla\CMS\Application\SiteApplication->dispatch()   JROOT\libraries\src\Application\SiteApplication.php:271
13   Joomla\CMS\Application\SiteApplication->doExecute()   JROOT\libraries\src\Application\CMSApplication.php:304
14   Joomla\CMS\Application\CMSApplication->execute()   JROOT\includes\app.php:58
15   require_once()   JROOT\index.php:32
*

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
Я пока закрыл ссылку в модуле по условию на $digit = 0 . Но это не решает проблемку...
*

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
Конфлиетует вот с этим:
https://www.webdesigner-profi.de/joomla-webdesign/shop/addons/product-sorting-style.html?lang=en

А оно тоже удобное... для клиентов. Они не привыкли к стандартному (Joomshopping) виду сортировки товара.
*

kit2m2

  • Живу я здесь
  • 3366
  • 276 / 0
  • Беру сайты на полное сопровождение
Но при отсутствии товаров в списке, пункт меню выдает ошибку:
"Call to undefined method stdClass::getContext()"

Попробуйте заменить код котроллера - WtjshoppingfavoritesController.php
На этот:
Код
<?php
/**
 * WT JoomShopping Favorites is an alternative wish list (favorite products) for JoomShopping based on cookies.
 * @package     WT JoomShopping Favorite
 * @version     2.0.2
 * @Author      Sergey Tolkachyov, https://web-tolk.ru 
 * [member=126442]copyright[/member]   Copyright (C) 2024 Sergey Tolkachyov
 * @license     GNU/GPL 3.0
 * @since       1.0.0
 * @link        https://web-tolk.ru/en/dev/joomshopping/wt-joomshopping-favorite 
 */
namespace Joomla\Component\Jshopping\Site\Controller;

defined( '_JEXEC' ) or die( 'Restricted access' );

use Joomla\Component\Jshopping\Site\Model\Productlist;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Profiler\Profiler;
use Joomla\Registry\Registry;

class WtjshoppingfavoritesController extends BaseController
{
    public function display($cachable = false, $urlparams = false): void
    {
        !JDEBUG ?: Profiler::getInstance('Application')->mark('<strong>WT JoomShopping Favorites</strong>: '.__CLASS__.' '.__FUNCTION__.' start');
        $this->view();
        !JDEBUG ?: Profiler::getInstance('Application')->mark('<strong>WT JoomShopping Favorites</strong>: '.__CLASS__.' '.__FUNCTION__.' end');
    }

    public function view(): void
    {
        $jshopConfig = \JSFactory::getConfig();
        $app = Factory::getApplication();
        $lang = $app->getLanguage();
        $lang->load('plg_jshoppingproducts_wtjshoppingfavorites', JPATH_ADMINISTRATOR, null, true);
        PluginHelper::importPlugin('jshoppingproducts');
        $app->triggerEvent('onBeforeDisplayWtjshoppingfavorites', array(&$this));

        $view_name = 'wtjshoppingfavorites';
        $view_config = array('template_path' => JPATH_COMPONENT . '/templates/' . $jshopConfig->template . '/' . $view_name);
        $view = $this->getView($view_name, \JSHelper::getDocumentType(), '', $view_config);
        $view->setLayout('wtjshoppingfavorites');
        $view->config = $jshopConfig;

        $params = $app->getParams();
        $menuParams = new Registry();
        $menu = $app->getMenu()->getActive();
        if ($menu)
        {
            $menuParams->loadString($menu->getParams());
        }
        $mergedParams = clone $menuParams;
        $mergedParams->merge($params);

        $view->clear_favorites_btn_css_class = $mergedParams->get('clear_favorites_btn_css_class','btn btn-primary');
        $view->_tmp_list_products_html_start = '';
        $view->_tmp_list_products_html_end  = '';

        // исправление ошибки
        $product_list = new Productlist\ListModel();

        $product_ids_cookie = $app->getInput()->cookie->get('wtjshoppingfavorites', null, 'string');
        if (!empty($product_ids_cookie))
        {
            $product_ids = unserialize($product_ids_cookie);
            $product_ids = array_unique($product_ids);

            $products = array_reverse(
                $product_list->getLoadProducts(
                    ['products' => $product_ids],
                    'FIELD(prod.product_id, ' . implode(',', $product_ids). ')',
                    null,
                    0,
                    0,
                    1
                )
            );

            $view->rows = $products;
            $product_list->products = $products;

            $view->config->show_sort_product = '0'; // Отключаем показ фильтров и сортировки
            $view->config->show_count_select_products = '0';
            $view->template_block_list_product = $product_list->getTmplBlockListProduct();
            $view->template_no_list_product = $product_list->getTmplNoListProduct();
            $view->template_block_form_filter = $product_list->getTmplBlockFormFilter();
            $view->template_block_pagination = $product_list->getTmplBlockPagination();
            $view->count_product_to_row = $jshopConfig->count_products_to_row;
            $view->image_category_path = $jshopConfig->image_category_live_path;
            $view->noimage = $jshopConfig->noimage;
            $view->shippinginfo = \JSHelper::SEFLink($jshopConfig->shippinginfourl, 1);

            $view->total = $product_list->getTotal();
            $view->display_pagination = false;
            $review = \JSFactory::getTable('review');
            $view->allow_review = $review->getAllowReview();
        }
        else
        {
            $view->rows = [];
            $view->total = 0;
            $view->display_pagination = false;
        }

        \JSHelper::setMetaData(Text::_('PLG_WTJSHOPPINGFAVORITES'), '', $mergedParams->get('menu-meta_description'), $mergedParams);
        $app->triggerEvent('onBeforeDisplayProductListView', array(&$view, &$product_list));
        $app->triggerEvent('onBeforeDisplaywtjshoppingfavoritesView', array(&$view, &$product_list));
        $view->display();
    }
}

Кстати я передел шаблон сортировки на вывод кнопками - Вот переделанный аддон Product sorting style если нужно...
Ниже скрин как выглядит.
Расширения для JoomShopping | Ссылка на Телеграм-канал | Сайты и магазины под ключ: Дизайн, Верстка, Программирование (расширения на заказ), СЕО-оптимизация, Сопровождение, Перенос на Joomla 4+ (5+) и JoomShopping 5+
*

kit2m2

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

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
Извините, занимался другим проектом.
Да, спасибо! Работает норм. Теперь все отлично!

Осталось еще одно. Не проблема, но неприятно.
\components\com_jshopping\templates\<jshopping template>\wtjshoppingfavorites\wtjshoppingfavorites.php

Дает вот такое предупреждение:
Warning: Undefined property: Joomla\Component\Jshopping\Site\Model\Productlist\ListModel::$total in ...\components\com_jshopping\Model\Productlist\ListModel.php on line 464
*

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
И вот еще одна просьба.
Было бы хорошим тоном проинформировать юзера, что товар добавлен в список. Ну просто вывести системное сообщение при добавлении. Как в стандартном коде.
*

kit2m2

  • Живу я здесь
  • 3366
  • 276 / 0
  • Беру сайты на полное сопровождение
Дает вот такое предупреждение:
Поменяйте код контроллера на этот:
Код
<?php
/**
 * WT JoomShopping Favorites is an alternative wish list (favorite products) for JoomShopping based on cookies.
 * @package     WT JoomShopping Favorite
 * @version     2.0.2
 * @Author      Sergey Tolkachyov, https://web-tolk.ru 
 * [member=126442]copyright[/member]   Copyright (C) 2024 Sergey Tolkachyov
 * @license     GNU/GPL 3.0
 * @since       1.0.0
 * @link        https://web-tolk.ru/en/dev/joomshopping/wt-joomshopping-favorite 
 */
namespace Joomla\Component\Jshopping\Site\Controller;

defined( '_JEXEC' ) or die( 'Restricted access' );

use Joomla\Component\Jshopping\Site\Model\Productlist;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Profiler\Profiler;
use Joomla\Registry\Registry;

class WtjshoppingfavoritesController extends BaseController
{
    public function display($cachable = false, $urlparams = false): void
    {
        !JDEBUG ?: Profiler::getInstance('Application')->mark('<strong>WT JoomShopping Favorites</strong>: '.__CLASS__.' '.__FUNCTION__.' start');
        $this->view();
        !JDEBUG ?: Profiler::getInstance('Application')->mark('<strong>WT JoomShopping Favorites</strong>: '.__CLASS__.' '.__FUNCTION__.' end');
    }

    public function view(): void
    {
        $jshopConfig = \JSFactory::getConfig();
        $app = Factory::getApplication();
        $lang = $app->getLanguage();
        $lang->load('plg_jshoppingproducts_wtjshoppingfavorites', JPATH_ADMINISTRATOR, null, true);
        PluginHelper::importPlugin('jshoppingproducts');
        $app->triggerEvent('onBeforeDisplayWtjshoppingfavorites', array(&$this));

        $view_name = 'wtjshoppingfavorites';
        $view_config = array('template_path' => JPATH_COMPONENT . '/templates/' . $jshopConfig->template . '/' . $view_name);
        $view = $this->getView($view_name, \JSHelper::getDocumentType(), '', $view_config);
        $view->setLayout('wtjshoppingfavorites');
        $view->config = $jshopConfig;

        $params = $app->getParams();
        $menuParams = new Registry();
        $menu = $app->getMenu()->getActive();
        if ($menu)
        {
            $menuParams->loadString($menu->getParams());
        }
        $mergedParams = clone $menuParams;
        $mergedParams->merge($params);

        $view->clear_favorites_btn_css_class = $mergedParams->get('clear_favorites_btn_css_class','btn btn-primary');
        $view->_tmp_list_products_html_start = '';
        $view->_tmp_list_products_html_end  = '';

        // Исправление ошибки!
        $product_list = new Productlist\ListModel();

        $product_ids_cookie = $app->getInput()->cookie->get('wtjshoppingfavorites', null, 'string');
        if (!empty($product_ids_cookie))
        {
            $product_ids = unserialize($product_ids_cookie);
            $product_ids = array_unique($product_ids);

            $products = array_reverse(
                $product_list->getLoadProducts(
                    ['products' => $product_ids],
                    'FIELD(prod.product_id, ' . implode(',', $product_ids). ')',
                    null,
                    0,
                    0,
                    1
                )
            );

            $view->rows = $products;
            $product_list->products = $products; // У ListModel есть это свойство

            $view->config->show_sort_product = '0'; // Отключаем показ фильтров и сортировки
            $view->config->show_count_select_products = '0';
            $view->template_block_list_product = $product_list->getTmplBlockListProduct();
            $view->template_no_list_product = $product_list->getTmplNoListProduct();
            $view->template_block_form_filter = $product_list->getTmplBlockFormFilter();
            $view->template_block_pagination = $product_list->getTmplBlockPagination();
            $view->count_product_to_row = $jshopConfig->count_products_to_row;
            $view->image_category_path = $jshopConfig->image_category_live_path;
            $view->noimage = $jshopConfig->noimage;
            $view->shippinginfo = \JSHelper::SEFLink($jshopConfig->shippinginfourl, 1);

            //$view->total = $product_list->getTotal();
$view->total = count($products); // Используем реальное количество полученных товаров
            $view->display_pagination = false;
            $review = \JSFactory::getTable('review');
            $view->allow_review = $review->getAllowReview();
        }
        else
        {
            $view->rows = [];
            $view->total = 0; // Явно указываем 0 товаров
            $view->display_pagination = false;
        }

        \JSHelper::setMetaData(Text::_('PLG_WTJSHOPPINGFAVORITES'), '', $mergedParams->get('menu-meta_description'), $mergedParams);
        $app->triggerEvent('onBeforeDisplayProductListView', array(&$view, &$product_list));
        $app->triggerEvent('onBeforeDisplaywtjshoppingfavoritesView', array(&$view, &$product_list));
        $view->display();
    }
}
Расширения для JoomShopping | Ссылка на Телеграм-канал | Сайты и магазины под ключ: Дизайн, Верстка, Программирование (расширения на заказ), СЕО-оптимизация, Сопровождение, Перенос на Joomla 4+ (5+) и JoomShopping 5+
*

kit2m2

  • Живу я здесь
  • 3366
  • 276 / 0
  • Беру сайты на полное сопровождение
И вот еще одна просьба.
Было бы хорошим тоном проинформировать юзера, что товар добавлен в список. Ну просто вывести системное сообщение при добавлении. Как в стандартном коде.
Это уже к Сергею - @sergeytolkachyov https://web-tolk.ru, как к разработчику расширения
Расширения для JoomShopping | Ссылка на Телеграм-канал | Сайты и магазины под ключ: Дизайн, Верстка, Программирование (расширения на заказ), СЕО-оптимизация, Сопровождение, Перенос на Joomla 4+ (5+) и JoomShopping 5+
*

Alex_gs

  • Захожу иногда
  • 161
  • 2 / 0
Все супер! Спасибо! Теперь без ошибок.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Атрибуты полей при оформлении заказа в JoomShopping

Автор goga_pgasovav

Ответов: 1
Просмотров: 620
Последний ответ 12.08.2025, 11:21:29
от kit2m2
Конфликт js шаблонов JoomShaper helix3 J5 с JoomShopping 5

Автор heartlink

Ответов: 6
Просмотров: 1396
Последний ответ 22.07.2025, 12:40:12
от heartlink
Модуль карусели товаров JoomShopping на Swiper.js для Joomla

Автор sergeytolkachyov

Ответов: 2
Просмотров: 2038
Последний ответ 04.07.2025, 10:30:36
от sergeytolkachyov
[Решено] Сбросить счётчик ID товаров JoomShopping

Автор goga_pgasovav

Ответов: 3
Просмотров: 1350
Последний ответ 13.02.2025, 00:11:20
от goga_pgasovav
WT On fly image handler изображения товара JoomShopping в webp на лету

Автор sergeytolkachyov

Ответов: 13
Просмотров: 4368
Последний ответ 29.01.2025, 20:38:38
от sergeytolkachyov