Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Всем хорошего дня!

 

Появилось желание выводить рандомно позиции из раздела "Рекомендуемые"

Например, я выбрал 40 товаров как рекомендуемые... Вывожу на сайт 28. Нужно чтобы при каждом обновлении главной, товары выводились в разной последовательности. Таким образом не будет казаться, что ничего нового не происходит.

 

Есть у кого идеи?

 

Благодарю!

Ссылка на сообщение
Поделиться на другие сайты

СПОСОБ №1
Откройте файл api/Products.php и найдите строчку:

$order = 'p.position DESC'; 

и замените ее на вот такой код:

if(isset($filter['order'])){
$order = $filter['order'];
}
else
{
$order = 'p.position DESC';
}

Далее в шаблоне main.tpl найдите строку {get_featured_products var=featured_products} и замените ее на вот эту {get_featured_products var=featured_products order='RAND()'}.

СПОСОБ №2
Откройте файл api/Products.php и найдите такие строки:

case 'position':
$order = 'p.position DESC';
break;

сразу после этих строк добавьте вот этот код:

case 'rand':
$order = 'RAND()';
break;

Далее в шаблоне main.tpl найдите строку {get_featured_products var=featured_products} и замените ее на вот эту {get_featured_products var=featured_products sort='rand'}


Оба способа проверил, работает на версии 2.3.6, скорее всего и на более ранних версиях тоже будет работать.

Оригинал статьи по адресу http://simpla-addons.org/blog/modules/2xx-vyvod-tovarov-v-sluchajnom-poryadke

Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

 

Откройте файл api/Products.php и найдите строчку:

$order = 'p.position DESC';
и замените ее на вот такой код:
if(isset($filter['order']))
{
	$order = $filter['order'];
}
else
{
	$order = 'p.position DESC';
}
Далее в шаблоне main.tpl найдите строку {get_featured_products var=featured_products} и замените ее на вот эту {get_featured_products var=featured_products order='RAND()'}

Проверил работает на версии 2.3.6, скорее всего и на более ранних версиях тоже будет работать.

Благодарю!

Ссылка на сообщение
Поделиться на другие сайты

Простой способ: в файле view/View.php внутри функции get_featured_products_plugin заменить

 

			foreach($this->products->get_products($params) as $p)
				$products[$p->id] = $p;


на

		$query = "SELECT p.*, b.name as brand, b.url as brand_url
				FROM __products p LEFT JOIN __brands b ON p.brand_id = b.id
				WHERE p.visible AND p.featured 
				ORDER BY rand() limit 28";
		$this->db->query($query);
		$products=$this->db->results();

Изменено пользователем Kors
Ссылка на сообщение
Поделиться на другие сайты

Простой способ: в файле view/View.php внутри функции get_featured_products_plugin заменить

 

 

			foreach($this->products->get_products($params) as $p)
				$products[$p->id] = $p;


[/code]
на
[code=auto:0]
		$query = "SELECT p.*, b.name as brand, b.url as brand_url
				FROM __products p LEFT JOIN __brands b ON p.brand_id = b.id
				WHERE p.visible AND p.featured 
				ORDER BY rand() limit 28";
		$this->db->query($query);
		$products=$this->db->results();

 

 

Корс ты хоть понимаешь структуру MVC и понимаешь почему твой способ не рационален и не правильный?

И зачем в запросе выбираются бренды?

Топорное решение.

Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

Корс ты хоть понимаешь структуру MVC и понимаешь почему твой способ не рационален и не правильный?

И зачем в запросе выбираются бренды?

Топорное решение.

 

Насчет рациональности и правильности - есть разные мнения и понятия, можно разводить длинные дискуссии. Думаю, не стоит.

 

Вместо этого отмечу простой факт, что Вы - большой спец по структуре MVC - похоже, даже не подозреваете, что Ваш способ тоже вызывает подобный запрос, в котором выбираются бренды...

Ссылка на сообщение
Поделиться на другие сайты

Насчет рациональности и правильности - есть разные мнения и понятия, можно разводить длинные дискуссии. Думаю, не стоит.

Да можно и верстку тупо в контроллере зафигачить, красота то какая будет :D

Я думаю ты корс сделал лишь бы было и на скорую руку.

Вместо этого отмечу простой факт, что Вы - большой спец по структуре MVC - похоже, даже не подозреваете, что Ваш способ тоже вызывает подобный запрос, в котором выбираются бренды...

Мой способ не вызывает никаких запросов, а вот способ Дениса в функции get_products действительно это делает.

Я почему подчеркнул вопрос про выборку брендов: потому что на главной странице они не нужны, а ты их насильно Корс выбираешь.

