[РЕШЕНО] Упорядочивание по алфавиту нескольких полей cck одной ноды в виде ссылок

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

Аватар пользователя Serg_M Serg_M 4 марта 2009 в 10:09

Есть сайт по фильмам азии. А так как русско-английских названий у одного фильма может быть много (до 10), то нужно учитывать их все. После раздумий как это реализовать, понравилась идея все названия писать прямо в ноде-фильм в cck поля.

Итак, поставлены cck + views, набита информация. Попытки вывести все поля в алфавитном порядке не увенчались успехом. И views1 и views2 какие-бы установки в них не делал сортируют только по ОДНОМУ полю, остальные поля из ноды "подцепляются" к отсортированному, результат - не алфавитный вывод полей cck.

Идею как выйти из положения предложил знакомый - нужно создать промежуточную таблицу в БД с одним полем cck и туда скидать всю информацию из оригинальной таблицы.

Для чайников, подобных мне: Создаем оригинальный тип материала "Фильм" film, с текстовыми полями cck ima1, ima2, ima3... Туда заносим информацию по фильмам. Создаем промежуточный материал "Фильм_temp" film_temp, с единственным текстовым полем cck ima_temp.
Через phpMyAdmin, заходим в БД и занимаемся таблицей content_type_film_temp. Через "Выполнить SQL запрос(ы) на БД" вводим:
вначале избавляемся от ключа PRIMARY, который не даст вводить информацию, а затем переносим данные попутно избавляясь от пустых значений.

ALTER TABLE content_type_film_temp DROP PRIMARY KEY;

INSERT INTO content_type_film_temp SELECT vid, nid, field_ima1_value
FROM content_type_film WHERE field_ima1_value <> "";

INSERT INTO content_type_film_temp SELECT vid, nid, field_ima2_value
FROM content_type_film WHERE field_ima2_value <> "";

...

Собственно все, теперь можно при помощи views2, работая с film_temp сортировать и выводить значения хоть в виде текста, хоть в виде ссылок, пример смотреть здесь.
Но views2, как и его предустановка glossary расписывает все цифровые начала как 1 2 3... (иного я не нашел), а мне бы хотелось, чтобы все цифры были спрятаны под значек #. Это позволяет сделать модуль views_alpha_pager из Drupal5*. Устанавливаем его и патчим, чтоб работал с русским языком, как расписано здесь.
Настраиваем фильтр views: "Предоставить страницу для представления" в виде списка, Pager: alpha (top only). "Поля" Текст: ima_temp (field_ima_temp), Может сортироваться ДА. "Фильтр" Материал тип "Значение" Фильм. "Критерий сортировки" Текст: ima_temp (field_ima_temp) по возрастанию.
В результате получаем отсортированный по алфавиту список полей, но пока это текстовая информация, а не ссылки. Для того чтобы превратить поле cck в ссылку в 5* есть мелкий модуль link. Заново пересоздаем тип материала "Фильм", но теперь поля cck, будут как "Text Fields for Title and URL". Вводим данные, переделываем промежуточную таблицу, выводим через views данные и... обламываемся, потому как сортировка почему-то не происходит, если поля cck в виде линков.
Мучаем поиск по словам "ссылка views" + "темизация views" и находим ответ, что поле cck можно сделать ссылкой и без модуля link вот здесь.
Возвращаемся к первоначальному типу материала "Фильм" без link. Правим template.php своей темы и... наслаждаемся результатом, временно работающий пример посмотреть можно здесь.

Решение конечно-же чайниковское и на его осуществление ушла ни одна неделя. Буду рад услышать, что оклевитал views и все делается штатными средствами. Но если рациональное зерно в моих изысканиях есть, хочется услышать советы по оптимизации решения вообще и в частности:
1. Как будет выглядить php-код работы с промежуточной таблицы не из phpMyAdmin,а из самого Drupal?
2. Совсем шикарно будет, если кто подскажет как сделать (код), чтобы промежуточная таблица была связана с оригинальной, т.е. любые изменения в оригинальной таблице автоматически отражались в промежуточной. Это вопрос к гуру в MySQL.

P.S. Большой "привет" человеку, придумавшему фразу, что для работы с cms не нужны знания в php, MySQL...

Комментарии

Аватар пользователя Serg_M Serg_M 22 марта 2009 в 13:23

Ух и нагородил по-незнанию, а подсказать-то и некому. Ну да ладно, может кому пригодится и такое.
Но нашел как упростить конструкцию для моего примера. Нужно не создавать 10 текстовых полей cck, а создать одно со "множеством значений / multiple value". Тогда отпадает необходимость создавать промежуточную таблицу в БД. При создании views будет одна тонкость: В "Поля" выбирается это "множественное поле", а в "Обработчик" выставить "Do not group multiple values".

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

A quick but messy solution is to edit [cck_type].module (in this case, text.module D5) and find: Implementation of hook_widget().

Inside the function, find this line of code:

        foreach (range($delta, $delta + 2) as $delta) {

Just increase the 2 to whatever you want. Although I don't know the implication of this on the database, but for me it works.

Automatic adding of fields via ajax would most certainly be good for multiple value field settings.

А для Drupal6* появляется кнопочка "Добавить поле", что очень удобно.