Чередование товаров в "новинках", "рекомендуемых", "хитах продаж" и "акциях"

Ed71

Постоялец
Регистрация
6 Янв 2015
Сообщения
115
Реакции
23
Здравствуйте, на сайте Для просмотра ссылки Войди или Зарегистрируйся хотелось бы сделать вывод товаров случайным образом в модулях такие как : "Последние", "Акции", "Рекомендуемые", "Хиты продаж", допустим в админке задал лимит на 3 вывода, а самих товаров там 20-30, и что бы они случайным образом каждый раз менялись. Нашел вот такой образец рандомного вывода:
Код:
$this->data['products'] = array();
$products = explode(',', $this->config->get('featured_product'));

if (empty($setting['limit'])) {
   $setting['limit'] = 5;
}

$random_products = array();
$product_keys = array_rand($products,$setting['limit']);
foreach ($product_keys as $product_key) {
   $random_products[$product_key] = $products[$product_key];
}

$products = $random_products;
Но что-то не могу с ним разобраться. "Последние", "Акции", "Рекомендуемые", "Хиты продаж" выводятся у меня через вкладки товаров 4в1. Когда я вставляю этот код для рекомендуемых в Для просмотра ссылки Войди или Зарегистрируйся
таким образом
Код:
                $this->data['featured_products'] = array();

        $products = explode(',', $this->config->get('featured_product'));      

        if (empty($setting['limit'])) {
            $setting['limit'] = 5;
        }
      
        $random_products = array();
$product_keys = array_rand($products,$setting['limit']);
foreach ($product_keys as $product_key) {
   $random_products[$product_key] = $products[$product_key];
}

$products = $random_products;
То появляется ошибка
Код:
Warning: array_rand() [function.array-rand]: Second argument has to be between 1 and the number of elements in the array in /var/www/c381952/public_html/stylishjewel.ru/catalog/controller/module/product_tab.php on line 286Warning: Invalid argument supplied for foreach() in /var/www/c381952/public_html/stylishjewel.ru/catalog/controller/module/product_tab.php on line 287
И вкладка "Рекомендуемые" не появляется. Помогите, пожалуйста, доработать код до нужного функционала. Заранее огромное спасибо.
 
Ошибка появилась из-за того, что лимит для выборки больше, чем в массиве элементов. Плюс забыли предусмотреть случай с пустым массивом.

Как-то так будет лучше:
PHP:
$countProduct = count($products);
$limit = $countProduct > $limit ? $limit : $countProduct;
$random_products = ($count == $limit) ? $products : array_intersect_key($products, array_flip(array_rand($products, $limit)));

Желательно это выносить в функцию (не знаю правда где в опенкарте файлик для глобально видимых функций), вместо того чтобы дублировать код в каждом файле.
 
  • Нравится
Реакции: Ed71
latteo, спасибо Вам за ответ. Нашел сейчас вот такой вариант: Для просмотра ссылки Войди или Зарегистрируйся. Пишут, что полностью рабочий. Но у меня почему-то он опять не работает, когда прописываю этот код:
Код:
$this->data['latest_products'] = array();
     
        $latest_results = $this->model_catalog_product->getLatestProducts($setting['limit']);
//ADD
srand((float)microtime() * 1000000);
shuffle($results);
$results = array_slice($results, 0, $setting['limit']);
//END
то выдает вот такую ошибку:
Код:
Warning: shuffle() expects parameter 1 to be array, null given in /var/www/c381952/public_html/stylishjewel.ru/catalog/controller/module/product_tab.php on line 57Warning: array_slice() expects parameter 1 to be array, null given in /var/www/c381952/public_html/stylishjewel.ru/catalog/controller/module/product_tab.php on line 58
 
shuffle перемещает массив, потом делаем срез через array_slice - теоретически вариант такой же, на практике мы получим разное следование продуктов друг за другом в отличии от использования array_rand()
Но если это не критично, то делаем примерно тоже самое:
PHP:
$countProduct = count($products);
$limit = $countProduct > $limit ? $limit : $countProduct;
$randRows = $products;
srand((float)microtime() * 1000000);
$randRows = ($countProduct == $limit || $countProduct == 0 || !shuffle($randRows)) ? $randRows : array_slice($randRows, 0, $limit);

Вместо $limit подставляйте $setting['limit']
Вместо $products во втором случае надо использовать $latest_results

PS: Для просмотра ссылки Войди или Зарегистрируйся прикольней
 
  • Нравится
Реакции: Ed71
Спасибо огромное за подсказку. Сделал таким образом:
Код:
$this->data['latest_products'] = array();
    
        $latest_results = $this->model_catalog_product->getLatestProducts($setting['limit']);
//ADD
srand((float)microtime() * 1000000);
shuffle($latest_results);
$latest_results = array_slice($latest_results, 0, $setting['limit']);
//END
И все заработало, как нужно.
 
Назад
Сверху