Вот и вышел долгожданный релиз Drupal 7. В целом продукт мне понравился, и для того, что бы получше изучить новое АПИ я решил постепенно перевести написанные мной модули под новую платформу. Первой ласточкой стал один из элементов модуля ccfilter - collapse text. Но, что бы было поинтересней, я не просто перевел его под D7, но и несколько расширил функциональность.
Новый модуль ccfcollpase позволяет встраивать при помощи специальных тэгов (аля BBCode) в материалы сворачиваемый/разворачиваемый текст.
По сравнению с версией для D6, данный фильтр позволяет вставлять вложенные элементы, кроме того предусмотрен блок врапера, который позволяет разворачивать/сворачивать все элементы находящиеся внутри данного врапера. Также можно установить с помощью дополнительных атрибутов индивидуально для каждого сполера некоторые параметры поведения, как то скорость сворачивания/разворачивания и метод сворачивания/разворачивания (пока доступны три метода slide, fade, slidefade).
В дальнейшем данный фильтр будет использован как один из составляющих элементов ccfilter под D7.
Примечание: далее в тексте примеров , что бы не срабатывал фильтр я заменил английскую букву c на русскую с.
Общий синтаксис:
* Стркутра обрабоки фильтра
* в треугольные скобки помещены не обязательные значения (сами они не нужны)
* одинарные кавчки в параметрах обязательны, порядок параметров произволный
*
*******************************************************************************
* <[сollapse-wrapper <hide|show> <title_show='Expand All' title_hide='Collapse all'>]>
* [сollapse <attributes>]
* <материал внутри сполера>
* <[сollapse <attributes>]>
* <материал внутри вложенного сполера>
* <[/collapse]>
* <продолжение материала внутри сполера>
* [/сollapse]
* <[/сollapse-wrapper]>
*******************************************************************************
* опциональные атрибуты задают режим работы сполера
* если аттрибуты не установлены, то беруться предустановленные параметы в настройках фильтра
* attributes =
* <hide|collapsed|show|expanded> - определяют как будет выглядит сполер
* при загрузки страницы hide или collapsed - свернутый сполер,
* show или expanded - развернутый свернутый сполер
* <title-show='Expand'> - определяет префикс заголовка для показа сполера
* <title-hide='Collapse'> - определяет префикс заголовка для скрытия сполера
* <title=''> определяет постфикс заголовка сполера
* например для комбинации title-hide='Скрыть' title-show='Показать' title='материал'
* для развернутого сполера будет сформирован заголовок - Скрыть материал
* и при сворачивании он будет меняться на - Показать материал
* <speed-show='slow|fast'> <speed_hide='slow|fast'> - скорость разворачивания и
* соответственно сворачивания сполера, кроме значений slow и fast можно указать
* число миллисекунд
* <method-show='Slide|Fade|SlideFade'> - метод анимации при разворачивании
* <method-hide='Slide|Fade|SlideFade'> - метод анимации при сворачивании
* <hode='NumNode'> - содержимое сполера берется из ноды номер NumNode
* содержимое создается во время создания текущей ноды и обновляется только в
* случае сброса кэша
* <ajax-hode='NumNode'> - содержимое сполера берется из ноды номер NumNode
* содержимое подгружается через ajax при первом разворачивании сполера (если сполер свернут)
* или при первой загрузке строницы (если сполер развернут)
* если атрибут title не определен и есть один из атрибутов node или ajax_node,
* то в качестве title будет использован заголовок ноды.
* Нода в сполер загружается без комментариев и заголовка.
* Вывод ноды определен через шаблон 'ccfcollapse-inline-node.tpl.php'
* в шаблоне поставляемом с модулем также
* скрыты массивы field_tags и links
*
* [сollapse-wrapper <show|hide> <title-show='Expand All' title-hide='Collapse all'>]
* ......-
* [/сollapse-wrapper]
* определяет контейнер для нескольких сполеров, и добавляет ссылку c возможностью
* развернуть или свернуть все сполеры внутри контейнера
*/
Если атрибуты не проставлены (а все они необязательны), то их значения берутся из предопределенных значений определенных в настройке фильтра.
В атрибутах имеющих значение - обязательны одинарные кавычки.
Порядок и наличие атрибутов произвольный, если какой либо из атрибутов не определен, то его значение берется из предопределенного в настройках фильтра .
Значения по умолчанию:
title-show=t('show')
title-hide=t('hide')
title=''
speed-show='fast'
speed-hide='fast'
method-show='slide'
method-hide='slide'
Допускаются вложенные сполеры (т.е. внутри сполера вы можете расположить еще дополнительные сполеры), уровень вложенности технически не ограничен и определяется здравым смыслом и ограничениями дизайна (верстки) сайта.
Полный заголовок формируется как конкатенация префикса (title-show|title-hide) и заголовка (title)
Некорректность (нарушение структуры - парности тэгов) не отслеживается и может привести к непредсказуемым результатам (вплоть до краха верстки), поэтому кажется сомнительный включать данный фильтр в общедоступный формат ввода.
Так как данный сайт (имеется ввиду мой домашний сайт) все еще на D6, для экспериментов и тестирования я создал новый сайтик www.printarts.ru, примеры работы фильтра можно посмотреть на страничке http://www.printarts.ru/article/proverka-raboty-ccfcollapse-filtra
Жду отзывов и багрепортов тестирования данного модуля.
Оригинал материала на сайте www.hotel-prog.ru
**************************************************************************
Обновил модуль.
**************************************************************************
Добавлен следующий функционал:
1. Два (взаимоисключающих) атрибута node='N' и ajax-node='N' (если указаны оба то работает node).
Данный атрибут позволяет подгрузить в сполер ноду с номером N (при этом содержимое между тэгами [сollapse][/collapse] не имеет значения, так как будет заменено на содержимое ноды.
Различие этих атрибутов следует из названия, первый (node) формирует материал сполера из ноды во время создания, второй на "лету" посредством подгрузки node через ajax.
У обоих методов есть свои достоинства и недостатки.
Особенности атрибута node:
- Если изменена включаемая нода, то в сполере она не измениться до момента сброса кэша или пересохранения самого материала включающего сполер с данной нодой.
+ Включенный статично материал доступен для индексации поисковиками
+ Более быстрая загрузка сполера
+ При отключенном в браузере js материал виден как статический текст
Особенности атрибута ajax-node:
+ Нода в сполер загружается единожды при первом разворачивании сполера
+ Материал в сполере всегда актуален (т.е. если изменилась включаемая нода, то материал в сполере тоже будет загружаться измененный)
-+ Поисковики и индексаторы не будут видеть материал скрытый в сполере (даже в том случае если установлен атрибут show)
- При отключенном в браузере js материал не будет виден
Особенности применения данных атрибутов:
Будет плохой идеей «зациклить» материал т.е. при помощи атрибута node (ajax-node) включит в текущий материал создаваемую ноду непосредственно либо опосредованно, через цепочку нод (например вы редактируете ноду № 5 и включаете в сполер ноду №3 а в ноде №3 в сполер включена нода № 5), т.е. избегайте рекурсии, скорее всего это приведет к падению сервера с 502 ошибкой, и может быть исправлено только убиением(редактированием) данной ноды непосредственно в базе (для экспериментаторов править надо таблицу {field_data_body} после чего сбросить кеш).
В параметры конфигурации добавлен параметр определяющий можно ли включать в сполер не опубликованные ноды (в принципе я подумал что будет хорошей идеей создать не опубликованные ноды как шаблоны для дальнейшего включения в сполеры),
если данный флажок не установлен и нода включенная в сполер снята с публикации, то в сполер вместо содержания ноды будет выведена информация об отсутствии ноды (если это статический метод загрузки, то только после очистки кэша)
Вывод ноды определяется шаблоном ccfcollapse-inline-node.tpl.php (который вы можете переопределить в своей теме), в шаблоне по умолчанию (который включен в данный модуль) отключен вывод тэгов ноды и линки (т.е. практически выводиться голый "body" ноды).
Комментарии включаемой ноды не попадают в сполер.
В качестве включаемой ноды можно включать ноду в свою очередь содержащую свои сполеры (в том числе и с атрибутам node/ajax-node)
Правда в случае с включением ноды содержащей ajax-node сполер на моей теме возникают какие-то проблемы с css но попробую разобраться (может это тема глючит).
Да и еще раз избегайте рекурсии прямой или косвенной.
Если у вас включен модуль path (pathauto) то в качестве параметра node/ajax-node
можно использовать и синоим (например "article/test_node").
Если при использовании атрибутов node или ajax-node не использован атрибут title, то в качестве title будет использован заголовок включаемой ноды.
Данный заголовок всегда формируется статично, т.е. если вы изменили заголовок включаемой ноды, то надо или сбросить кэш, либо пересохранить сам материал.
2. Переменные в атрибутах теперь могут быть заключены не только в одинарные но и в двойные кавычки (но обязательно парные), это позволяет например создавать атрибуты типа "O'Вerly" или 'ООО "Моя компания"'.
Пример использования новых возможностей можно посмотреть по адресу
Вложение | Размер |
---|---|
Новая версия - ccfcollapse.zip | 8.01 КБ |
Комментарии
Может выложить сие на D.O? Больше людей протестируют...
при клике на Показать все страница скролится к последнему свёрнутому элементу. имхо не правильно. ни и плюс когда нажимаешь на показать ... пропадает заголовок этого блока, поэтому не понятно что произошло и где ты очутился. программный скролинг страницы лучше вообще убрать
Да насчет скролинга не подумал. (там просто последовательно для всех сполеров вызывается triggerHandler, и соответственно такая бойда получается)
Убрал программный скролинг.
По поводу пропадания заголовка блока, что то не понял вроде должен title-show меняться на title-hide, посмотрите в настройках (admin/config/content/ccfcollapse) модуля прописан ли "Predefined title prefix for link hide" - може я что в настройках напутал, и еще как вариант может у вас в переводах
"Hide" - переведено как пустая строка (хотя это вряд-ли)
они не физически пропадают, а пропадают с экрана благодаря сролу страницы. теперь всё ок
потестю
Благодарю, в закладки. Пригодится однозначно.
Грамотно и приятно работает. В мемориз. Спасибо за Вашу работу. Полагаю, пригодится.
Потихоньку перевожу модуль ccfilter под D7.
По сравнению с версией D6, расширены возможности фильтра collapse text
В настоящий момент релизованы два элемента фильтра:
collapse text и smileys (смайлики)
Возможности collapse text описаны в материале «Проба пера или первый мой модуль под Drupal 7»
Реализация фильтра smileys практически не отличается от версии D6.
В версии D7 не планируется включать фильтры «PHP inline code» и «Auto tags» (Из за малой восстребованности).
Реализация фильтра «tooltip», скорее всего будет реализована на основе собственного js скрипта.
После тестирования и «причесывания» кода, выложу на d.o. (если конечно быстро разберусь с ново введенным на нем Git, просто раньше с ним ни когда не работал)
Модуль обновлен.
Добавлена поддержка кнопки для BUEditor в фильтре ccfsmileys.
Выглядит примерно так.
Код кнопки для Bueditor
editor.quickPop.open('');
var w = ccfsmileysWrap();
$("", editor.quickPop.popup).empty().append(w);
$("a.ccfsmileys", editor.quickPop.popup).click(function(){
editor.quickPop.close();
editor.active.replaceSelection(this.firstChild.alt, "end");
return false;
});
Количество показываемых смайликов можно регулировать в настройках фильтра.
Также в настройках можно отключить поддержку кнопки Bueditor-a, тем самым исключив загрузку js и css.
Вид окна можно переопределить через css (классы можно посмотерть в файле ccfsmileys_bue.css).
Смайлики идут в порядке определенном в файле smileys.pak. Таким образом можно при помощи перестановки строк в файле регулировать какие смайлики и в каком порядке будут показаны в во всплывающем окне.
А collapse text индексируется поисковиками? А то у меня на новостном сайта имеется словарь "Персоналии". Решил дополнить термины этого словаря биографиями. Но если сделать биографии обширными соответственно нужно прокрутить браузер чтобы добраться до новостей связанных с термином. Поэтому решил обернуть часть биографии в collapse text. Но вот беспокоит будут ли поисковики индексировать такой текст
А collapse text индексируется поисковиками? А то у меня на новостном сайта имеется словарь "Персоналии". Решил дополнить термины этого словаря биографиями. Но если сделать биографии обширными соответственно нужно прокрутить браузер чтобы добраться до новостей связанных с термином. Поэтому решил обернуть часть биографии в collapse text. Но вот беспокоит будут ли поисковики индексировать такой текст
индексировать будут.
Спасибо. Вы меня успокоили