Суть ясна?

Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

Мой способ не вызывает никаких запросов, а вот способ Дениса в функции get_products действительно это делает.

Похоже, Вы ориентируетесь еще меньше, чем мне казалось.

Неужто не видите, что Ваш способ вызывает get_products(), а эта функция - вызывает запрос с брендами?

Или всерьез считаете, что Вашему способу запросы не нужны, он без них работает, волшебным образом неизвестно как из базы данные извлекает?

Я почему подчеркнул вопрос про выборку брендов: потому что на главной странице они не нужны, а ты их насильно Корс выбираешь.

Суть ясна?

Суть ясна - Вы упорно не хотите понимать простой вещи: в одних случаях в одних шаблонах на главной бренды нужны, в других - нет. Должно быть, Вы до сих пор работали лишь с такими, где не это не использовалось.

Обычно человек, если не ездил никогда в парижском метро, не доказывает темпераментно, что парижского метро не существует.

 

Кроме того, Ваш метод в итоге тоже насильно выбирает бренды и они тоже доступны в шаблоне - должно, не догадались проверить...

 

И если для Вас это сильно важно, в моем топорном методе очень легко убрать извлечение данных по брендам, и запрос станет лишь проще. А вот можно это легко сделать  в Вашем -  сильно сомневаюсь...

Ссылка на сообщение
Поделиться на другие сайты

Корс мой метод всего лишь сортирует товары в рандомном порядке, а вот выборка брендов и товаров происходит стандартно в функциях которые написал Пикусов, конечно же не я их писал.

С чего ты взял что ТС нужны бренды для товаров на главной странице сайта?

Корс может ты мысли заказчика умеешь угадывать?

Ссылка на сообщение
Поделиться на другие сайты

Корс мой метод всего лишь сортирует товары в рандомном порядке, а вот выборка брендов и товаров происходит стандартно в функциях которые написал Пикусов, конечно же не я их писал.

С чего ты взял что ТС нужны бренды для товаров на главной странице сайта?

Корс может ты мысли заказчика умеешь угадывать?

Я такого не писал нигде.

Похоже, Ваш довольно бессмысленный встречный вопрос - очередная попытка уклониться от ТОЧНЫХ ответов на мои вопросы...

И еще этим свои вопросом Вы опять выказываете неосведомленность о том, что стандартно в Simpla на главной в шаблонах списков товаров бренды ДОСТУПНЫ.

Ссылка на сообщение
Поделиться на другие сайты

Ну да бренды по стандарту доступны при выводе товаров на главной, категории и в корзине, я и не говорю что не доступны.

Корс тебе что в лоб что по лбу, ничего понять не можешь, ведешь себя как робот который должен точно, идеально знать чтобы принять и\или выполнить какое то решение.

P.S. Мой вариант все же лучше и рациональней твоего.

Ссылка на сообщение
Поделиться на другие сайты

P.S. Мой вариант все же лучше и рациональней твоего.

Если б Вы еще умели обосновывать свое мнение. А пока - на мои аргументы и вопросы по сути ответов не даете. Осталась у Вас только твердая позиция - мол, у меня все равно лучше.

 

Это тоже интересный вопрос - сравнить два варианта.

BN. Вариант Noxtrea-a: сделано изменение в API, позволяющее вызывать стандартную get_products() c нужной сортировкой плюс изменение в шаблоне для вызова get_featured_products с нужным параметром.

BK. Вариант Kors-a: сделано запрос напрямую в view/View.php.

В чем разница:

1. BN - изменения в двух местах, BK - в одном. Это мелочь.

2. В реальности BN делает практически те же действия и тот же запрос, что и BK. Только BK - делает его прямо и прозрачно, а BN - приспосабливает под те функции API, с которыми умеет работать. Тут BK даже работает малость быстрее, так как экономит на дополнительных вызовах. Но по большому счету - это тоже мелочевка, разница невелика.

3. Плюс BK - в прозрачности запроса, его легко менять, например, удалить бренды, если не нужны, или удалить ненужные поля. В случае BN из-за бюрократизированности API сделать такие изменения практически невозможно.

В итоге - оба метода в реальности делают одно и то же. Разница не столь уж существенна.

 

А претензии от Noxter-а - это как претензия городского жителя к сельскому в том, что тот сорвал огурец с грядки и ест. А по правилам так нельзя - надо его покупать в магазине. Это все от разницы в кругозоре - сельский знает, что огурец в городской магазин попадает с грядки, а городской - увы, нет...

 

