Vinyla Posted April 1, 2015 Report Share Posted April 1, 2015 Всем хорошего дня! Появилось желание выводить рандомно позиции из раздела "Рекомендуемые"Например, я выбрал 40 товаров как рекомендуемые... Вывожу на сайт 28. Нужно чтобы при каждом обновлении главной, товары выводились в разной последовательности. Таким образом не будет казаться, что ничего нового не происходит. Есть у кого идеи? Благодарю! Quote Link to post Share on other sites
Kosjak76 Posted April 1, 2015 Report Share Posted April 1, 2015 Это несложно совсем, пишите в скайп - сделаю. Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 (edited) СПОСОБ №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 Edited April 2, 2015 by Noxter Quote Link to post Share on other sites
Vinyla Posted April 1, 2015 Author Report Share Posted April 1, 2015 Откройте файл 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, скорее всего и на более ранних версиях тоже будет работать.Благодарю! Quote Link to post Share on other sites
Kors Posted April 1, 2015 Report Share Posted April 1, 2015 (edited) Простой способ: в файле 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(); Edited April 1, 2015 by Kors Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 (edited) Простой способ: в файле 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 и понимаешь почему твой способ не рационален и не правильный?И зачем в запросе выбираются бренды?Топорное решение. Edited April 1, 2015 by Noxter Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 Благодарю!Да пожалуйста Quote Link to post Share on other sites
Kors Posted April 1, 2015 Report Share Posted April 1, 2015 Корс ты хоть понимаешь структуру MVC и понимаешь почему твой способ не рационален и не правильный?И зачем в запросе выбираются бренды?Топорное решение. Насчет рациональности и правильности - есть разные мнения и понятия, можно разводить длинные дискуссии. Думаю, не стоит. Вместо этого отмечу простой факт, что Вы - большой спец по структуре MVC - похоже, даже не подозреваете, что Ваш способ тоже вызывает подобный запрос, в котором выбираются бренды... Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 (edited) Насчет рациональности и правильности - есть разные мнения и понятия, можно разводить длинные дискуссии. Думаю, не стоит.Да можно и верстку тупо в контроллере зафигачить, красота то какая будет Я думаю ты корс сделал лишь бы было и на скорую руку.Вместо этого отмечу простой факт, что Вы - большой спец по структуре MVC - похоже, даже не подозреваете, что Ваш способ тоже вызывает подобный запрос, в котором выбираются бренды...Мой способ не вызывает никаких запросов, а вот способ Дениса в функции get_products действительно это делает. Я почему подчеркнул вопрос про выборку брендов: потому что на главной странице они не нужны, а ты их насильно Корс выбираешь. Суть ясна? Edited April 1, 2015 by Noxter Quote Link to post Share on other sites
Kors Posted April 1, 2015 Report Share Posted April 1, 2015 Мой способ не вызывает никаких запросов, а вот способ Дениса в функции get_products действительно это делает.Похоже, Вы ориентируетесь еще меньше, чем мне казалось.Неужто не видите, что Ваш способ вызывает get_products(), а эта функция - вызывает запрос с брендами?Или всерьез считаете, что Вашему способу запросы не нужны, он без них работает, волшебным образом неизвестно как из базы данные извлекает?Я почему подчеркнул вопрос про выборку брендов: потому что на главной странице они не нужны, а ты их насильно Корс выбираешь.Суть ясна?Суть ясна - Вы упорно не хотите понимать простой вещи: в одних случаях в одних шаблонах на главной бренды нужны, в других - нет. Должно быть, Вы до сих пор работали лишь с такими, где не это не использовалось.Обычно человек, если не ездил никогда в парижском метро, не доказывает темпераментно, что парижского метро не существует. Кроме того, Ваш метод в итоге тоже насильно выбирает бренды и они тоже доступны в шаблоне - должно, не догадались проверить... И если для Вас это сильно важно, в моем топорном методе очень легко убрать извлечение данных по брендам, и запрос станет лишь проще. А вот можно это легко сделать в Вашем - сильно сомневаюсь... Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 Корс мой метод всего лишь сортирует товары в рандомном порядке, а вот выборка брендов и товаров происходит стандартно в функциях которые написал Пикусов, конечно же не я их писал. С чего ты взял что ТС нужны бренды для товаров на главной странице сайта? Корс может ты мысли заказчика умеешь угадывать? Quote Link to post Share on other sites
Kors Posted April 1, 2015 Report Share Posted April 1, 2015 Корс мой метод всего лишь сортирует товары в рандомном порядке, а вот выборка брендов и товаров происходит стандартно в функциях которые написал Пикусов, конечно же не я их писал. С чего ты взял что ТС нужны бренды для товаров на главной странице сайта? Корс может ты мысли заказчика умеешь угадывать?Я такого не писал нигде. Похоже, Ваш довольно бессмысленный встречный вопрос - очередная попытка уклониться от ТОЧНЫХ ответов на мои вопросы... И еще этим свои вопросом Вы опять выказываете неосведомленность о том, что стандартно в Simpla на главной в шаблонах списков товаров бренды ДОСТУПНЫ. Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 Ну да бренды по стандарту доступны при выводе товаров на главной, категории и в корзине, я и не говорю что не доступны. Корс тебе что в лоб что по лбу, ничего понять не можешь, ведешь себя как робот который должен точно, идеально знать чтобы принять и\или выполнить какое то решение. P.S. Мой вариант все же лучше и рациональней твоего. Quote Link to post Share on other sites
Kors Posted April 1, 2015 Report Share Posted April 1, 2015 (edited) 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, заставил задуматься и проанализировать... Edited April 1, 2015 by Kors Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 (edited) Во первых мой вариант можно использовать для любого вывода товаров (новинки, рекомендуемые, акционные, пофик любой фильтр) без нужды несколько раз править код в функциях View, в то время как в варианте Корса нужно будет дополнительно дописывать код в каждой функции View (get_featured_products_plugin, get_new_products_plugin, get_discounted_products_plugin), что не есть рационально и просто (как заявил Корс постом выше). Во вторых кто тебя корс учил в структуре MVC использовать запросы к БД прямо в контроллере, а не в модели? Это неправильно, не логично и сделано на "лишь бы считалось". P.S. Если не в курсе что является моделью в симпле так я подскажу, к примеру для товаров это файл api/Products.php, в нем и должны быть написаны запросы к БД, а не в контроллере (ProductsView.php или View.php). Edited April 1, 2015 by Noxter Quote Link to post Share on other sites
Kors Posted April 1, 2015 Report Share Posted April 1, 2015 Спасибо за разъяснения. Если взять за аксиому то, что надо непременно придерживаться стандарта, то, конечно, Вы правы. А если смотреть более широко и во главу угла ставить сайт и его работу, то тут все выглядит иначе. Конечно, мой метод идейно неправильный - с точки зрения MVC. Но в реальности он лучше - с точки зрения сайта. Вот Вы уже поднимали вопрос - мол, зачем бренды. Я дал ответ - с легкостью можно убрать. А в Вашем методе убрать нельзя, по крайней мере легко и просто. Другой аспект - Вы прицепились к брендам, а тот же вопрос ведь можно поставить и про другие поля. Например, описания - они явно не нужны, однако Ваш метод вместе со стандартным API убрать их не дает. А в моем методе - вопрос решается элементарно. В том API, которому Вы поклоняетесь, имеется масса нерациональностей. И поэтому я для улучшения работы сайта довольно часто применяю приемы, подобные обсуждаемому - формально неправильные, но на деле улучшающие работу сайта. Мне приятнее огурчик с грядки, несмотря на то, что выглядит он зачастую не так презентабельно, как в магазине. Впрочем, на вкус и цвет товарища нет... Вот Вы пишете "дополнительно дописывать код в каждой функции View (get_featured_products_plugin, get_new_products_plugin, get_discounted_products_plugin)". Само существование этих трех функций, похожих, как близнецы-братья, это одна из нерациональностей, и, я бы сказал, позор для создателя. Известно про это давно, даже решения хорошие выкладывались, исправляется несложно, однако все по-прежнему... Стараться до блеска отчистить старую кастрюлю - совсем не хочется... Quote Link to post Share on other sites
Noxter Posted April 1, 2015 Report Share Posted April 1, 2015 Да в симпле много топорных реализаций, методов и прочего с этим я согласен, но делать и дальше такие же не рациональные вещи крайне нелепо. Я не прицепился к брендам, я спросил зачем их выбирать когда они могут и вовсе не нужны быть, за 5 лет практики с симплой я встречал единицы магазинов у которых бренд используется на выводе в товаре на главной.Например, описания - они явно не нужны, однако Ваш метод вместе со стандартным API убрать их не дает.Ну а причем тут описания? Описания товаров хранятся в одной таблице как и название, урл прочее товара и выбираются ВСЕ поля в симпле стандартно, нет возможности что либо исключить, в то же время бренды находятся в другой таблице и чтобы их выбрать нужно выполнить LEFT JOIN даже тогда, когда они вовсе не нужны. Почему так реализовано можешь спросить у Пикусова, так же можешь задать ему лично вопросы о нерациональной симпле. P.S. Я не поклоняюсь никакому API, это бред сивой кобылы. Quote Link to post Share on other sites
Vinyla Posted April 1, 2015 Author Report Share Posted April 1, 2015 (edited) Мужики! Все работает!)И это главное) Благодарность всем! Edited April 1, 2015 by Vinyla Quote Link to post Share on other sites
Kors Posted April 2, 2015 Report Share Posted April 2, 2015 Да в симпле много топорных реализаций, методов и прочего с этим я согласен, но делать и дальше такие же не рациональные вещи крайне нелепо. Я не прицепился к брендам, я спросил зачем их выбирать когда они могут и вовсе не нужны быть, за 5 лет практики с симплой я встречал единицы магазинов у которых бренд используется на выводе в товаре на главной.Ну а причем тут описания? Описания товаров хранятся в одной таблице как и название, урл прочее товара и выбираются ВСЕ поля в симпле стандартно, нет возможности что либо исключить, в то же время бренды находятся в другой таблице и чтобы их выбрать нужно выполнить LEFT JOIN даже тогда, когда они вовсе не нужны. Почему так реализовано можешь спросить у Пикусова, так же можешь задать ему лично вопросы о нерациональной симпле.Так что выходит в итоге? 1. Метод Noxter-а BN выбирает бренды и описания. Это нерациональность. Но Вы ее оправдываете тем, что она заложена в API, и изменить ее при Вашем подходе нет возможности. 2. Метод Kors-а BK - гибкий, позволяете легко добавлять-удалять выбор тех или иных полей. BK - выходит по скорости, простоте, возможностям модификации лучше. BK - имеет лишь один недостаток - не следует некоторым правилам построения Simpla. BK - зато позволяет в данном конкретном месте исправить недостатки Simpla - выбор избыточных данных. BK - по-моему, это естественно - уходить от стандартов Simpla, чтобы исправить ее недостатки. BN - а тут подход другой, довольно странный - непременно придерживаться стандартов Simpla, даже если это ухудшает работу. Quote Link to post Share on other sites
yr4ik Posted April 2, 2015 Report Share Posted April 2, 2015 ВК - недостаток еще в том что если наделать таких вариантов - несколько то в случае изменения БД (добавления удаления полей) Нужно будет опять искать эти запросы и менять их...ВК - убивает ключи в $products и дальнейшее получение вариантов будет невозможно. Нужно как минимум не заменять код: foreach($this->products->get_products($params) as $p) $products[$p->id] = $p; а изменить. Quote Link to post Share on other sites
Kors Posted April 2, 2015 Report Share Posted April 2, 2015 ВК - недостаток еще в том что если наделать таких вариантов - несколько то в случае изменения БД (добавления удаления полей) Нужно будет опять искать эти запросы и менять их...В текущем варианте стоит SELECT p.* и такой проблемы нет.Если же явно написать список полей, то, конечно, добавлять новые придется.А про удаление полей - по-моему, это вообще действие крайне редкое.Тут уж приходится выбирать - всегда чем-то приходится жертвовать. Полного идеала обычно не бывает.Но в BK - по крайней мере есть выбор, в BN - все жестко по стандартам, запланировано в Simpla всегда вытаскивать ВСЕ поля, нужные и ненужные, и ничего с этим поделать нельзя...ВК - убивает ключи в $products и дальнейшее получение вариантов будет невозможно.Вы правы. Но это легко исправляется парой стандартных строк. Quote Link to post Share on other sites
Noxter Posted April 2, 2015 Report Share Posted April 2, 2015 В текущем варианте стоит SELECT p.* и такой проблемы нет.Если же явно написать список полей, то, конечно, добавлять новые придется.А про удаление полей - по-моему, это вообще действие крайне редкое.Тут уж приходится выбирать - всегда чем-то приходится жертвовать. Полного идеала обычно не бывает.Но в BK - по крайней мере есть выбор, в BN - все жестко по стандартам, запланировано в Simpla всегда вытаскивать ВСЕ поля, нужные и ненужные, и ничего с этим поделать нельзя...Вы правы. Но это легко исправляется парой стандартных строк.Да я использую стандарт симпла, почему нельзя что то исключить - задавайте вопросы к разработчику симплы, а не ко мне, не я это задумал. Quote Link to post Share on other sites
yr4ik Posted April 2, 2015 Report Share Posted April 2, 2015 В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи. Хотя я бы лучше добавил параметр rand в switch sort. В get_products я не вижу что бы получались какие то огромные данные отличающиеся от ВК (Пускай хоть тут можно это изменять). А если таковы и будут то локальные переменные забирают не так уж и много места... Quote Link to post Share on other sites
Noxter Posted April 2, 2015 Report Share Posted April 2, 2015 В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи. Хотя я бы лучше добавил параметр rand в switch sort. В get_products я не вижу что бы получались какие то огромные данные отличающиеся от ВК (Пускай хоть тут можно это изменять). А если таковы и будут то локальные переменные забирают не так уж и много места...Тоже думал сделать через $sort но решил сделать так. Quote Link to post Share on other sites
Kors Posted April 2, 2015 Report Share Posted April 2, 2015 В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи.Хотя я бы лучше добавил параметр rand в switch sort.Более правильный ПОЧЕМУ? Пытаюсь заставить Noxter-а ответить серьезно, пока безрезультатно. Может, Вы по существу что-то скажете? И Вы очень правильно заметили, что лучше работать в switch sort.И в свете Вашего замечания способ Noxtera, если его оценивать как следует, совсем кривой.В get_products есть обработка $filter['sort'], которая как раз и отвечает за сортировку. А Noxter добавляет работу с $filter['order'], демонстрируя незнание стандартных возможностей.В результате имеем изобретение кривого велосипеда как с лишним параметром, так и с усложненным кодом.В таком стиле простительно работать новичку... Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.