Случайные товары на главной странице ПрестаШоп.
Сегодня мы разберемся как сделать показ случайных товаров в модуле homefeatured. Модуль отображает товары на главной странице и имеет несколько вариантов перевода-популярные товары, наши предложения, избранные товары, рекомендуемые товары на главной и другие. Давайте расширим функционал модуля и добавим возможность вывода случайных товаров.
По умолчанию в настройках модуля можно изменять только количество товаров.
Откроем основной файл модуля homefeatured.php текстовым редактором notepad++ и в методе install добавим новую переменную HOME_FEATURED_RANDOM
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
unction install()
{
$this->_clearCache('homefeatured.tpl');
Configuration::updateValue('HOME_FEATURED_NBR', 8);
Configuration::updateValue('HOME_FEATURED_RANDOM', 0);// Добавляем переменную для радио кнопок, по умолчанию =0 выключено
if (!parent::install()
|| !$this->registerHook('displayHome')
|| !$this->registerHook('header')
|| !$this->registerHook('addproduct')
|| !$this->registerHook('updateproduct')
|| !$this->registerHook('deleteproduct')
)
return false;
return true;
}('HOME_FEATURED_RANDOM', 0);
|
Значение ноль означает выключено по умолчанию.
Теперь чтобы работать в модуле с новой переменной добавляем ее в метод getContent()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public function getContent()
{
$output = '<h2>'.$this->displayName.'</h2>';
if (Tools::isSubmit('submitHomeFeatured'))
{
$nbr = (int)Tools::getValue('nbr');
if (!$nbr OR $nbr <= 0 OR !Validate::isInt($nbr))
$errors[] = $this->l('An invalid number of products has been specified.');
else
Configuration::updateValue('HOME_FEATURED_NBR', (int)($nbr));
Configuration::updateValue('HOME_FEATURED_RANDOM', (bool)Tools::getValue('HOME_FEATURED_RANDOM'));// переменная в функциональном блоке
if (isset($errors) AND sizeof($errors))
$output .= $this->displayError(implode('<br />', $errors));
else
$output .= $this->displayConfirmation($this->l('Your settings have been updated.'));
}
return $output.$this->displayForm();
}
|
А в метод displayForm добавляем html форму с радио кнопами
1
2
3
4
5
6
7
8
|
<label>'.$this->l('Random').'</label>
<div class="margin-form">
<input type="radio" name="HOME_FEATURED_RANDOM" id="HOME_FEATURED_RANDOM_on" value="1" '.(Tools::getValue('HOME_FEATURED_RANDOM', Configuration::get('HOME_FEATURED_RANDOM')) ? 'checked="checked"' : '').' />
<label class="t" for="HOME_FEATURED_RANDOM_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Yes').'" title="'.$this->l('Yes').'" /></label>
<input type="radio" name="HOME_FEATURED_RANDOM" id="HOME_FEATURED_RANDOM_off" value="0" '.(Tools::getValue('HOME_FEATURED_RANDOM', Configuration::get('HOME_FEATURED_RANDOM')) ? '' : 'checked="checked"').' />
<label class="t" for="HOME_FEATURED_RANDOM_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('No').'" title="'.$this->l('No').'" /></label>
<p>'.$this->l('Enable or disable random products.').'</p>
</div>
|
Если сбросить или установить модуль то в настройках появиться радио кнопки включения и отключения отображения случайных товаров.
С настройкой модуля в бэк-офисе закончили, чтобы товары выводились в случайном порядке в шаблоне модуля необходимо в функции hookDisplayHome отвечающей за вывод товаров на главной странице сделать следующие изменения.
Меняем условия
1
|
if (!$this->isCached('homefeatured.tpl', $this->getCacheId('homefeatured')))
|
на
1
2
3
4
|
if (Configuration::get('HOME_FEATURED_RANDOM'))
$random = true;
else
$random = false;
|
И для объявленной переменной $product добавляем условия вывода товаров в случайной последовательности в зависимости включена или выключена объявленная переменная $random
1
|
$products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 8),null,null,false,true,$random,($nb ? $nb : 8));
|
Наконец в строке
1
|
return $this->display(__FILE__, 'homefeatured.tpl'/*, $this->getCacheId('homefeatured')*/);//комментируем, т.к. поменялись условия
|
комментируем часть кода.
Готово.
Полный код с исправлениями и комментариями
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
<?php
/*
* 2007-2013 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2013 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
if (!defined('_PS_VERSION_'))
exit;
class HomeFeatured extends Module
{
private $_html = '';
private $_postErrors = array();
function __construct()
{
$this->name = 'homefeatured';
$this->tab = 'front_office_features';
$this->version = '1.1';
$this->author = 'PrestaShop';
$this->need_instance = 0;
parent::__construct();
$this->displayName = $this->l('Featured products on the homepage.');
$this->description = $this->l('Displays featured products in the middle of your homepage.');
}
function install()
{
$this->_clearCache('homefeatured.tpl');
Configuration::updateValue('HOME_FEATURED_NBR', 8);
Configuration::updateValue('HOME_FEATURED_RANDOM', 0);// Добавляем переменную для радиокнопок, по умолчанию =0 выключено
if (!parent::install()
|| !$this->registerHook('displayHome')
|| !$this->registerHook('header')
|| !$this->registerHook('addproduct')
|| !$this->registerHook('updateproduct')
|| !$this->registerHook('deleteproduct')
)
return false;
return true;
}
public function uninstall()
{
$this->_clearCache('homefeatured.tpl');
return parent::uninstall();
}
public function getContent()
{
$output = '<h2>'.$this->displayName.'</h2>';
if (Tools::isSubmit('submitHomeFeatured'))
{
$nbr = (int)Tools::getValue('nbr');
if (!$nbr OR $nbr <= 0 OR !Validate::isInt($nbr))
$errors[] = $this->l('An invalid number of products has been specified.');
else
Configuration::updateValue('HOME_FEATURED_NBR', (int)($nbr));
Configuration::updateValue('HOME_FEATURED_RANDOM', (bool)Tools::getValue('HOME_FEATURED_RANDOM'));// переменная в функциональном блоке
if (isset($errors) AND sizeof($errors))
$output .= $this->displayError(implode('<br />', $errors));
else
$output .= $this->displayConfirmation($this->l('Your settings have been updated.'));
}
return $output.$this->displayForm();
}
public function displayForm()
//Добавляем форму радио кнопок
/*<label>'.$this->l('Random').'</label>
<div class="margin-form">
<input type="radio" name="HOME_FEATURED_RANDOM" id="HOME_FEATURED_RANDOM_on" value="1" '.(Tools::getValue('HOME_FEATURED_RANDOM', Configuration::get('HOME_FEATURED_RANDOM')) ? 'checked="checked"' : '').' />
<label class="t" for="HOME_FEATURED_RANDOM_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Yes').'" title="'.$this->l('Yes').'" /></label>
<input type="radio" name="HOME_FEATURED_RANDOM" id="HOME_FEATURED_RANDOM_off" value="0" '.(Tools::getValue('HOME_FEATURED_RANDOM', Configuration::get('HOME_FEATURED_RANDOM')) ? '' : 'checked="checked"').' />
<label class="t" for="HOME_FEATURED_RANDOM_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('No').'" title="'.$this->l('No').'" /></label>
<p>'.$this->l('Enable or disable random products.').'</p>
</div>
<div class="clear"> </div> */
{
$output = '
<form action="'.Tools::safeOutput($_SERVER['REQUEST_URI']).'" method="post">
<fieldset><legend><img src="'.$this->_path.'logo.gif" alt="" title="" />'.$this->l('Settings').'</legend>
<p>'.$this->l('To add products to your homepage, simply add them to the "home" category.').'</p><br />
<label>'.$this->l('Define the number of products to be displayed.').'</label>
<div class="margin-form">
<input type="text" size="5" name="nbr" value="'.Tools::safeOutput(Tools::getValue('nbr', (int)(Configuration::get('HOME_FEATURED_NBR')))).'" />
<p class="clear">'.$this->l('Define the number of products that you would like to display on homepage (default: 8).').'</p>
</div>
<!-- Добавленная форма радиокнопок -->
<label>'.$this->l('Random').'</label>
<div class="margin-form">
<input type="radio" name="HOME_FEATURED_RANDOM" id="HOME_FEATURED_RANDOM_on" value="1" '.(Tools::getValue('HOME_FEATURED_RANDOM', Configuration::get('HOME_FEATURED_RANDOM')) ? 'checked="checked"' : '').' />
<label class="t" for="HOME_FEATURED_RANDOM_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Yes').'" title="'.$this->l('Yes').'" /></label>
<input type="radio" name="HOME_FEATURED_RANDOM" id="HOME_FEATURED_RANDOM_off" value="0" '.(Tools::getValue('HOME_FEATURED_RANDOM', Configuration::get('HOME_FEATURED_RANDOM')) ? '' : 'checked="checked"').' />
<label class="t" for="HOME_FEATURED_RANDOM_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('No').'" title="'.$this->l('No').'" /></label>
<p>'.$this->l('Enable or disable random products.').'</p>
</div>
<div class="clear"> </div>
<center><input type="submit" name="submitHomeFeatured" value="'.$this->l('Save').'" class="button" /></center>
</fieldset>
</form>';
return $output;
}
public function hookDisplayHeader($params)
{
$this->hookHeader($params);
}
public function hookHeader($params)
{
$this->context->controller->addCSS(($this->_path).'homefeatured.css', 'all');
}
public function hookDisplayHome($params)
{
/*Меняем условия*/
/*if (!$this->isCached('homefeatured.tpl', $this->getCacheId('homefeatured')))*/
/*НА*/
if (Configuration::get('HOME_FEATURED_RANDOM'))
$random = true;
else
$random = false;
{
$category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);
$nb = (int)Configuration::get('HOME_FEATURED_NBR');
// добавили в переменную ,null,null,false,true,$random,($nb ? $nb : 8) выбор случайного товара при включенной опции
$products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 8),null,null,false,true,$random,($nb ? $nb : 8));
$this->smarty->assign(array(
'products' => $products,
'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
));
}
return $this->display(__FILE__, 'homefeatured.tpl'/*, $this->getCacheId('homefeatured')*/);//комментируем, т.к. поменялись условия
}
public function hookAddProduct($params)
{
$this->_clearCache('homefeatured.tpl');
}
public function hookUpdateProduct($params)
{
$this->_clearCache('homefeatured.tpl');
}
public function hookDeleteProduct($params)
{
$this->_clearCache('homefeatured.tpl');
}
}
|
Сбрасываем или устанавливаем модуль и наслаждаемся. При обновлении страницы в случайном порядке будут меняться до 8 товаров.
До встречи на https://webnewbie.ru/
Скопировал готовый код, в модуле появилась настройка рандома, а вот страница сайта открывается белым листом и все. Что делать?
Вернуть все обратно как было. Модуль использовался из версии 1.5.6.1. Если у вас другая версия, то замените свой модуль на модуль из указанной версии. Либо делайте по аналогии на своем модуле, но не бездумно копируйте код. Как вариант, можете еще почистить кэш магазина.
На странице сайта товары под этим модулем отображаются как избранные товары. Можно поменять это название на популярные товары?
В ПрестаШоп есть возможность изменять любой текст в бэк-офисе. Локализация-переводы-перевод установленных модулей. Задаете поиск Ctrl+F вставляете “избранные товары” и меняете на “популярные товары”
Спасибо за статью!
А как например сделать, точнее что нужно менять в коде, чтобы этот модуль отображал товары из определенной категории? Например я хочу вывести на главную все товары в НАЛИЧИИ. Я создам категорию “Товары в наличии”, но уберу её от глаз пользователей, то есть скрою эту категорию, но хотелось бы чтобы все товары этой категории выводились на главной через существующий модуль. Понимаю что копать нужно в методе hookDisplayHome где и определяется ИД категории, но что именно нужно менять, в этом и вопрос? Заранее благодарен!
Замените строку
[php]$category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);[/php]
На
[php]$category = new Category(тут номер категории, (int)Context::getContext()->language->id);[/php]
Не забудьте поменять цифрой комментарий.
Все получилось!
Спасибо!
Поправил наименование этого блока. Сбросил. Блок пропал с главной.
Отключал-выключал.
Как его туда вернуть?
Изменения в названиях блоков и т.д. лучше производить с помощью перевода в бэк-офисе. Скорее всего с изменением наименования вы зацепили какой то знак, может кавычку или тег или правили файл обычным блокнотом. Для того чтобы вернуть все обратно следует вернуть первоначальный файл и сделать все заново по правилам.
я только изменил перевод в бэкофисе названия блока. После сохранения изменений в переводе, ничего на главной не изменилось. Я сбросил блок. Он пропал.
Я не открывал блокнотом, ничего не правил в файлах. Я только сейчас нашел эту папку homefeatured в папке “модули” , удалил её и опять скопировал из бэкапа.
Ничего не изменилось, блок пропал. Хотя стоит в бэкофисе включенным.
Все кэши отключены, включена принудительная перекомпиляция.
В чем может быть дело?
Только изменил 1 фразу без всяких тегов и сбросил блок.
Задавая вопрос на этой странице, касающейся изменений в модуле homefeatured, Вы ввели меня в заблуждение. Что касается случая с изменением в переводе ответить однозначно не получиться. Это все равно, что если бы Вы обратились к доктору с вопросом о головной боли, которая у не проходит после принятия цитрамона. Ищите фрилансера, который бы смог найти причину бага.
Здравствуйте Евгений.
Код в файле homefeatured.php не совсем похож на Ваш. Подскажите пожалуйста , как мне его исправить , чтобы получить случайный вывод.В программировании я аматор. Большое спасибо за помощь .
Мой код :….
Не надо мне сюда вставлять код модуля, просто напишите, что и используете модуль из версии 1.6. Тема избита и давно бы нашли решение в сети.
Для случайного вывода товаров замените метод
[php]public function hookDisplayHome($params)
{
if (!$this->isCached(‘homefeatured.tpl’, $this->getCacheId()))
{
$this->_cacheProducts();
$this->smarty->assign(
array(
‘products’ => HomeFeatured::$cache_products,
‘add_prod_display’ => Configuration::get(‘PS_ATTRIBUTE_CATEGORY_DISPLAY’),
‘homeSize’ => Image::getSize(ImageType::getFormatedName(‘home’)),
)
);
}
return $this->display(__FILE__, ‘homefeatured.tpl’, $this->getCacheId());
}[/php]
на
[php]public function hookDisplayHome($params)
{
$category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);
$nb = (int)(Configuration::get(‘HOME_FEATURED_NBR’));
$products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 10), ‘date_add’, ‘DESC’, false, true, true, $nb);
shuffle($products);
$this->smarty->assign(
array(
‘products’ => $products,
‘add_prod_display’ => Configuration::get(‘PS_ATTRIBUTE_CATEGORY_DISPLAY’),
‘homeSize’ => Image::getSize(‘home_default’),
)
);
return $this->display(__FILE__, ‘homefeatured.tpl’);
}[/php]
Простите – на Главной (в шаблоне Presta shop 1.6) товары скрыты. Только нажав на кнопку “Популярное” – открываются тов. предложения. Как поменять код чтобы предложения были сразу на сайте открыты. Заранее спасибо.
Код отправляю, возможно его менять в этой функции??
[php]
public function hookDisplayHomeTab($params)
{
if (!$this->isCached(‘tab.tpl’, $this->getCacheId(‘homefeatured-tab’)))
$this->_cacheProducts();
return $this->display(__FILE__, ‘tab.tpl’, $this->getCacheId(‘homefeatured-tab’));
}
public function hookDisplayHome($params)
{
$category = new Category(Context::getContext()->shop->getCategory(), (int)Context::getContext()->language->id);
$nb = (int)(Configuration::get(‘HOME_FEATURED_NBR’));
$products = $category->getProducts((int)Context::getContext()->language->id, 1, ($nb ? $nb : 10), ‘date_add’, ‘DESC’, false, true, true, $nb);
shuffle($products);
$this->smarty->assign(
array(
‘products’ => $products,
‘add_prod_display’ => Configuration::get(‘PS_ATTRIBUTE_CATEGORY_DISPLAY’),
‘homeSize’ => Image::getSize(‘home_default’),
)
);
return $this->display(__FILE__, ‘homefeatured.tpl’);
}
public function hookDisplayHomeTabContent($params)
{
return $this->hookDisplayHome($params);
}
public function hookAddProduct($params):
[/php]
Тут код менять не надо, все делается программными настройками.Зайдите в управление хуками модуля и удалите модуль из хука hookDisplayHomeTab.
Я зашел в панель управления в меню расположение блоков и удалил там модуль товары на Главной в .
displayHomeTab. Там было 4-е модуля, осталось 3 шт Новые товары, блок скидок и лидеры продаж.
После удаления модуля из displayHomeTab – товары на Главной исчезли с главной страницы сайта вместе с кнопкой “Популярное”.
Что-то еще надо сделать, чтобы они отобразились?? Или подождать?? Вообще изменения на сайт иногда падают через мин. 20 (это связано с кэшированием..)
И заранее благодарю за помощь))
Меню “Управления хуками” в преста 1.6 не нашел, поэтому удалял модуль в меню расположение блоков. Если сделал ошибку уточните пож. как исправить.
Первый ответ был в теории, а на практике нужно еще удалить в модуле хук displayHomeTabContent и установит модуль в хуке displayHome. Управление хуками происходит в настройках модуля, сверху зеленое меню, там вкладка Управление хуками. Самый простой способ восстановить все что Вы натворили-это переустановить все вышеперечисленные Вами модули.
Огроменнное спаСИбоо))) Вы не представляете – 2-а дня парило. Думал код менять надо. Спасибо)) Вы гений presta shop))
Спасибо за отзыв, но увы, я не гений. Это все стандартные навыки, которыми должен владеть каждый пользователь PrestaShop. Практикуйтесь и все у Вас будет получаться
Приветствую. Может Вы подскажете, как сделать чтобы на главной странице отображение Новинок, Популярных товаров и Рекомендуемых было как на скриншоте prntscr.com/7anbe3
Уже чего только не пробовал. В дефолтной теме их нельзя вывести одна под другой, или это я просто не смог разобраться.
prntscr.com/7anc7c
Почитайте комментарии выше, я уже отвечал на этот вопрос