Vinyla Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Всем хорошего дня! Появилось желание выводить рандомно позиции из раздела "Рекомендуемые"Например, я выбрал 40 товаров как рекомендуемые... Вывожу на сайт 28. Нужно чтобы при каждом обновлении главной, товары выводились в разной последовательности. Таким образом не будет казаться, что ничего нового не происходит. Есть у кого идеи? Благодарю! Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Это несложно совсем, пишите в скайп - сделаю. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) СПОСОБ №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 Изменено 2 апреля, 2015 пользователем Noxter Цитата Ссылка на сообщение Поделиться на другие сайты
Vinyla Опубликовано 1 апреля, 2015 Автор Жалоба Поделиться Опубликовано 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, скорее всего и на более ранних версиях тоже будет работать.Благодарю! Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) Простой способ: в файле 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(); Изменено 1 апреля, 2015 пользователем Kors Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) Простой способ: в файле 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 и понимаешь почему твой способ не рационален и не правильный?И зачем в запросе выбираются бренды?Топорное решение. Изменено 1 апреля, 2015 пользователем Noxter Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Благодарю!Да пожалуйста Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Корс ты хоть понимаешь структуру MVC и понимаешь почему твой способ не рационален и не правильный?И зачем в запросе выбираются бренды?Топорное решение. Насчет рациональности и правильности - есть разные мнения и понятия, можно разводить длинные дискуссии. Думаю, не стоит. Вместо этого отмечу простой факт, что Вы - большой спец по структуре MVC - похоже, даже не подозреваете, что Ваш способ тоже вызывает подобный запрос, в котором выбираются бренды... Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) Насчет рациональности и правильности - есть разные мнения и понятия, можно разводить длинные дискуссии. Думаю, не стоит.Да можно и верстку тупо в контроллере зафигачить, красота то какая будет Я думаю ты корс сделал лишь бы было и на скорую руку.Вместо этого отмечу простой факт, что Вы - большой спец по структуре MVC - похоже, даже не подозреваете, что Ваш способ тоже вызывает подобный запрос, в котором выбираются бренды...Мой способ не вызывает никаких запросов, а вот способ Дениса в функции get_products действительно это делает. Я почему подчеркнул вопрос про выборку брендов: потому что на главной странице они не нужны, а ты их насильно Корс выбираешь. Суть ясна? Изменено 1 апреля, 2015 пользователем Noxter Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Мой способ не вызывает никаких запросов, а вот способ Дениса в функции get_products действительно это делает.Похоже, Вы ориентируетесь еще меньше, чем мне казалось.Неужто не видите, что Ваш способ вызывает get_products(), а эта функция - вызывает запрос с брендами?Или всерьез считаете, что Вашему способу запросы не нужны, он без них работает, волшебным образом неизвестно как из базы данные извлекает?Я почему подчеркнул вопрос про выборку брендов: потому что на главной странице они не нужны, а ты их насильно Корс выбираешь.Суть ясна?Суть ясна - Вы упорно не хотите понимать простой вещи: в одних случаях в одних шаблонах на главной бренды нужны, в других - нет. Должно быть, Вы до сих пор работали лишь с такими, где не это не использовалось.Обычно человек, если не ездил никогда в парижском метро, не доказывает темпераментно, что парижского метро не существует. Кроме того, Ваш метод в итоге тоже насильно выбирает бренды и они тоже доступны в шаблоне - должно, не догадались проверить... И если для Вас это сильно важно, в моем топорном методе очень легко убрать извлечение данных по брендам, и запрос станет лишь проще. А вот можно это легко сделать в Вашем - сильно сомневаюсь... Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Корс мой метод всего лишь сортирует товары в рандомном порядке, а вот выборка брендов и товаров происходит стандартно в функциях которые написал Пикусов, конечно же не я их писал. С чего ты взял что ТС нужны бренды для товаров на главной странице сайта? Корс может ты мысли заказчика умеешь угадывать? Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Корс мой метод всего лишь сортирует товары в рандомном порядке, а вот выборка брендов и товаров происходит стандартно в функциях которые написал Пикусов, конечно же не я их писал. С чего ты взял что ТС нужны бренды для товаров на главной странице сайта? Корс может ты мысли заказчика умеешь угадывать?Я такого не писал нигде. Похоже, Ваш довольно бессмысленный встречный вопрос - очередная попытка уклониться от ТОЧНЫХ ответов на мои вопросы... И еще этим свои вопросом Вы опять выказываете неосведомленность о том, что стандартно в Simpla на главной в шаблонах списков товаров бренды ДОСТУПНЫ. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Ну да бренды по стандарту доступны при выводе товаров на главной, категории и в корзине, я и не говорю что не доступны. Корс тебе что в лоб что по лбу, ничего понять не можешь, ведешь себя как робот который должен точно, идеально знать чтобы принять и\или выполнить какое то решение. P.S. Мой вариант все же лучше и рациональней твоего. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) 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, заставил задуматься и проанализировать... Изменено 1 апреля, 2015 пользователем Kors Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) Во первых мой вариант можно использовать для любого вывода товаров (новинки, рекомендуемые, акционные, пофик любой фильтр) без нужды несколько раз править код в функциях View, в то время как в варианте Корса нужно будет дополнительно дописывать код в каждой функции View (get_featured_products_plugin, get_new_products_plugin, get_discounted_products_plugin), что не есть рационально и просто (как заявил Корс постом выше). Во вторых кто тебя корс учил в структуре MVC использовать запросы к БД прямо в контроллере, а не в модели? Это неправильно, не логично и сделано на "лишь бы считалось". P.S. Если не в курсе что является моделью в симпле так я подскажу, к примеру для товаров это файл api/Products.php, в нем и должны быть написаны запросы к БД, а не в контроллере (ProductsView.php или View.php). Изменено 1 апреля, 2015 пользователем Noxter Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Спасибо за разъяснения. Если взять за аксиому то, что надо непременно придерживаться стандарта, то, конечно, Вы правы. А если смотреть более широко и во главу угла ставить сайт и его работу, то тут все выглядит иначе. Конечно, мой метод идейно неправильный - с точки зрения MVC. Но в реальности он лучше - с точки зрения сайта. Вот Вы уже поднимали вопрос - мол, зачем бренды. Я дал ответ - с легкостью можно убрать. А в Вашем методе убрать нельзя, по крайней мере легко и просто. Другой аспект - Вы прицепились к брендам, а тот же вопрос ведь можно поставить и про другие поля. Например, описания - они явно не нужны, однако Ваш метод вместе со стандартным API убрать их не дает. А в моем методе - вопрос решается элементарно. В том API, которому Вы поклоняетесь, имеется масса нерациональностей. И поэтому я для улучшения работы сайта довольно часто применяю приемы, подобные обсуждаемому - формально неправильные, но на деле улучшающие работу сайта. Мне приятнее огурчик с грядки, несмотря на то, что выглядит он зачастую не так презентабельно, как в магазине. Впрочем, на вкус и цвет товарища нет... Вот Вы пишете "дополнительно дописывать код в каждой функции View (get_featured_products_plugin, get_new_products_plugin, get_discounted_products_plugin)". Само существование этих трех функций, похожих, как близнецы-братья, это одна из нерациональностей, и, я бы сказал, позор для создателя. Известно про это давно, даже решения хорошие выкладывались, исправляется несложно, однако все по-прежнему... Стараться до блеска отчистить старую кастрюлю - совсем не хочется... Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 1 апреля, 2015 Жалоба Поделиться Опубликовано 1 апреля, 2015 Да в симпле много топорных реализаций, методов и прочего с этим я согласен, но делать и дальше такие же не рациональные вещи крайне нелепо. Я не прицепился к брендам, я спросил зачем их выбирать когда они могут и вовсе не нужны быть, за 5 лет практики с симплой я встречал единицы магазинов у которых бренд используется на выводе в товаре на главной.Например, описания - они явно не нужны, однако Ваш метод вместе со стандартным API убрать их не дает.Ну а причем тут описания? Описания товаров хранятся в одной таблице как и название, урл прочее товара и выбираются ВСЕ поля в симпле стандартно, нет возможности что либо исключить, в то же время бренды находятся в другой таблице и чтобы их выбрать нужно выполнить LEFT JOIN даже тогда, когда они вовсе не нужны. Почему так реализовано можешь спросить у Пикусова, так же можешь задать ему лично вопросы о нерациональной симпле. P.S. Я не поклоняюсь никакому API, это бред сивой кобылы. Цитата Ссылка на сообщение Поделиться на другие сайты
Vinyla Опубликовано 1 апреля, 2015 Автор Жалоба Поделиться Опубликовано 1 апреля, 2015 (изменено) Мужики! Все работает!)И это главное) Благодарность всем! Изменено 1 апреля, 2015 пользователем Vinyla Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 Да в симпле много топорных реализаций, методов и прочего с этим я согласен, но делать и дальше такие же не рациональные вещи крайне нелепо. Я не прицепился к брендам, я спросил зачем их выбирать когда они могут и вовсе не нужны быть, за 5 лет практики с симплой я встречал единицы магазинов у которых бренд используется на выводе в товаре на главной.Ну а причем тут описания? Описания товаров хранятся в одной таблице как и название, урл прочее товара и выбираются ВСЕ поля в симпле стандартно, нет возможности что либо исключить, в то же время бренды находятся в другой таблице и чтобы их выбрать нужно выполнить LEFT JOIN даже тогда, когда они вовсе не нужны. Почему так реализовано можешь спросить у Пикусова, так же можешь задать ему лично вопросы о нерациональной симпле.Так что выходит в итоге? 1. Метод Noxter-а BN выбирает бренды и описания. Это нерациональность. Но Вы ее оправдываете тем, что она заложена в API, и изменить ее при Вашем подходе нет возможности. 2. Метод Kors-а BK - гибкий, позволяете легко добавлять-удалять выбор тех или иных полей. BK - выходит по скорости, простоте, возможностям модификации лучше. BK - имеет лишь один недостаток - не следует некоторым правилам построения Simpla. BK - зато позволяет в данном конкретном месте исправить недостатки Simpla - выбор избыточных данных. BK - по-моему, это естественно - уходить от стандартов Simpla, чтобы исправить ее недостатки. BN - а тут подход другой, довольно странный - непременно придерживаться стандартов Simpla, даже если это ухудшает работу. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 ВК - недостаток еще в том что если наделать таких вариантов - несколько то в случае изменения БД (добавления удаления полей) Нужно будет опять искать эти запросы и менять их...ВК - убивает ключи в $products и дальнейшее получение вариантов будет невозможно. Нужно как минимум не заменять код: foreach($this->products->get_products($params) as $p) $products[$p->id] = $p; а изменить. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 ВК - недостаток еще в том что если наделать таких вариантов - несколько то в случае изменения БД (добавления удаления полей) Нужно будет опять искать эти запросы и менять их...В текущем варианте стоит SELECT p.* и такой проблемы нет.Если же явно написать список полей, то, конечно, добавлять новые придется.А про удаление полей - по-моему, это вообще действие крайне редкое.Тут уж приходится выбирать - всегда чем-то приходится жертвовать. Полного идеала обычно не бывает.Но в BK - по крайней мере есть выбор, в BN - все жестко по стандартам, запланировано в Simpla всегда вытаскивать ВСЕ поля, нужные и ненужные, и ничего с этим поделать нельзя...ВК - убивает ключи в $products и дальнейшее получение вариантов будет невозможно.Вы правы. Но это легко исправляется парой стандартных строк. Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 В текущем варианте стоит SELECT p.* и такой проблемы нет.Если же явно написать список полей, то, конечно, добавлять новые придется.А про удаление полей - по-моему, это вообще действие крайне редкое.Тут уж приходится выбирать - всегда чем-то приходится жертвовать. Полного идеала обычно не бывает.Но в BK - по крайней мере есть выбор, в BN - все жестко по стандартам, запланировано в Simpla всегда вытаскивать ВСЕ поля, нужные и ненужные, и ничего с этим поделать нельзя...Вы правы. Но это легко исправляется парой стандартных строк.Да я использую стандарт симпла, почему нельзя что то исключить - задавайте вопросы к разработчику симплы, а не ко мне, не я это задумал. Цитата Ссылка на сообщение Поделиться на другие сайты
yr4ik Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи. Хотя я бы лучше добавил параметр rand в switch sort. В get_products я не вижу что бы получались какие то огромные данные отличающиеся от ВК (Пускай хоть тут можно это изменять). А если таковы и будут то локальные переменные забирают не так уж и много места... Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи. Хотя я бы лучше добавил параметр rand в switch sort. В get_products я не вижу что бы получались какие то огромные данные отличающиеся от ВК (Пускай хоть тут можно это изменять). А если таковы и будут то локальные переменные забирают не так уж и много места...Тоже думал сделать через $sort но решил сделать так. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 2 апреля, 2015 Жалоба Поделиться Опубликовано 2 апреля, 2015 В любом случае, я думаю что способ Noxtera более правильный для решения конкретно поставленной задачи.Хотя я бы лучше добавил параметр rand в switch sort.Более правильный ПОЧЕМУ? Пытаюсь заставить Noxter-а ответить серьезно, пока безрезультатно. Может, Вы по существу что-то скажете? И Вы очень правильно заметили, что лучше работать в switch sort.И в свете Вашего замечания способ Noxtera, если его оценивать как следует, совсем кривой.В get_products есть обработка $filter['sort'], которая как раз и отвечает за сортировку. А Noxter добавляет работу с $filter['order'], демонстрируя незнание стандартных возможностей.В результате имеем изобретение кривого велосипеда как с лишним параметром, так и с усложненным кодом.В таком стиле простительно работать новичку... Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.