Когда я писал свой метод, не был уверен, что он совсем правильный. Привлекла простота, о которой я сразу сказал в посте. А теперь, благодаря претензиям Noxter-а, вижу, что мой метод намного лучше, чем я думал сначала. Спасибо, Noxter, заставил задуматься и проанализировать...

Изменено пользователем Kors
Ссылка на сообщение
Поделиться на другие сайты

Во первых мой вариант можно использовать для любого вывода товаров (новинки, рекомендуемые, акционные, пофик любой фильтр) без нужды несколько раз править код в функциях View, в то время как в варианте Корса нужно будет дополнительно дописывать код в каждой функции View (get_featured_products_plugin, get_new_products_plugin, get_discounted_products_plugin), что не есть рационально и просто (как заявил Корс постом выше).

Во вторых кто тебя корс учил в структуре MVC использовать запросы к БД прямо в контроллере, а не в модели?

Это неправильно, не логично и сделано на "лишь бы считалось".

P.S. Если не в курсе что является моделью в симпле так я подскажу, к примеру для товаров это файл api/Products.php, в нем и должны быть написаны запросы к БД, а не в контроллере (ProductsView.php или View.php).

Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

Спасибо за разъяснения.

Если взять за аксиому то, что надо непременно придерживаться стандарта, то, конечно, Вы правы.

А если смотреть более широко и во главу угла ставить сайт и его работу, то тут все выглядит иначе.

 

Конечно, мой метод идейно неправильный - с точки зрения MVC. Но в реальности он лучше - с точки зрения сайта.

Вот Вы уже поднимали вопрос - мол, зачем бренды. Я дал ответ - с легкостью можно убрать. А в Вашем методе убрать нельзя, по крайней мере легко и просто.

Другой аспект - Вы прицепились к брендам, а тот же вопрос ведь можно поставить и про другие поля. Например, описания - они явно не нужны, однако Ваш метод вместе со стандартным API убрать их не дает. А в моем методе - вопрос решается элементарно.

 

В том API, которому Вы поклоняетесь, имеется масса нерациональностей. И поэтому я для улучшения работы сайта довольно часто применяю приемы, подобные обсуждаемому - формально неправильные, но на деле улучшающие работу сайта.

Мне приятнее огурчик с грядки, несмотря на то, что выглядит он зачастую не так презентабельно, как в магазине. Впрочем, на вкус и цвет товарища нет...

 

Вот Вы пишете "дополнительно дописывать код в каждой функции View (get_featured_products_plugin, get_new_products_plugin, get_discounted_products_plugin)". Само существование этих трех функций, похожих, как близнецы-братья, это одна из нерациональностей, и, я бы сказал, позор для создателя. Известно про это давно, даже решения хорошие выкладывались, исправляется несложно, однако все по-прежнему...

Стараться до блеска отчистить старую кастрюлю - совсем не хочется...

Ссылка на сообщение
Поделиться на другие сайты

Да в симпле много топорных реализаций, методов и прочего с этим я согласен, но делать и дальше такие же не рациональные вещи крайне нелепо.

Я не прицепился к брендам, я спросил зачем их выбирать когда они могут и вовсе не нужны быть, за 5 лет практики с симплой я встречал единицы магазинов у которых бренд используется на выводе в товаре на главной.

Например, описания - они явно не нужны, однако Ваш метод вместе со стандартным API убрать их не дает.

Ну а причем тут описания? Описания товаров хранятся в одной таблице как и название, урл прочее товара и выбираются ВСЕ поля в симпле стандартно, нет возможности что либо исключить, в то же время бренды находятся в другой таблице и чтобы их выбрать нужно выполнить LEFT JOIN даже тогда, когда они вовсе не нужны.

Почему так реализовано можешь спросить у Пикусова, так же можешь задать ему лично вопросы о нерациональной симпле.

 

P.S. Я не поклоняюсь никакому API, это бред сивой кобылы.

Ссылка на сообщение
Поделиться на другие сайты

Да в симпле много топорных реализаций, методов и прочего с этим я согласен, но делать и дальше такие же не рациональные вещи крайне нелепо.

Я не прицепился к брендам, я спросил зачем их выбирать когда они могут и вовсе не нужны быть, за 5 лет практики с симплой я встречал единицы магазинов у которых бренд используется на выводе в товаре на главной.Ну а причем тут описания? Описания товаров хранятся в одной таблице как и название, урл прочее товара и выбираются ВСЕ поля в симпле стандартно, нет возможности что либо исключить, в то же время бренды находятся в другой таблице и чтобы их выбрать нужно выполнить LEFT JOIN даже тогда, когда они вовсе не нужны.

