Модуль для ручного ввода анонсов (доработка)

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

Аватар пользователя andypost@drupal.org andypost@drupal.org 17 августа 2007 в 21:44

Многие сталкивались с проблемой для различного отображения анонса материала (тизера) и самого материала.
Данный модуль существует довольно давно, но автор практически забыл об обновлениях и даже dev-версия идет без .info файла, что не дает большинству пользователей им воспользоваться. существует, однако, альтернатива - nodeteaser, которая немного функциональнее, но тоже не лишена недостатков и по сей день. Имхо, дополнительная таблица в базе вместо существующего и без неё teaser - излишество и дополнительная нагрузка на сервер.

Прилагаю немного доработанный мной модуль excerpt
1) /admin/content/node-settings - устанавливаются значения высоты textarea для ввода анонса(тизера) и тип генерации анонса по умолчанию
2) /admin/content/types для каждого из материалов можно настроить отличный от умолчаний вывод анонса
3) прилагаю перевод на русский

Изменения:
- Поправлен алгоритм генерации ссылка "читать далее"
- Код приближен к оригинальному модулю Excerpt который наконец дошел до релиза!

TODO
1) сделать помимо автогенерации и ручного анонса еще и его полное отсутствие (пока спасает стирание trim и вписывание пробела)
2) сделать права доступа на настройку

Предлагаю обсудить

ВложениеРазмер
Иконка изображения excerpt_screen.jpg35.69 КБ
Иконка пакета excerpt.zip3.67 КБ

Комментарии

Аватар пользователя xseed xseed 18 августа 2007 в 10:25

Обычно ограничение анонса производится тегом: <! --break-->, либо задается в настройках самого сайта. И где, в каких бы списках, лентах этот тизер не высвечивался, он всегда выглядит одинаково.
Никто не пытался сделать различным отображение превьюшек каждой ноды в зависимости от просматриваемого термина? То есть чтобы одна и таже нода в разных терминах имела разные превью.
Подробнее (вопрос)

Аватар пользователя edhel edhel 18 августа 2007 в 10:54

Никто не пытался сделать различным отображение превьюшек каждой ноды в зависимости от просматриваемого термина? То есть чтобы одна и таже нода в разных терминах имела разные превью.

В теме отображение как угодно можно сделать!

Вообще мне система с тизерами в Друпале не нравится...

1) Путано.

Например, у меня есть "Новость" сделанная в CCK (все поля через ССК, включая аннотацию и полный текст). Смотрю в БД табличку node_revision - body и teaser пустые... Хотя contemplate-ом я настроил и то, и другое, и оно нормально отображается. Зачем тогда 2 поля в БД? RSS пустой, потому что в conteplate не настроил.

Я конечно могу покапаться в коде и найти там, что на этапе загрузки ноды CCK+contemplate+ядро забивают в ноду teaser и body и прочие поля по своим алготримам, а ядро рендерит это всё по своим алготримам, подключая сюда и темы... Но непрозрачно всё это имхо.

2) Глючно.

Например, если текст story такой: <p>ДЛиннный текст.................................</p> - если автоматическая обрезка вклинится внутрь абзаца, то получится не закрытый тэг => код уже не XHTML. Можно конечно разбить на пару абзацев поменьше и break вставить, но а) забивать тексты может и не спецалист, б) каждый рах проверять на XHTML геморно.

3) Неудобно.

Простым смертным юзерам писать <!--break--> геморно и запоминать неудобно.

Вывод для себя: я почти всегда делаю все поля через CCK и сам генерирую тизеры и полное тело с помощью contemplate или темы, а на автоматические тизеры забиваю!

Аватар пользователя vadbars@drupal.org vadbars@drupal.org 18 августа 2007 в 11:07

2) в 6-ке встроен модуль автозавершения HTML. Надеюсь, он будет работать и в вашем случае.
3) в 6-ке добавлена кнопка для текстовых полей, которая вставляет break

Аватар пользователя xseed xseed 18 августа 2007 в 12:00

1) Путано.
2) Глючно.
3) Неудобно.
...

  1. Нужно придумать такой WISIWYG-интерфейс на AJAX, который заключал бы код выделенного текста в тег вида: <!tid>нужная часть текста<!/tid>, где tid - id термина.
  2. Затем из таблицы соответствия: <tid> -> <nid> Drupal как-то берет список: <nid>.
  3. Необходимо изменить (или создать) такую переменную, которая предварительно сканирует выводимые ноды на предмет наличия тегов: <!tid>...<!/tid>, и выводит в качестве тизеров массив кусков текста, заключенных между данными метатегами.
  4. Интерфейс должен обладать всплывающей командной строкой (по типу выделил -- присвоил) с поиском терминов по введенным ключевым словам и присваивать редактируемой ноде и сами термины непосредственно. Даже если такой модуль с интерфейсом будут удалены или отключены, ничего страшного не произойдет, просто отображение тизеров вернется к обычному друпаловскому методу /или с < !--break-->, поскольку метатеги: <!tid>...<!/tid>, не будут отображаться.
    Даже если будут длинные параграфы, ничего не произойдет, если анализируются эти теги.

