Новости Joomla

Метод registerListeners() в CMSPlugin в плагинах планируется удалить в Joomla 7.0

Метод registerListeners() в CMSPlugin в плагинах  планируется удалить в Joomla 7.0

👩‍💻 Метод registerListeners() в CMSPlugin в плагинах планируется удалить в Joomla 7.0.Этот метод регистрирует устаревшие слушатели событий в диспетчере, имитируя работу плагинов Joomla! 3.x и ниже для Joomla 4+. По умолчанию этот метод ищет все общедоступные методы, название которых начинается с on. Он регистрирует лямбда-функции (замыкания), которые пытаются преобразовать аргументы отправленного события в аргументы вызова метода и вызвать ваш метод on<Что-то>. Результат передаётся обратно событию в его аргумент result.Теперь этот слой совместимости с устаревшей Joomla 3 помечен к удалению в Joomla 7.0, которая должна выйти осенью 2027 года. Это означает, что те уникальные расширения от Joomla 2.5 / Joomla 3, которые ещё работали на Joomla 4-6 скорее всего окончательно перестанут работать на Joomla 7. Предполагается, что активные разработчики планомерно и постепенно избавляются от технического долга и обновляют свои расширения. @joomlafeed#joomla #разработка #php

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

devirus

  • Захожу иногда
  • 140
  • 6 / 0
По умолчанию бестселлеры сортируются по общему количеству проданных товаров за все время.
При чем если пришел клиент и купил сразу 100000 лейкопластырей, они могут зависнуть в бестселлерах на несколько месяцев.

Кому как, возможно в разных тематиках по разному, но считаю такой подход не верным.
Бестселлеры должны считаться за некоторый период времени (допустим последние 2 недели). Плюс, количество купленное в одном заказе (т. е. одним человеком), не должно влиять на популярность этого товара (должен влиять только сам факт продажи).

Потому написал для себя такой плагин (это две разные версии).

Учитывать только продажи за последние 14 дней:
Код
function onBeforeQueryGetProductList($type, &$adv_result, &$adv_from, &$adv_query, &$order_query, &$filters){
        if ($type=="bestseller_products"){
            $adv_from .= "LEFT JOIN `#__jshopping_orders` AS orders ON OI.order_id = orders.order_id";
            $adv_query .= " AND orders.order_date > '" . date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")-14,   date("Y"))). "' ";
        }
}

Учитывать только продажи за последние 14 дней + не учитывать количество в заказе.
Чтобы не трогать исходник, пришлось вынести весь метод в onBeforeDisplayProductListView.

Код
function onBeforeDisplayProductListView(&$view){

        $count = 3;
        $tProduct = JTable::getInstance('product', 'jshop');
        $adv_result = $tProduct->getBuildQueryListProductDefaultResult();
        $adv_query = "";
        $adv_from = "";

        //Get bestsellers
        if (JRequest::getInt('category_id')){

            $jshopConfig = JSFactory::getConfig();
            $db = JFactory::getDBO();
            $array_categories = JRequest::getInt('category_id');
            $filters = array();

            $tProduct->getBuildQueryListProductSimpleList("best", $array_categories, $filters, $adv_query, $adv_from, $adv_result);

            $adv_from .= "LEFT JOIN `#__jshopping_orders` AS orders ON OI.order_id = orders.order_id";
            $adv_query .= " AND orders.order_date > '" . date("Y-m-d", mktime(0, 0, 0, date("m"), date("d")-14,   date("Y"))). "' ";
    
            $query = "SELECT SUM(1) as max_num, $adv_result FROM #__jshopping_order_item AS OI
                      INNER JOIN `#__jshopping_products` AS prod   ON prod.product_id=OI.product_id
                      INNER JOIN `#__jshopping_products_to_categories` AS pr_cat ON pr_cat.product_id = prod.product_id
                      LEFT JOIN `#__jshopping_categories` AS cat ON pr_cat.category_id = cat.category_id
                      $adv_from
                      WHERE prod.product_publish = '1' AND cat.category_publish='1' ".$adv_query."
                      GROUP BY prod.product_id
                      ORDER BY max_num desc LIMIT ".$count;
            $db->setQuery($query);
            $bestsellers = $db->loadObjectList();
            $bestsellers = listProductUpdateData($bestsellers);

            $view->assign('bestsellers', $bestsellers);

        }
    }

p. s. на самом деле выкладываю, чтобы более толковые люди проверили и, возможно, подсказали более правильное решение *DRINK*
« Последнее редактирование: 24.06.2014, 00:42:10 от devirus »
*

dmitry_stas

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

Код
NOW() - INTERVAL [b]14 DAY[/b]
1. движок форума не понимает BB-code внутри тега code.
2. обычно нет смысла грузить MySQL вычислением того, что можно сделать на PHP
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

devirus

  • Захожу иногда
  • 140
  • 6 / 0
Цитировать
вычислением того, что можно сделать на PHP
Дельный совет, разберусь с форматами дат и доработаю.

p. s. моя корыстность полезна миру :)

upd: поправил первый пост (дату считает php, а не mysql).
« Последнее редактирование: 24.06.2014, 00:42:59 от devirus »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Bestseller - не верный принцип работы

Автор threemonkeys

Ответов: 7
Просмотров: 1379
Последний ответ 18.12.2015, 02:57:58
от threemonkeys
К стандартному модулю поиска от разработчиков - немного полезностей

Автор kit2m2

Ответов: 0
Просмотров: 1193
Последний ответ 12.10.2013, 00:23:02
от kit2m2