Почему так реализовано можешь спросить у Пикусова, так же можешь задать ему лично вопросы о нерациональной симпле.

Так что выходит в итоге?

1. Метод Noxter-а BN выбирает бренды и описания. Это нерациональность. Но Вы ее оправдываете тем, что она заложена в API, и изменить ее при Вашем подходе нет возможности.

2. Метод Kors-а BK - гибкий, позволяете легко добавлять-удалять выбор тех или иных полей.

 

BK - выходит по скорости, простоте, возможностям модификации лучше.

BK - имеет лишь один недостаток - не следует некоторым правилам построения Simpla.

BK - зато позволяет в данном конкретном месте исправить недостатки Simpla - выбор избыточных данных.

 

BK - по-моему, это естественно - уходить от стандартов Simpla, чтобы исправить ее недостатки.

BN - а тут подход другой, довольно странный - непременно придерживаться стандартов Simpla, даже если это ухудшает работу.

Ссылка на сообщение
Поделиться на другие сайты

ВК - недостаток еще в том что если наделать таких вариантов - несколько то в случае изменения БД (добавления удаления полей) Нужно будет опять искать эти запросы и менять их...

ВК - убивает ключи в $products и дальнейшее получение вариантов будет невозможно. Нужно как минимум не заменять код:

foreach($this->products->get_products($params) as $p)
    $products[$p->id] = $p;

а изменить.

Ссылка на сообщение
Поделиться на другие сайты

ВК - недостаток еще в том что если наделать таких вариантов - несколько то в случае изменения БД (добавления удаления полей) Нужно будет опять искать эти запросы и менять их...

В текущем варианте стоит SELECT p.* и такой проблемы нет.

Если же явно написать список полей, то, конечно, добавлять новые придется.

А про удаление полей - по-моему, это вообще действие крайне редкое.

Тут уж приходится выбирать - всегда чем-то приходится жертвовать. Полного идеала обычно не бывает.

Но в BK - по крайней мере есть выбор, в BN - все жестко по стандартам, запланировано в Simpla всегда вытаскивать ВСЕ поля, нужные и ненужные, и ничего с этим поделать нельзя...

ВК - убивает ключи в $products и дальнейшее получение вариантов будет невозможно.

Вы правы. Но это легко исправляется парой стандартных строк.
Ссылка на сообщение
Поделиться на другие сайты

В текущем варианте стоит SELECT p.* и такой проблемы нет.

Если же явно написать список полей, то, конечно, добавлять новые придется.

А про удаление полей - по-моему, это вообще действие крайне редкое.

Тут уж приходится выбирать - всегда чем-то приходится жертвовать. Полного идеала обычно не бывает.

Но в BK - по крайней мере есть выбор, в BN - все жестко по стандартам, запланировано в Simpla всегда вытаскивать ВСЕ поля, нужные и ненужные, и ничего с этим поделать нельзя...Вы правы. Но это легко исправляется парой стандартных строк.

Да я использую стандарт симпла, почему нельзя что то исключить - задавайте вопросы к разработчику симплы, а не ко мне, не я это задумал.
Ссылка на сообщение
Поделиться на другие сайты

В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи. 

Хотя я бы лучше добавил параметр rand в switch sort.

 

В get_products я не вижу что бы получались какие то огромные данные отличающиеся от ВК (Пускай хоть тут можно это изменять). 

А если таковы и будут то локальные переменные забирают не так уж и много места...

Ссылка на сообщение
Поделиться на другие сайты

В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи. 

Хотя я бы лучше добавил параметр rand в switch sort.

 

В get_products я не вижу что бы получались какие то огромные данные отличающиеся от ВК (Пускай хоть тут можно это изменять). 

А если таковы и будут то локальные переменные забирают не так уж и много места...

Тоже думал сделать через $sort но решил сделать так.
Ссылка на сообщение
Поделиться на другие сайты

В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи.

Хотя я бы лучше добавил параметр rand в switch sort.

Более правильный ПОЧЕМУ? Пытаюсь заставить Noxter-а ответить серьезно, пока безрезультатно. Может, Вы по существу что-то скажете?

 

И Вы очень правильно заметили, что лучше работать в switch sort.

И в свете Вашего замечания способ Noxtera, если его оценивать как следует, совсем кривой.

В get_products есть обработка $filter['sort'], которая как раз и отвечает за сортировку. А Noxter добавляет работу с $filter['order'], демонстрируя незнание стандартных возможностей.

В результате имеем изобретение кривого велосипеда как с лишним параметром, так и с усложненным кодом.

В таком стиле простительно работать новичку...

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...