Помогите совместить две сортировки во вьюшке: по указанным нодам и рандом

Главные вкладки

Аватар пользователя Georgii Georgii 22 января 2012 в 14:44

Всем привет!

Есть вьюшка для вывода материалов из того же раздела, что и текущая нода. Выводится 4-5 нод отсортированных случайным образом. Конфига D7+Views3.

Хочу сделать так, чтоб в этом списке из 4-5 нод первые две строчки занимали указанные мною ноды (по nid).Пытался сделать через стандартные механизмы, но не нашёл как.

Потом появилась идея модифицировать запрос вьюшки через хук, даже нашёл примерное решение через SQL

SELECT *
FROM `node`
ORDER BY
CASE WHEN nid =3
OR nid =4
THEN RAND( )
ELSE RAND( ) +2
END

Но и тут неудача - views3 не дают вписать код SQL напрямую.

Выручайте! Буду рад любым идеям или тычку пальцем в мною незамеченное очевидное.

Комментарии

Аватар пользователя torquemada torquemada 22 января 2012 в 14:57

Привет

Это нехитро реализовать через дополнительное поле cck. Назовем его Вес, присвоим числовые значения и будем при редактировании вставлять нужную цифирь. Поле открыть для редактирования только административным ролям. Во вьюсе, соответственно сортировать список descendant.

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

Аватар пользователя Georgii Georgii 22 января 2012 в 15:13

torquemada, благодарю за совет!

Действительно, это бы идеально подошло, если бы не одно "но". Для одной страницы я хочу "вытащить наверх" одни ноды, для другой - другие. И всё это в одной категории.

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

Как я понимаю, вес такой тонкой настройки не даст. Или есть другой вариант?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 22 января 2012 в 15:27

Использование отдельного поля "вес" это колхоз отрицальтельно сказывающийся на производительности, хотя в семёрке несколько лучше чем в шестёрке.
Попробуйте поиграть с модулем http://drupal.org/project/nodequeue

Аватар пользователя Georgii Georgii 22 января 2012 в 15:40

RxB, спасибо, обязательно попробую. Но похоже, это не совсем то, что нужно - там другая крайность - полностью указанный список нод. Я же хочу сделать, чтоб часть списка была жёстко задана, в то вмея как вторая часть - рандом.

И ведь что не даёт покоя. Есть SQL запрос (и не такой уж сложный), который реализует задумку, но вот как его подсунуть во views непонятно. И без них не обойтись поскольку выводятся рейтинги fivestars, а отображать их вручную вне моих скромных возможностей.

Аватар пользователя torquemada torquemada 22 января 2012 в 16:36

Аттач - это вызов 2-х выборок вместо одной для получения одного листинга. При любых раскладах это существенней увеличит расходы на процессинг страницы чем sort по cck полю.

В целом да - любая сортировка замедлит выборку...

Georgii, не понял проблемы. Используйте сортировку в тех списках, в которых нужно. В которых не нужно - не используйте.
Или вопрос в том, что выводить вверх нужно не определенные ноды, а ноды как-то связанные с текущей?

Аватар пользователя Georgii Georgii 22 января 2012 в 16:37

RxB, понял. Можно и так, хотя получится ещё один лишний запрос к БД, ну да видать не всё коту масленица.
Спасибо за помощь!

Аватар пользователя Georgii Georgii 22 января 2012 в 23:50

torquemada, верно! Как раз ноды связанные с текущей. В одной ноде я могу указать выводить вверх ноды 3 и 5, а в другой 4 и 6 и хочу сделать так, чтоб при помощи одной и той же вьюшки с аргументами я мог вывести для первой страницы
3
5
1 - рандом
7 - рандом

для второй
4
6
2 - рандом
10 - рандом

а для всех остальных страниц, где ничего не указано для вывода сверху все 4 позиции - выводятся рандомно.

SQL запрос выше на 100% решает задачу, но я не нашёл как скормить его во вьюшку. Пока же сделал через две - одна выводит верхнюю часть, вторая - рандомную нижнюю (исключая те, что уже есть в верхней.)

Аватар пользователя torquemada torquemada 24 января 2012 в 2:34

Мм. Тогда самое разумное - организовать связь между этими нодами или использовать существующую. Сложно сказать так как не представляю структуры вашего контента.

Эти ноды могут быть связаны через автора (один юзер (клуб) = куча трасс). Они могут быть связаны через user reference (аналогично). Наконец, они могут быть связаны через node reference. Во всех трех случаях можно организовать соответствующую сортировку в текущем дисплее.

В общем: сконцентрируйтесь на отношениях текущей ноды и тех "особенных" нод, которые нужно вывести вверх списка. Сделаете (или найдете) какую-то связь - можно будет сортировать.

Аватар пользователя Georgii Georgii 24 января 2012 в 10:02

torquemada, у меня установлен Entity Reference и через него я для каждой страницы, которой нужно, указываю "родственные" ноды, которые должны идти вверху списка. Т.е. для ноды с описанием картодрома PitStop Пулково, "родственными" будут ноды того же клуба на ш. Революции и "City" у Нарвской (просто для конкретики). И я хочу сделать такой вот вывод:

1) PitStop "Революция"
2) PitStop "City"
3) <рандомный картинг-клуб>
4) <рандомный картинг-клуб>

А вот как заиспользовать эту информацию в "Entity Reference" чтоб запросом одной вьюшки добиться такой вот как бы двойной сортировки я пока не додумался Smile

Аватар пользователя torquemada torquemada 24 января 2012 в 13:59

Georgii, это славно. Там же, я думаю, есть критерий сортировки по entity_reference. Его, я думаю, и стоит использовать как первый критерий с нужным значением, global:random как второй.

Возможно, для этого нужно будет этот референс сначала использовать в relationships. Без понятия - entity reference никогда не использовал, не в курсе даже что оно хранит.