Какая переменная отвечает за вывод тизеров? И где в теме она находится? (Ее и надо как-то поменять).
Мне кажется, было бы удобно: разметил ноду тегами, а дальше сама система (или модуль, сниппет - кто как напишет) решает как эти теги обработать.
Есть готовые решения? Smile

Аватар пользователя edhel edhel 18 августа 2007 в 12:00

Сделать можно... Но! Не всегда вообще тизер может быть составлен из кусков. Это может быть вообще другой текст, если редактору так надо.

Контролировать корректность HTML всё равно тяжело. Выделение ведь может начаться с середины одного абзаца, а кончиться в середине следующего.

ЗЫ: Лучше не <!tid>, т.к. это может поломать XHTML, лучше уж комментарий типа <!--break--> и <!--/break-->

Аватар пользователя edhel edhel 18 августа 2007 в 12:09

xseed, а зачем такие навороты непонятно? У нод что ли часто меняться термины будут? Обычно термины фиксированы у ноды, а значит и тизеры фиксированы, зачем туда !tid-то пихать..

ЗЫ: В теме в шаблоне ноды при выводе можно любой наворот реализовать.

Аватар пользователя xseed xseed 18 августа 2007 в 13:11

Это нужно, чтобы привязать отображение тизеров к терминам.
Если выводится лента с несколькими терминами одновременно (term/1,2,3, term/1+2+3), то в каждый тизер будет состоять из нескольких абзацев текста, заключенных между тегами tid. При этом повторяющиеся кусочки обрабатывать и оставлять только один, чтобы не портить тизер.
------------------
Будет еще лучше, если эта строка позволит свободный ввод терминов вида:  vocabulary, term, term, ..., term, с подсказками при каждом следующем вводе более глубокого термина. Можно сделать так, чтобы здесь же давать описания этим терминам.

Аватар пользователя andypost@drupal.org andypost@drupal.org 20 августа 2007 в 2:56

На самом деле полемика не понятна, какое отношение тизер имеет к отображению?
Данный модуль просто добавляет возможность ввести анонс руками.
В отношении ССК - крайне редко им пользуюсь. И уж если кому-то нужно выводить через него - дык и настраивать там нужно. ССК имеет весьма посредственное отношение к базовой таблице нод и их ревизий.

Аватар пользователя ryurix ryurix 21 августа 2007 в 9:47

Давно уже написал крохотный модуль, позволяющий включать поле для тизера для каждого типа материала отдельно. Дополнительные таблицы не используются.
Настраивается на странице редактирования типа материала.
Это для тех, кто не любит contemplate и CCK.

Аватар пользователя goodboy goodboy 2 июня 2008 в 18:31

2) /admin/content/types для каждого из материалов можно настроить отличный от умолчаний вывод анонса

Да, можно настроить, но изменения не сохраняются. По крайней мере, при повторном редактировании вижу установки по умолчанию из /admin/content/node-settings

Установлен Drupal 5.5.

Аватар пользователя goodboy goodboy 2 июня 2008 в 23:29

Андрей, у меня тоже тизеры работают замечательно. Единственное - форма тип документа при редактировании показывает не действительное значение переменной 'excerpt_'. $type , а variable_get('excerpt_default', EXCERPT_DEFAULT)

Например:
1. admin/content/node-settings установлено "Автогенерация", в таблице variables excerpt_default = "0"
2. Устанавливаю в admin/content/types/mytype "Вручную", в таблице variables excerpt_mytype = "1"
3. Захожу в admin/content/types/mytype - вижу установлено "Автогенерация", в таблице variables excerpt_mytype = "1"

Оказалось, что значение строки $type перед расчетом $enabled всегда пустое, поэтому variable_get берет дефолтное значение (так как в таблице variable строки с "excerpt_" нет)

Я решил проблему добавлением в модуль строки(1):

 if ( $type == '' )   $type = $form['#node_type']->type;
 $enabled = variable_get('excerpt_'. $type, variable_get('excerpt_default', EXCERPT_DEFAULT));

Я говорю только про Друпал 5.5, охотно допускаю, что в других версиях переменная $type заполняется должным образом.
Спасибо за полезный модуль!

Аватар пользователя shtrlz shtrlz 5 июня 2008 в 17:29

срабатывает с опозданием... тоесть не там где я режу а через пару предложений... как починить или хотябы где покопать?

Аватар пользователя andypost@drupal.org andypost@drupal.org 5 июня 2008 в 19:55

Что значит срабатывает с опозданием? Опишите подробнее проблему.
Модуль предназначен для ручного ввода анонса, и что значит "тоесть не там где я режу а через пару предложений..."?

Аватар пользователя Polar Polar 28 июля 2008 в 22:00

>>Подскажите, пожалуйста, как вывести тизер, введенный вручную, перед нодой?
Вы говорите о том, чтобы тизер можно было вводить отдельно от содержания ноды, а потом вывести их вместе? Можно создать дополнительное текстовое поле к типу материала.

Аватар пользователя ii ii 29 июля 2008 в 10:43

Polar,
Да, я именно об этом.
То есть, при добавлении материала, прописывать анонс и дублировать его в доп. текстовом поле?

Аватар пользователя ii ii 31 июля 2008 в 17:42

Тогда уж лучше добавить поле для тизера и модулем ConTemplate изменить его вывод (или непосредственно в node.tpl.php). Без дополнительных модулей для тизеров. Так?