Круговая сортировка в Drupal 6, CCK и представлениях

Сегодня у меня был интересный запрос от клиента, и я не совсем уверен, как лучше всего его решить с помощью Drupal Views. В настоящее время у них есть тип контента «Член команды», который представляет членов их сотрудников. На странице каждого сотрудника есть ссылка на все другие страницы сотрудников. Пока это не проблема.

Они хотят, чтобы этот список начинался с человека, на которого мы сейчас смотрим, а затем продолжаем с того, кто идет сразу после него в «отсортированном» порядке. Затем, когда он достигает конца списка, он оборачивается и начинает с самого начала, пока они не вернутся к себе (аналогично тому, как работает круговой связанный список).

Так, например, предположим, что у меня есть члены команды A, B, C, D, E, F и G:

  • Если я смотрю на члена команды A, порядок списка следующий: A, B, C, D, E, F, G.
  • Если я смотрю на члена команды D, список будет следующим: D, E, F, G, A, B, C.
  • Если я смотрю на члена команды G, список будет следующим: G, A, B, C, D, E, F.

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

Единственное возможное решение, которое я могу придумать, - это создать два отдельных представления, а затем просто объединить результаты вместе после факта.

  1. Одно представление было бы отсортированным списком всех членов команды, у которых число сортировки больше или равно текущему члену команды.
  2. Второе представление, представляющее собой отсортированный список всех членов команды, у которых число сортировки меньше или равно текущему члену команды.

Мне просто любопытно, есть ли более эффективные способы сделать такую ​​сортировку с представлениями?


person David Stinemetze    schedule 23.03.2011    source источник


Ответы (2)


Пока все ваши результаты могут содержаться на одной странице, вам, вероятно, лучше всего подходит решение, которое вы упомянули: манипулирование двумя представлениями (возможно, в шаблоне, как предлагает Освальд), чтобы одно отображалось за другим. Однако, если вы в конечном итоге получите много результатов и вам потребуется разбиение на страницы ... вам, вероятно, придется проделать некоторую причудливую работу по вычислению разницы между числами сортировки и использованию этого значения в ORDER BY ... все, что требует сложного задача по переписыванию основного запроса Views.

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

Вот руководство по переписыванию запроса просмотров: http://blog.raisedeyebrow.com/2010/04/rewrite-a-views-query/

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

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

person James    schedule 23.03.2011
comment
Ладно интересно. Думаю, пока мне удастся уйти двумя отдельными запросами. Я бы предпочел не усложнять вещи. У них всего 9 сотрудников, поэтому я не думаю, что это проблема. В любом случае способ отображения представления не подходит для разбивки на страницы, поэтому я думаю, что если им когда-нибудь понадобится больше, нам все равно придется изменить дизайн. - person David Stinemetze; 24.03.2011
comment
Это действительно кажется самым мудрым подходом. С наилучшими пожеланиями. - person James; 25.03.2011

Я бы выбрал тематический слой. Я думаю, это можно сделать в функции предварительной обработки. Возможно, вам нужно переопределить файл шаблона. Модуль Theme Developer может рассказать вам, как визуализируется представление и какие переопределения возможны.

person Oswald    schedule 23.03.2011