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

Тема в разделе "Opencart", создана пользователем Ed71, 18 окт 2015.

Информация :
Внимание форумчане! При создании тем, или выкладывании какой-либо информации проверьте в какой ветке форума вы находитесь! Не путайте Opencart и Opencart2. При несоблюдении данного условия выносится соответствующее наказание! И потом не говорите что вас НЕ ПРЕДУПРЕЖДАЛИ! По возможности используйте обменники mail, yandex, google, dropbox, rghost Дабы избежать просьб перезалить и проблем с рекламой!
Модераторы: ZiX
  1. Ed71

    Ed71 Постоялец

    Регистр.:
    6 янв 2015
    Сообщения:
    99
    Симпатии:
    21
    Здравствуйте, на сайте http://stylishjewel.ru/ хотелось бы сделать вывод товаров случайным образом в модулях такие как : "Последние", "Акции", "Рекомендуемые", "Хиты продаж", допустим в админке задал лимит на 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. Когда я вставляю этот код для рекомендуемых в catalog/controller/module/product_tab.php
    таким образом
    Код:
                    $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
    И вкладка "Рекомендуемые" не появляется. Помогите, пожалуйста, доработать код до нужного функционала. Заранее огромное спасибо.
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    Ошибка появилась из-за того, что лимит для выборки больше, чем в массиве элементов. Плюс забыли предусмотреть случай с пустым массивом.

    Как-то так будет лучше:
    PHP:
    $countProduct count($products);
    $limit $countProduct $limit $limit $countProduct;
    $random_products = ($count == $limit) ? $products array_intersect_key($productsarray_flip(array_rand($products$limit)));
    Желательно это выносить в функцию (не знаю правда где в опенкарте файлик для глобально видимых функций), вместо того чтобы дублировать код в каждом файле.
     
    Ed71 нравится это.
  3. Ed71

    Ed71 Постоялец

    Регистр.:
    6 янв 2015
    Сообщения:
    99
    Симпатии:
    21
    latteo, спасибо Вам за ответ. Нашел сейчас вот такой вариант: https://opencartforum.com/topic/18785-rekomenduemye-randomno/page-2. Пишут, что полностью рабочий. Но у меня почему-то он опять не работает, когда прописываю этот код:
    Код:
    $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
     
  4. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    shuffle перемещает массив, потом делаем срез через array_slice - теоретически вариант такой же, на практике мы получим разное следование продуктов друг за другом в отличии от использования array_rand()
    Но если это не критично, то делаем примерно тоже самое:
    PHP:
    $countProduct count($products);
    $limit $countProduct $limit $limit $countProduct;
    $randRows $products;
    srand((float)microtime() * 1000000);
    $randRows = ($countProduct == $limit || $countProduct == || !shuffle($randRows)) ? $randRows array_slice($randRows0$limit);
    Вместо $limit подставляйте $setting['limit']
    Вместо $products во втором случае надо использовать $latest_results

    PS: первый вариант прикольней
     
    Ed71 нравится это.
  5. Ed71

    Ed71 Постоялец

    Регистр.:
    6 янв 2015
    Сообщения:
    99
    Симпатии:
    21
    Спасибо огромное за подсказку. Сделал таким образом:
    Код:
    $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
    И все заработало, как нужно.