Drupal. Просто и ясно

Здесь сгруппированы материалы по CMS Drupal, как правило переведённые самостоятельно с официального сайта, и которые я не нашёл на сайте русской поддержки CMS Друпал.

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

Здоровая критика и обсуждения, а также энтузиазм участников приветствуются и всячески поощряются! :)

Модули Drupal

Здесь находится информация о модулях Друпал. Как правило, это переведённая с английского официальная документация к тому или иному модулю, а также это может быть мой личный опыт, какие-то написанные патчи, хаки к модулям и тому подобное.

Информация в этом разделе постоянно обновляется.

Как написать модуль для Друпала?

Введение в модули Друпала

Как говорят сами разработчики: "Когда мы разрабатывали Друпал, стало ясно, что мы хотим иметь систему настолько модульную, насколько это вообще возможно. Модульное построение позволит обеспечить гибкость, адаптивность и непрерывность, что в свою очередь, позволит людям дорабатывать свои сайты под свои нужды и предпочтения."

Модуль Друпала просто представляет собой файл, содержащий набор процедур, написанных на PHP. Когда он используется, код модуля выполняется непосредственно в контексте сайта. Таким образом он может использовать все функции и все переменные и структуры данных основного ядра. Фактически, модуль сколько-нибудь не отличается от обычного PHP-файла: это больше идея, которая автоматически ведёт к хорошим архитектурным принципам и хорошей модели разработки. Модульность лучше всего сочетается с моделью разработки систем с открытыми исходными кодами, потому что иначе будет трудно представить как люди, работающие параллельно, не будут влиять друг на друга.

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

В тех местах, где доступны хуки, движок вызывает код каждого модуля, которые используют данный хук. Это сделано путём просмотра всей директории, где находятся модули. Скажем, ваш модуль называется foo (т.е. расположен в modules/foo.module) и если в нём есть хук под названием bar, движок вызовет функцию foo_bar(), если она присутствует в вашем модуле.

Таким образом, хуки позволяют модулю взаимодействовать с ядром Друпала. Система модулей Друпала основана на концепции хуков. Хук - это php-функция с названием (например) foo_bar(). Здесь foo - имя модуля (значит, полное имя модуля - foo.module), а bar - имя хука. Каждый хук имеет определённый набор параметров и определённый тип возвращаемой переменной. Для расширения возможностей Друпала модуль всего лишь должен предоставлять хуки. Когда Друпалу требуется функциональность модуля, движок определяет, какие модули предоставляют хуки, соответствующие данной ситуации. Найденные хуки вызываются во всех модулях, которые соответствующие хуки предоставили.

Урок "Создание модуля". Друпал 5.х

(оригинал в англ. версии находится здесь.)

Этот урок рассказывает, как создать модуль для Друпал версии 5. Это дополнение к уроку для Друпал версии 4.6. Вы можете уточнять различные детали там. Большинство в этом уроке верно и для Друпал версии 4.7, но всё же вы должны проверить документацию по API-функциям, также как и документацию "как обновить свои модули от одной версии Друпала к другой".

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

Этот урок не предназначен для того, чтобы подготовить вас писать модули, предназначенные для релиза. Этот урок не освещает ни кеширование, ни рассматривает подробно управление доступом или проблемы безопасности. Используйте этот урок в качестве начала, и смотрите другие модули, Настольную книгу Друпала и Стандарты Кода для более детальной информации.

Этот урок требует от вас:

  • Базового знания PHP, включая синтаксис и концепцию объектов в PHP
  • Базового понимания таблиц баз данных, их полей, записей и синтаксиса языка SQL
  • Работающий экземпляр Друпала
  • Доступ к Друпалу с правами администратора
  • Доступ к веб-серверу

Этот урок не требует от вас какого-либо представления о внутренней работе модуля Друпала. Этот урок не научит вас писать модули для более ранних версий, чем Друпал 4.5.

Пишем модуль для Друпала. Часть первая: Начало

Определимся с целью данного тура. Мы начнём с создания блокового модуля, который отображает ссылки на контент: например, ссылки на записи в блоге или обсуждения на форуме, которые были созданы неделю назад. Этот урок научит вас создавать содержимое блока, формировать ссылки, а также получать информацию из документов Друпала.

Прежде всего, создайте директорию в папке Друпала, предназначенной для хранения сторонних (не входящих в ядро) модулей: sites/all/modules/onthisdate. Может быть Вам потребуется сначала создать папку sites/all/modules. Создайте PHP файл и запишите его в директорию sites/all/modules/onthisdate под именем onthisdate.module. В Друпал, начиная с версии 5.х, директория sites/all/modules является наиболее желательной для сторонних (не включенных в ядро) модулей (так же как директория sites/all/themes для сторонних тем), т.к. начиная с этой версии, директория sites/ содержит в себе все файлы, специфичные для того или иного сайта. Это позволяет проще обновлять файлы и модули ядра, без стирания ваших специфичных файлов.

<?php
/* $Id$ */

В соответствии со Стандартом Написания Кода Друпала, используйте длинную версию начального тега <?php, а не <? для заключения в него php кода. Также не используйте в файле закрывающий тэг ?>. Строка с кодом $Id$ поможет вносить информацию о текущей версии документа и дате его последнего изменения, когда вы отошлёте файл в систему управления версиями CVS.

Все функции вашего модуля, которые будет использовать Друпал, именуются следующим образом: {modulename}_{hook}, где "hook" - имя предопределённой функции (хука, в терминологии Друпала). Друпал будет вызывать такие функции для получения определённых данных. Предопределённые имена хуков необходимы, чтобы Друпал знал, как и где получить нужную информацию. Впоследствии мы рассмотрим хуки более подробно.

В настоящее время модуль не работоспособен - он ещё не включен. Мы активируем модуль позже в нашем уроке.

Пишем модуль для Друпала. Часть вторая - Как сказать Друпалу о вашем модуле

Основная затронутая тема: Как дать знать Друпалу о существовании нового модуля
Описанный хук: hook_help

В Друпал 5.х основная информация о вашем модуле, его имя и описание, больше не предоставляются хуком hook_help. Вместо этого, все модули должны иметь файл modulename.info, содержащем мета информацию о модуле (детали смотрите в документе Writing .info files (Drupal 5.x)). В нашем примере, этот файл должен называться "onthisdate.info".

Основной формат такой:

; $Id$
name = Module Name
description = "A description of what your module does."

Помните, что без этого файла, ваш модуль не будет показан в списке модулей на странице администрирования!

для нашего примера, файл должен содержать следующее:

; $Id$
name = On this date
description = "A block module that lists links to content such as blog entries or forum discussions that were created one week ago."

Добавьте этот исходный код в файл, названный onthisdate.info, перед тем как записать его в папку модуля sites/all/modules/onthisdate.

Также в файле .info могут присутствовать две необязательные строки:

dependencies = module1 module2 module3
package = "Ваша произвольная строка символов для группировки"

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

Если вы присваиваете строку для группировки в ваш модуль, на странице admin/build/modules он будет отображаться вместе с модулями той же категории. Если же вы не присваиваете зависимостей, он будет отображён как 'Uncategorized' ("Другое"). Неприсваивание строки для группировки абсолютно нормально, в общем случае, пакетная группировка хороша для модулей, которые поставляются вместе, или подразумевается, что они будут использоваться совместно. Если у вас есть какие-либо сомнения по поводу этого, оставьте это поле пустым.

Предложенные примеры некоторых разделов для группировки:

  • Audio
  • Bot
  • CCK
  • Chat
  • E-Commerce
  • Event
  • Feed Parser
  • Organic groups
  • Station
  • Video
  • Views
  • Voting (если модуль использует VotingAPI)

Эти файлы (.info) пишутся в ini-формате, и могут содержать строку ; $Id$ для того, чтобы позволить CVS вставить информацию о файле.

Для получения дополнительной информации о формате файлов ini, смотрите документ PHP.net parse_ini_file documentation.

Мы также можем предоставить помощь и другую дополнительную информацию о нашем модуле. Вследствие использования файла .info, как это описано выше, хук hook_help теперь необязателен. Тем не менее, хорошая идея включить его. Имя хука для этой функции - 'help', поэтому начнём с объявления функции onthisdate_help:

<?php
function onthisdate_help($section='') {

}
?>

Переменная $section предоставляет контекст, в котором используется помощь, т.е. где именно в Друпале, в каком месте модуля мы смотрим помощь. Рекомендуется обработать эту переменную оператором switch. Вы можете увидеть шаблон такого кода в других модулях.

<?php
/**
* Display help and module information
* @param section which section of the site we're displaying help
* @return help text for section
*/
function onthisdate_help($section='') {

 
$output = '';

  switch (
$section) {
    case
"admin/help#onthisdate":
     
$output = '<p>'t("Displays links to nodes created on this date"). '</p>';
      break;
  }

  return
$output;
}
// function onthisdate_help
?>

Ветка с условием admin/help#modulename используется ядром Друпала для связи с основной страницей помощи (/admin/help или ?q=admin/help). В конечном счёте, вы захотите добавить ещё текста, чтобы обеспечить более качественное сообщение для пользователя.

Дополнительная информация о hook_help: Drupal HEAD

Добавьте показанный выше исходный код в файл с именем onthisdate.module прежде чем сохраните и установите его.

Модули Друпала: Image

Модуль Image (англ. "Изображение") - общее описание. (Оригинал статьи на странице проекта Image)

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

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

Модуль Image (начиная с 5.x версии) поставляется с несколькими дополнительными модулями:

  • image_gallery.module : используя термины таксономии, организует и отображает ваши загруженные фотографии в виде галерей
  • image_attach.module : позволяет легко присоединять тип нод "изображения" к другим видам контента (другим нодам). (несколько слов чтобы разъяснить ситуацию. Модуль Image создаёт отдельный тип контента (ноду) под названием Image ("Изображение"). Модуль image_attach.module позволяет легко присоединять этот тип контента к любым другим.)
  • image_im_advanced.module : добавляет расширенные опции обработки изображений ImageMagick, например, такие как наведение резкости к набору графических инструментальных средств ImageMagick.
  • image_import.module: упрощение добавления нескольких изображений путем импорта изображений из каталога на сервере.

Модуль Image: ноды типа Image ("Изображение"), присоединённые изображения и галереи изображений. (Оригинал статьи здесь.)

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

Есть два используемых по умолчанию производных размеров, "Thumbnail (эскиз, миниатюра)" и "Preview (предварительный просмотр)". Миниатюра показывается в тизере для нод типа Image и при просмотре галерей изображений. Изображение размером предварительного просмотра показывается при первом отображении ноды типа Image. Размеры могут быть изменены, а также могут быть определены множество других производных размеров.

Нижеследующие модули в связке с модулем Image позволяют делать больше вещей с вашими изображениями:

  • Модуль "Image gallery" (Фотогалерея) позволяет организовывать и отображать картинки в галереях. Вкладка "List" позволяет пользователям редактировать у существующих фотогалерей названия, описания, родительские галереи, и относительное положение, известное как вес. Вкладка "add galleries" позволяет создать новую галерею изображений, определить название, описание, родителя и вес галереи.
  • Модуль "Image attach" позволяет изображениям быть присоединёнными к другим нодам: страницам, статьям, или другим пользовательским типам контента. Вы можете указать, какие производные размеры будут отображаться как в тизере, так и при полном просмотре документа, а также вес изображения относительно содержания ноды. Прилагаемое изображение ссылается на ноду с изображением в настоящем размере, позволяя читателям увидеть изображение в полный размер. Поддержка для модуля Views включена.
  • Модуль "Image import" позволяет массовый импорт изображений из каталога на вашем веб-сервере.

Вы можете:

  • видеть сообщения о работе с изображениями в administer >> settings (управление >> настройки).
  • видеть списки и добавлять галереи изображений в administer >> image (управление >> изображения).
  • настраивать размеры изображений и файловые директории в administer >> settings >> image (управление >> настройки >> изображение).
  • использовать модуль "Image assist" для загрузки и вставки изображений в посты.
  • просмотреть справку, прочитать об известных ошибках, и скачать последнюю версию на странице проекта Image.

Как использовать модуль "Image attach"

Для использования модуля "Image attach" нужно:

  1. убедиться, что присоединение имеющихся изображений в ноды включено, на странице администратор/параметры/image_attach (admin/settings/image_attach, это путь по умолчанию).
  2. перейти на страницу администратор/содержание/типы (admin/content/types) для управления типами контента, потом для каждого типа контента, к которому вы хотите прикреплять изображения, нажмите "Изменить" ("Edit") (или нажмите название типа контента) и включите опцию "Приложить изображения".

Модуль позволяет пользователю как прикреплять существующие изображения (ноды типа Image) к странице/статье, так загрузить новое на лету без предварительного создания ноды типа Image (создание соответствующей ноды типа Image осуществляется автоматически).

Изображение отображается в виде миниатюры, ссылающейся на ноду типа Image, этого изображения, в верхнем правом углу ноды по умолчанию. В небольшой степени это может контролироваться на путем изменения "Прикреплённое изображение ... вес" ("Attached image ... weight") на странице управления данным типом контента в администраторской зоне сайта (см. выше), и в гораздо более крупной степени путём использования тем (themeing) и пользовательскими CSS.

Только одна нода типа Image можно подключить таким образом к другой ноде.

Модули img_assist и IMCE предлагают более изощрённые возможности вставки изображений, но для простых случаев этого может быть достаточно. Это немного лучше, чем стандартные возможности для прикрепления файлов, по меньшей мере, хотя последняя допускает несколько присоединённых файлов.

Использование тега IMG с модулем Image

Основной вопрос заключается в том, как показывать картинки. Помимо других модулей, таких, как img_assist, вы можете использовать тег img.

Если вы используете ЧПУ (аббревиатура от словосочетания «ЧеловекоПонятный Урл» («урл» - жаргонное навание для URL)):

<img src="http://www.example.org/image/view/##/preview" />
<img src="http://www.example.org/image/view/##/thumbnail" />

Если вы не используете ЧПУ:

<img src="http://www.example.org/?q=image/view/##/preview" />
<img src="http://www.example.org/?q=image/view/##/thumbnail" />

Если вы зайдёте в администратор >> настройки >> изображения (admin >> settings >> image) и посмотрите на размеры, вы увидите название по умолчанию, предварительный просмотр (preview) и миниатюру (thumbnail). Вы можете добавить новые размеры и назвать их так, как вы выберете.

Если вы хотите дать ссылку на исходное изображение, синтаксис будет таким же, с тегом _orginal.

Если вы используете ЧПУ:

<img src="http://www.example.org/image/view/##/_original" />

Если вы не используете ЧПУ:
<img src="http://www.example.org/?q=image/view/##/_original" />

Таким образом, sitename/image/view/#image_ID#/label даст вам путь, пригодный для использования в теге . Если вы добавили дополнительные размеры в настройках модуля Image, вы можете обращаться к ним по их меткам также, как показано в примерах выше.

Более подробная информация о том, как использовать тег img src можно найти в Интернете.

Далее переведено из комментариев к статье:

Относительные пути

Похоже, вы также можете использовать относительный путь:
<img src="/image/view/##/preview" />

Но если вы дали вашему изображению (тип контента Image) путь URL (синоним адреса), или если вы используете модуль pathauto (который создаёт синонимы URL для документов), вы не сможете использовать этот синомим в теге . Вы должны использовать идентификатор (ID).

то есть: у вас есть изображение под названием "Big turnip", и вы дали ему путь "big-turnip". Тогда <img src="/image/view/big-turnip/preview" /> работать не будет.

Кэширование изображения

Похоже, что используя этот метод линковки ( /image/view/xx/_original ) на изображения, они вынуждены перезагружаться при каждой загрузки страницы, неважно какой именно (проще говоря, не кешируются браузером).

Ссылка напрямую на изображение ( /files/images/myimage.jpg ) приводит к стандартному поведению кэша.

После пробы кучи разных схем кэширования Apache, следующий вариант представляется более эффективным для этих целей. Я выбрал директиву "location", так как я запускаю много drupal-сайтов на одном сервере, и эта схема будет работать при загрузке изображения с любого сайта. Это на Apache 2, и я сделал отдельный файл в папку conf.d ...

# This module needs to be loaded, but in my case it was already loaded..
# Этот модуль должен быть уже загружен, но в моем случае он уже загружен ..
# You may need to load it.
# Возможно Вам необходимо загрузить его.
# Conditional loading would probably be smartest
# Вероятно, загрузки будут более быстрыми
# LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so


# I am not 100% sure this is necessary
# Я не уверен на 100%, что это необходимо
ExpiresActive On

<Location /image/view>
  # Cache images for 3 hours
  # Кэшируем изображения на 3 часа
  Header Set Cache-Control "max-age=10800"
</Location>

Источник: Using IMG tags with image module

Работа в условиях нехватки памяти на обработку изображения

В случае большого изображения, спрос на память со стороны PHP резко возрастает, и загрузка такого изображения приводит к ошибке нехватки памяти. В качестве обходного манёвра, вы можете увеличить размер памяти, или же вам придётся уменьшить размеры изображения, и загружать меньшее изображение. Например, попробуйте 1024x768 пикселей вместо 2448x1836 пикселей.

Модули Друпала: CCK

Модуль CCK (The Content Construction Kit, переводится как Набор для Конструирования типов Контента, в Друпале документы называются ноды (node), содержание нод и есть контент, можно сказать, что термины эти равнозначны, особенно в рамках этой статьи) позволяет вам создавать и править под свои нужды различные поля нод, используя веб-браузер. Версия модуля CCK для Друпала ветки 4.7х позволяет создавать пользовательские типы нод и добавлять к ним различные поля. В Друпале ветки 5.х пользовательский тип нод может быть создан стандартными функциями Друпала (находящимися в ядре, core-функции), и CCK позволяет добавлять различные поля к любому типу нод.

Важно: релиз безопасности 1.6
Модуль CCK 1.6 для веток 4.7х и 5х исправляет две уязвимости, позволяющие межсайтовое исполнение скриптов (XSS, Cross Site Scripting) в nodereference.module.
Все сайты, использующие CCK / nodereference.module должны принять это во внимание и обновиться до данного релиза как можно быстрее.

Извещение безопасности: DRUPAL-SA-2007-019

-------------------------------

Убедитесь, что вы посетили update.php после обновления до новой версии.

Совместимость с модулем Views:

  • CCK теперь проектируется для работы с Views версии 1.6 (или выше).
  • Из-за изменения некоторых API-функций в последнем релизе Views, CCK v1.4 вызывает сообщения об ошибке при работе с Views 1.6 (http://drupal.org/node/134812). Пожалуйста, обновитесь до последнего релиза CCK, если Вы используете Views 1.6.

Вкратце:
CCK 1.4 <--> Views 1.5
CCK 1.5+ <--> Views 1.6

Внимание: CCK-HEAD содержит находящийся в разработке, экспериментальный и нестабильный код для Друпал 6. Совершенно не готов к использованию, и несовместим с Друпал 4.7 или 5. Вместо него используйте релизы CCK для веток Друпала 4.7.x или 5.x.

-------------------------------

Неколько сотрудничающих проектов предоставляют дополнительные типы полей и виджеты для модуля CCK:

  • вычисляемые поля: позволят вам добавлять управляемые PHP "вычиляемые поля" для типов контента CCK
  • дата: создаёт поле для даты в формате ISO или unix timestamp
  • <a href="http://drupal.org/project/email" title="email module" rel="nofollow">электропочта: проверяемое поле для электронной почты
  • Поле для хранения изображений
  • ссылка: поле для хранения URL

Эти модули имеют отношение к CCK:

  • content template, contemplate: позволяет вам управлять формами и видимостью их различных полей, в том числе тизерами и RSS-потоками
  • Модуль Views: предоставляет множество возможностей просмотра контента; CCK предоставляет свои поля для подсистемы модуля Views.

Список модулей для CCK продолжает расти. Полный список зависимых от CCK модулей смотрите в разделе загрузок.

Источник: модуль CCK

Настольная книга модуля CCK

CCK позволяет вам добавлять различные поля к разным типам контента, используя веб-интерфейс. В Друпал 4.7 CCK создаёт как произвольный тип контента, так и произвольные поля к ним. В Друпал 5.х, произвольные типы контента могут быть созданы прямо в Друпале, и CCK позволяет вам добавлять произвольные поля к любым типам контента.

Описания шагов и путей того, как можно сделать то-то и то-то, различаются для версий 4.7 и 5.х. Имейте в виду, что инструкции наподобие "administer >> settings" не являются готовыми ссылками, по которым вам нужно перейти, а ссылаются на конкретные шаги в системе навигации, включающие в себя переходы на фиксированные страницы, т.е. "Выберите "Управление сайтом" в меню навигации, затем выберите "Настройки".

Drupal 4.7

Вы можете:

  • включить модули CCK в разделе administer >> modules
  • управлять модулями CCK в administer >> content >> content types.
  • устанавливать разрешения для типов контента и управлять ими в administer >> access control.
  • управлять такими поведением и такими особенностями ноды, как настройки по умолчанию, комментарии, рисунки, вложенные файлы, если они разрешены, в administer >> settings >> content types и затем выбрав configure для нужного типа ноды.
  • скачать (предложить) файл, прочитать об известных багах, и скачать последнюю версию CCK со страницы проекта.

Drupal 5.x

Вы можете:

  • включить модули CCK в Administer >> Site building >> Modules.
  • управление типами контента теперь происходит в ядре. Вы можете добавить и редактировать их в Administer >> Content management >> Content types.
  • управлять полями, построенными с помощью CCK в Administer >> Content management >> Content types и выбрав для редактирования нужный тип контента. На экране редактирования вы увидите вкладки, предназначенные для управления полем (Manage fields) и добавления нового поля (Add field).
  • устанавливать разрешения для типов контента и управлять ими в User management >> Access control.
  • скачать (предложить) файл, прочитать об известных багах, и скачать последнюю версию CCK со страницы проекта.

Источник: Content Construction Kit HandBook

Начало работы с CCK

В Друпал 5.х у вас есть возможность создавать столько различных типов контента, сколько вам нужно. CCK достраивает эту возможность, позволяя вам добавлять произвольные поля для различных типов контента. Если вы используете модуль Views, имейте в виду, что CCK также делает все ваши поля доступными для любого вида (View).

Установка модуля CCK не отличается от установки других модулей, скачайте и распакуйте архив со страницы проекта http://drupal.org/project/cck и добавьте его в папку 'sites/all/modules' вашего сайта, затем посетите страницу admin/build/modules, чтобы активировать его.

Сейчас CCK представляет собой группу модулей. Первичный модуль называется 'Content' и он необходим для работы любого другого CCK-модуля. Архив включает в себя некоторое количество модулей, которые составляют ядро модуля CCK ('Core CCK'). Это следующие модули:

  • Text - Текст
  • Number - Число
  • Nodereference - Ссылка на ноду
  • Userreference - Ссылка на пользователя
  • Optionwidgets - виджеты
  • Fieldgroup - группа полей

Сейчас есть много других модулей, созданных для использования вместе с CCK. Вы можете видеть их на странице http://drupal.org/project/Modules/category/88. Когда вы хорошо познакомитесь с CCK, вы можете скачать, установить и использовать любой из этих модулей. Однако лучший способ изучить CCK - это начать его использование только с его базовых модулей (Core CCK modules). Базовые модули имеют хорошую поддержку, и это проще - начать с малого количества альтернатив, поэтому начинайте с включения только базовых модулей CCK.

CCK: Добавление нового поля (шаг 1)

Зайдите на страницу Администрирование > Управление содержанием > Типы содержания (admin/content/types), где Вы увидите список доступных типов контента. Там есть пара типов, включённых в качестве части стандартной установки Drupal, и вы можете использовать один из них или добавить новый тип содержания самостоятельно. В нашем примере, давайте добавим некоторые поля в тип 'story'.

Выберите параметр "Изменить" для типа "story". Когда вы увидите экран, на котором вы можете изменить этот тип содержания, вы увидите дополнительные вкладки, названные "Управление полями" ('Manage fields'), "Отображение полей" ('Display fields') и "Добавить новое поле" ('Add new field'). Если выбрать вкладку "Управление полями" или "Отображение полей", вы ничего не увидите, поскольку вы ещё не создали ни одного поля, поэтому начните, выбрав опцию "Добавить новое поле".

На экране "Добавить новое поле" вам будет предложено ввести название для поля. Вы можете вводить здесь всё что угодно, включая пробелы, но то, что вы здесь введёте будет использоваться для создания настоящего поля в базе данных. Если вы введёте "My Text", фактически поле будет называться field_my_text. Вы сможете позже использовать фактическое имя поля, чтобы сделать какие-либо пользовательские настройки в теме оформления (темизация). Имейте в виду, что фактическое (машинное) название поля не может быть изменено позднее!

Ниже имени поля вы увидите список полей, которые имеются в наличии. Основные поля "Текст" ('Text'), "Целое число" ('Integer'), "Десятичное число" ('Decimal'), "Ссылка на ноду" ('Nodereference') и "Ссылка на пользователя" ('Userreference'). Названия полей передают тип контента, который можно создать в этих полях. Поле "Текст" создаст материал, который хранится в базе данных в виде простого текста. Поля "Целое число" и "Десятичное число" создадут материал, который сохраняется в базе данных как числа. "Nodereference" и "Userreference" соответственно сохраняют идентификаторы (ID) документа или пользователя в базе данных, что позволяет вам сформировать ссылку на документ или на пользователя.

Под каждый тип поля существует несколько вариантов того, как данные будут вводиться в это поле (CCK называет это "виджеты"). Они контролируют возможные пути того, какая форма ввода будет отображаться для этого поля. Доступные опции разнятся для каждого поля, но включают такие вещи, как, например текстовое поле, которое является простым пустым полем, где пользователь может ввести текст, автоматически заполняемое текстовое поле, где пользователь может ввести текст, и система будет пытаться дополнить текст из информации, имеющейся в базе данных, списки выбора, флажки, и радиокнопки.

Экран будет выглядеть наподобие этого (в скобках указан возможный русский перевод):

Create new field (Создать новое поле)


The machine-readable name of the field (Машинное название поля).
Allowed characters : unaccentuated a-z, numbers and _. All other characters will be discarded (Разрешённые символы: строчные a-z, числа и _. Все другие символы будут отброшены).
You'll be able to choose a human-readable label for the field on next page (Вы сможете выбрать удобное человеку имя поля на следующей странице)

Node Reference

Integer

Decimal

Text

User Reference




Начните с чего-то простого, например поля "Текст" с виджетом простого текстового поля, выбрав Текст >> Текстовое поле (Text >> Text Field).

Источник: Adding a New Field (step 1)

CCK: Добавление нового поля (шаг 2)

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

New Field Form

Widget settings

These settings apply only to the My Text field as it appears in the Story content type.


Select a group, in which the field will be displayed on the editing form.

Instructions to present to the user below this field on the editing form.


Data settings

These settings apply to the My Text field in every content type in which it appears.


The maximum length of the field in characters. Leave blank for an unlimited size.

The possible values this field can contain. Enter one value per line, in the format key|label. The key is the value that will be stored in the database and it must match the field storage type, text. The label is optional and the key will be used as the label if no label is specified.


Вы заметите, что список возможных виджетов появляется вновь на данном экране. Это потому, что у вас есть возможность изменить используемый вашим полем виджет. Давайте сейчас пропустим этот раздел.

Некоторые из элементов, которые вы можете определить, следующие:

Заголовок (Label)

Создайте заголовок здесь. Это возможность создать такой заголовок, в котором есть различные компоненты, не только машинное название поля. Он может содержать пробелы или символы non-ASCII, и он может быть изменён позднее. Машинное имя не может быть изменено.

Строки (Rows)

Эту настройку вы увидите только для поля "Текст". Если Вы оставите её значение по умолчанию "1", появится очередное текстовое поле в вашей форме, которое будет хранится в виде поля varchar (MySQL) в базе данных. Если вы выберете число больше, чем "1", вы получите большое текстовое поле в вашей форме, для которого установлено введённое здесь количество строк, это поле будет хранятся в текстовом поле в базе данных.

Значение по умолчанию (Default value)

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

Группы (Group)

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

Справочный текст (Help text)

Всё, что Вы напечатаете в "Справочном тексте", появится для конечных пользователей в качестве описания этого элемента формы.

Обязательно (Required)

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

Множественные значения (Multiple values)

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

Обработка текста (Text processing)

Это еще одна опция, которая применяется только к текстовым полям. Здесь вы можете определить, имеет ли пользователь возможность выбрать фильтр для обработки текстов. Возможность использования фильтра будет иметь смысл только в том случае, если создаётся текстовое поле с более чем одной строкой.

Максимальная длина (Maximum length)

Выберите максимальную длину поля или оставьте её пустой для неограниченной длины. Если это текстовое поле, эта величина будет использоваться для сокращения поля до выбранного размера.

Список разрешённых значений (Allowed values list)

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

Сохранить поле (Save the field)

Выберите или заполните вышеперечисленные значения, а затем сохраните поле. Вы будете направлены обратно на экран "Управление полями" ('Manage Fields').

Пример php-кода для разрешенных значений для поля cck (из комментариев пользователей, автор - davidhunt)

Это глупый кусок кода, который я написал, когда экспериментировал со способами дать определённому типу контента доступ к терминам таксономии для cck-полей без использования таксономии. Идея, вероятно, бесполезна, но код работает. Я привёл его здесь потому, что было бы действительно неплохо иметь один или два примера в документации для данного раздела. It would have saved me a bunch of experimentation. Это бы спасло мне кучу времени, потраченного на эксперименты.

<?php
$terms
= taxonomy_get_tree(1); //$terms will be an array of objects representing taxonomy terms

foreach($terms as $term) {
$term_names[] = $term->name; //$term_names will be an array consisting of the name of each taxonomy term
}

return
$term_names;
?>

Источник: Adding a New Field (step 2)

CCK: Управление полями

После того как вы создадите по крайней мере одно поле, этот экран ("Управление полями") станет вашей основным местом, где вы сможете их наблюдать и организовывать. Вы увидите как поля, созданные вами с помощью CCK, так и поля, добавленные другими модулями, которые CCK не может контролировать. Например, вы увидите элементы "Заголовок" ('Title') и "Тело" ('Body') документа на данном экране. Каждое поле имеет вес, который позволяет управлять порядком их вывода, когда вы создаёте или редактируете документ. Если вы включили модуль Fieldgroup, вы увидите ваши поля, организованные в группы. На этом экране можно изменить вес и группу для каждого поля. Если у вас не создано ни одной группы, и вам не из чего выбирать, используйте "Добавить новую группу" ('Add new group'), чтобы создать её.

Вес определяет порядок, в котором появляются поля. Поле с более "тяжёлым" весом появится после поля "легкого" веса. Имейте в виду, что если в документе также существуют не-CCK поля (т.е. созданные без использования модуля CCK), они используют свои собственные веса. Например, поле "Заголовок" ('Title') имеет по умолчанию вес -5, и он не может изменяться через CCK. Если ваш документ содержит поле "Тело" ('Body'), оно имеет вес 0. Если ваш тип контента использует таксономию, она имеет вес -3. Поэтому для ваших полей нужно выбрать такие веса, чтобы поля вписались в документ так, как вы задумали. Если у Вас много полей, может быть трудно вместить их все между другими элементами на форме. В такой ситуации и пригодится модуль Fieldgroups, поскольку вы можете поместить поля в группы, а затем организовать их по весу в группе.

Изменение веса не CCK-полей

Автор - пользователь v1nce

Если вам необходимо изменить вес неконтролируемого через CCK элемента, используйте хук hook_form_alter.

Мне необходимо было корректировать вес поля "Заголовок" ('Title') от -5 до -10, для этого я создал form_weight.module и добавил нижеследующий код:

<?php
function form_weight_form_alter($form_id, &$form) {
  if(
$form_id == "YOUR_FORM_ID") {
   
$form['title']['#weight'] = -10;
  }
}
?>

Источник: Manage Fields

Модули Друпала: BUEditor

Простой текстовый редактор, предназначенный для облегчения написания кода (вероятно автором BUEditor'а имеется в виду HTML-код).

  • Интерфейс редактора и функциональность кнопок полностью настраивается в административной зоне.
  • Интерфейс редактора можно настроить отдельно для каждой роли пользователей.
  • Возможно создавать графические или текстовые кнопки.
  • Кнопки можно настроить для получения фрагментов кода, вставки HTML-тегов, вставки bbcode-тегов и т.д.

Редактор поставляется в конфигурации "default editor" ("редактор по умолчанию"), в которой есть предопределённый заранее набор кнопок. По умолчанию кнопки такие:

  1. Insert/edit image (вставить/редактировать изображение): Вставляет HTML-код, необходимый для отображения изображения. Может использовать javascript API модуля IMCE для просмотра файлов, если этот модуль установлен. Возможно редактирование ранее вставленного изображения, если выделенный HTML-код изображения выделен без лишних символов.
  2. Insert/edit link (вставить/редактировать ссылку): Вставляет HTML-код, необходимый для отображения ссылки. Это работает так же, как графические вставки.
  3. Bold (жирный шрифт): Обрамляет выделенный текст тегом <strong> (в HTML этот тег формирует жирный текст).
  4. Italic (наклонный шрифт, курсив): Обрамляет выделенный текст тегом <em> (в HTML этот тег формирует курсив).
  5. Ordered list (пронумерованный список): Преобразует строки выделенного текста в нумерованный список. Кроме того, можно начать новый список, не выборая никакого текста. Если выбранная область текста является списком, который ранее был создан при помощи этой кнопки, строки текста восстанавливаются в исходное состояние.
  6. Unordered list (ненумерованный список): Создаёт маркированный список.
  7. Teaser break (разделитель анонсов): Вставляет друпаловский разделитель анонса: <!--break-->
  8. Preview (предварительный просмотр): Позволяет осуществить предварительный просмотр выбранного фрагмента текста, или весь текст, если ничего не выбрано. Строки и параграфы формируются автоматически, как это обычно происходит при предварительном просмотре средствами самого Drupal.
  9. Help (Справка): Отображает название (а также подсказку или совет) для каждой кнопки редактора.

Источник: BUEditor

BUEditor: Установка

Выполните следующие действия, после того, как загрузите модуль на странице проекта.

  1. Распакуйте bueditor в ваш каталог модулей.
  2. Включите модуль на странице управления модулями.
  3. Добавьте/отредактируйте редакторы и их кнопки на странице: администратор/параметры/bueditor (admin/settings/bueditor).
  4. Существует настроенный по умолчанию редактор ("default editor"), который можно использовать в качестве отправной точки.
  5. Вы можете установить модуль IMCE и использовать его как файловый менеджер (или менеджер изображений) в диалогах вставки изображений и ссылок редактора.

Источник: Project BUEditor » Installation

BUEditor: Кнопки

ЭКСПОРТ И УДАЛЕНИЕ КНОПОК:

Вы должны сначала выбрать кнопки, которые вы хотите экспортировать или удалить, проставив флажки рядом с ними. Затем выберите действие, которое хотите осуществить с ними, выбрав его в выпадающем списке ниже всего списка кнопок и нажмите "GO" ("Вперёд").

ДОБАВЛЕНИЕ КНОПОК:

Вы можете добавить кнопки для редактора двумя способами:

  1. Вручную вводя значения полей для новой кнопки, в нижней части списка кнопок.
  2. Импортировать файл, содержащий ранее экспортированные кнопки.

СВОЙСТВА КНОПОК:

TITLE (required) (ЗАГОЛОВОК (обязательно)): Название или имя кнопки. Отображается в браузере как всплывающая подсказка при наведении курсора на кнопку. Название можно сделать переводимым на другие языки (стандартными средствами Друпала) путём добавления префикса "t:". Пример: t:Bold заменяется на t('Bold').
CONTENT (СОДЕРЖАНИЕ): HTML или javascript код, который будет выполняться, когда кнопка будет нажата. Это может быть также PHP-код, который предварительно выполняется и возвращает HTML или javascript-код. Для боле подробной информации смотри раздел "ВИДЫ КНОПОК".
ICON (ИКОНКА): Изображение или текст (надпись), для обозначения кнопки.
KEY (КЛЮЧ): Клавиша быстрого доступа кнопки, она поддерживается некоторыми браузерами, как ярлык на веб-страницах. Используя правильно составленные комбинации клавиш, пользователи могут выполнить действие той кнопки, которой соответствует этот ключ. Используйте Alt+KEY в Internet Explorer, и Shift+Alt+KEY в Firefox.
WEIGHT (ВЕС): Необходим для сортировки кнопок. Кнопки располагаются слева направо начиная с самой лёгкой по весу и заканчивая самой тяжёлой.

ВИДЫ КНОПОК:

Существуют три типа кнопок, в зависимости от свойства "CONTENT" ("СОДЕРЖАНИЕ"):

HTML-КНОПКИ

Они используются для простого ввода обычного текста или HTML-разметки в текстовое поле. Можно использовать выделенный в текстовом поле текст, обозначая его как %TEXT% . Например, если свойство "CONTENT" ("СОДЕРЖАНИЕ") кнопки такое - "<p>%TEXT%</p>", и она нажата после выделения текстового фрагмента "Привет мир!", результат будет таким: "<p>Привет мир!</p>", с сохранением выделения текстового фрагмента. Множественные вхождения %TEXT% возможны, каждое такое вхождение будет заменено на выделенный фрагмент текста. Этот тип кнопок полезен для простых HTML-тегов или других простых тегов, например, таких, как BBCode.

Примечание: если вы хотите вставить текст, содержащий как фразу %TEXT%, используйте javascript-кнопки.

JAVASCRIPT-КНОПКИ

Содержание javascript-кнопки должно начинаться тремя символами "js:", чтобы её можно было отличить от html-кнопки. Дальнейший код рассматривается как javascript-код и выполняется в функции, когда кнопка нажата. При написании javascript-кнопки можно использовать переменную E для доступа к текущему экземпляру редактора. Кнопки этого вида используются в особых случаях, когда недостаточно просто заменить выделенный текст. Редактор имеет множество готовых к использованию методов и переменных, что облегчает создание javascript-кнопок. Смотри раздел "API РЕДАКТОРА".

PHP-КНОПКИ

Содержание php-кнопки должно начинаться символами "php:". Дальнейший код предварительно выполняется на стороне сервера (он помещается в некоторую php-функцию и она вызывается), и ожидается, что он вернёт также некоторый код. По возвращённому значению php-кода выясняется настоящий тип кнопки. Если php-код ничего не возвращает или возвращает false, кнопка отключается и не отображается в редакторе.

php-кнопка на самом деле это HTML- или javascript-кнопка. Выполнение php-кода может пригодиться для некоторых специальных целей. Например, можно отключить или изменить свойство "CONTENT" ("СОДЕРЖАНИЕ") кнопки для определённой роли пользователя.

Кнопка с таким свойством "CONTENT"

<?php
if (user_access('access foo')) {
  return
'js: alert("You have the permission to access foo")';
}
?>

превращается в javascript-кнопку для пользователей, имеющих права "access foo" (обычно, можно перевести как "доступ к модулю foo"), её свойство "CONTENT" будет содержать в себе возвращённое этим кодом значение. Для других кнопка будет выключена и не будет показана.

Источник: BUEditor Buttons

BUEditor: Структура директорий

ИКОНКИ РЕДАКТОРА

Иконки хранятся в папке редактора "icons". Вы можете скопировать дополнительные иконки в эту папку, чтобы сделать их видимыми в списке иконок на странице настроек редактора.

БИБЛИОТЕКА РЕДАКТОРА

Во время создания javascript-кнопки вы, возможно, захотите использовать функции или переменные из внешней javascript-библиотеки, в целях сокращения кода и улучшения его читабельности. В этом случае, вы должны разместить свою javascript-библиотеку внутри папки "library" редактора. Все файлы с расширением .js в этом каталоге будут загружаться автоматически вместе с редактором. Имейте в виду, что файлы library/...js являются общими и загружаются для каждого созданного вами редактора.

В случае, если вы хотите чтобы файл библиотеки был загружен только для конкретного редактора, вы должны создать каталог, который имеет то же имя, что и нужный вам редактор, в папке "library". Например, файлы library/editorFoo/...js загружаются только для редактора с именем "editorFoo".

ПАПКА РЕДАКТОРА ДЛЯ ВРЕМЕННЫХ ФАЙЛОВ

После начала использования редактора, вы можете заметить, что дополнительная папка под названием "bueditor" создаётся в каталоге файловой системы Друпала. Этот каталог используется для хранения javascript-файлов, которые содержат кнопки ваших редакторов. Включение их в отдельный файл, вместо того чтобы размещать javascript-код непосредственно в сгенерированной HTML-странице, позволяет задействовать кэширование браузера и тем самым уменьшает время загрузки страницы.

Так как кнопки могут иметь php-код, что делает их динамично изменяемыми, используется вычисление хэша md5, чтобы отследить изменения в скрипте кнопок. Если в папке для временных файлов есть совпадающий файл, то он будет загружен. В противном случае, создаётся и загружается новый файл. Если загрузка файла не удаётся, кнопки включаются как встроенный в страницу скрипт.

Примечание: файлы старше 15 дней очищаются при каждом запуске крона (cron, регулярно, по расписанию, выполняемый скрипт).

Если вы включили приватный режим загрузки файлов с сервера (метод PRIVATE), кнопки всегда включаются как встроенный в страницу скрипт.

Источник: Directory Structure

BUEditor: API редактора

ПЕРЕМЕННЫЕ РЕДАКТОРА

editor:
Основная переменная-контейнер, в которой содержатся множество других переменных и методов.

editor.active:
Текущий или использованный последним экземпляр редактора. Когда кнопка редактора нажимается или в текстовое поле перемещается фокус, соответствующий экземпляр редактора становится editor.active. Если имеется несколько экземпляров редактора, то клавиши быстрого доступа к кнопкам переключаются на работу с editor.active.

editor.active широко используется в javascript-коде кнопок, для доступа к методам текущего экземпляра редактора. Каждый экземпляр редактора имеет свои собственные переменные и методы, которые могут (должны) быть использованы в javascript-коде кнопок.

Смотри также "ЭКЗЕМПЛЯР РЕДАКТОРА".

editor.dialog:
Диалоговый объект редактора используется как всплывающее окно для ввода пользователем данных или для их отображения. Он имеет свои собственные переменные и методы. Смотри также ДИАЛОГОВОЕ ОКНО РЕДАКТОРА.

МЕТОДЫ РЕДАКТОРА

editor.processTextarea(T):
Интегрирует редактор в текстовое поле T. Это может использоваться для динамической интеграции редактора в любой момент после загрузки страницы.

editor.openPopup(id, title, content):
Открывает всплывающее диалоговое окно с данным идентификатором "id", озаглавленным как "title" и содержащем "content". Диалог возвращает javascript-объект, представляющий собой данные всплывающего окна (HTML-таблицу). Этот всплывающий объект имеет свои внутренние методы open(title, content, keeppos) и close(), которые могут быть использованы для дальнейших операций открытия и закрытия. Если параметр keeppos установлен, всплывающее окно открывается на предыдущем месте, в противном случае позиция окна сбрасывается.

Так как всплывающее окно является по сути HTML-таблицей, оно имеет все методы и свойства обычной таблицы. Разница между всплывающим окном и editor.dialog заключается в том, что у editor.dialog только один экземпляр диалога может быть видимым в одно и то же время, и когда диалог открыт, он не позволяет редактировать текст в текстовом поле.

editor.createPopup(id, title, content):
Этот метод используется методом openPopup(). Создает и возвращает объект всплывающего окна для дальнейшего использования. (но не открывает его).

Смотрите следующую страницу "ЭКЗЕМПЛЯР РЕДАКТОРА", которую нужно обязательно изучить, если вы хотите создавать свои javascript-кнопки.

Источник: API

BUEditor: API: Экземпляр редактора

Каждый редактор, работающий на странице в том или ином текстовом поле, называется ЭКЗЕМПЛЯРОМ (редактора). Экземпляр редактора имеет свои собственные переменные и методы, которые позволяют легко редактировать содержание текстового поля. Доступ к активному экземпляру редактора на странице может осуществляться при помощи переменной "editor.active".

Давайте представим, что мы присвоили переменной E значение editor.active в свойстве "СОДЕРЖАНИЕ" ("CONTENT") нашей js-кнопки (фактически нам больше не нужен editor.active, так как функции кнопки после этого переназначения вызываются с параметром E).

Вот ПЕРЕМЕННЫЕ экземпляра E:

E.textArea: текстовое поле экземпляра, представленное в качестве объекта HTML.
E.buttons: пронумерованный массив кнопок экземпляра, в виде объектов HTML, (объекты для ввода, тип кнопки или изображение)
E.bindex: индекс последней или текущей нажатой кнопки, который может быть использован в E.buttons. Например: E.buttons[E.bindex]

Вот МЕТОДЫ экземпляра E:

E.focus():
Переводит фокус на текстовом поле экземпляра.

E.getContent():
Возвращает содержимое текстового поля.

E.setContent(text):
Заменяет содержимое текстового поля переданным параметром text.

E.getSelection():
Возвращает выделенный в текстовом поле текст.

E.replaceSelection(text, cursor):
Заменяет выделенный в текстовом поле текст переданным параметром text. Необязательный второй аргумент определяет позицию курсора после замены.
Если cursor='start', курсор помещается в начале текста после замены.
Если cursor='end', курсор будет помещён в конце текста после замены.
Если cursor не определен, выделение сохраняется и выделяется текст после операции замены.

E.tagSelection(left, right, cursor):
Обрамляет выбранный текст в текстовом поле слева параметром left и справа параметром right. Необязательный Третий аргумент cursor определяет на позицию курсора после обрамления.
Если cursor='start', курсор помещается в начале выделенного текста.
Если cursor='end', курсор помещается в конце выделенного текста.
Если cursor не определен, выделение сохраняется.

E.makeSelection(start, end):
Выделяет текст между параметрами "start" и "end".

E.posSelection():
Возвращает позицию (координаты начала и конца) выделенного текста.
Возвращает {start: X, end: Y}, где X - координата начала и Y - координата конца.
Примечание: Отсутствие выделенного текста представляется как выбранный текст, где начало=конец=позиция_курсора (start=end=caret position).

E.buttonsDisabled(state, bindex):
Позволяет динамическая включать/отключать кнопки.
Первый аргумент означает состояние кнопки и должен быть установлен в "true" или "false". Необязательный второй аргумент содержит индекс кнопки, состояние которой не изменится.
Пример: отключаем все кнопки, кроме нажатой:

js: E.buttonsDisabled(true, E.bindex);

Источник: Editor Instance

BUEditor: API: Диалоговое окно редактора

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

Вот методы диалога редактора:

editor.dialog.open(title, content):
Открывает диалог с заданным названием в "title" и с заданным содержанием "content" в нем.

editor.dialog.close():
Закрывает диалог.

Источник: Editor Dialog

BUEditor: Советы и Трюки

Как расширить диалоговые окна вставки изображения или ссылки, чтобы получить значения для других атрибутов тегов "img" и "а" от пользователя?

Как создать диалоговое окно для произвольного тега, наподобие диалоговых окон для вставки изображения или ссылки?

Существует функция eDefTagDialog(tag, fields, dtitle, stitle, func) в стандартной библиотеке кнопок для создания диалогового окна для любого тега.

  • tag - имя тега
  • fields - массив атрибутов, которые являются либо строками, либо объектами.
  • dtitle - название диалогового окна. Если не указано, используется название "(tag) Tag Dialog".
  • stitle - надпись для кнопки "Отправить" (submit button). Если не указано, используется стандартная надпись, зависящая от браузера.
  • func - имя функции, которая будет вызвана после отправки, вместо функции по умолчанию. (для "продвинутого" использования)

Вот пример простейшего использования:

eDefTagDialog('div', ['id', 'class', 'style']);

Этот код создаст диалог "DIV Tag Dialog" ("Диалоговое окно для тега DIV"), запрашивающего атрибуты "id", "class", "style". Этот код также позволит обнаружить, если был выделен корректный тег DIV, и если да, значения атрибутов появятся в соответствующих полях. После отправки данных, код обрамит/заменит выбранный текст в текстовом поле.

Вы могли заметить, что поля в диалоговых окнах вставки ссылки/изображения определены как объекты, а не как строки. Это специальная форма определения атрибутов. Определение полей как объектов идеально подходит, если вы хотите:

  • поле другого типа, не только текстового (textfield): (type: 'select', options: {'left': 'Left', 'right': 'Right'}) - поддерживается только тип "select".
  • другое название (title: 'Image URL')
  • определить значение поля по умолчанию (value: ' ')
  • определить текст или HTML-код для префикса или суффикса (prefix: '[ ', suffix: ' ]')
  • объединить два поля в одной строке, как это сделано для полей "width" и "height" изображения (getnext: true)
  • устанавливать произвольные атрибуты для поля (attributes: {size: 10, style: 'width: 200px'})

Поле должен иметь свойство "name", которое определяет название атрибута. {name: 'href'}

Теперь, давайте добавим поле для атрибута "align" в диалоговое окно вставки изображения (заметьте, что это не совместимо с XHTML):

Объект поля, который нужно передать к eDefTagDialog, выглядит так:

{
  name: 'align',//required //обязательно
  title: 'Image align', // if we dont set it, it will be set as 'Align' automatically. // если мы не определим это, название будет автоматически установлено в 'Align'.
  type: 'select', // we use a selectbox instead of a plain textfield. // мы используем selectbox вместо простого textfield.
  options: {'': '', left: 'Left', right: 'Right', center: 'Center'} // set options in the form-> {attribute-value: 'Visible value'} //установим варианты -> {attribute-value: 'Visible value'}
}

Теперь добавим его в форму, в свойстве "СОДЕРЖАНИЕ" ("CONTENT") кнопки вставки изображения:

var form = [
{name: 'src', title: 'Image URL'},
{name: 'width', title: 'Width x Height', suffix: ' x ', getnext: true, attributes: {size: 3}},
{name: 'height', attributes: {size: 3}},
{name: 'alt', title: 'Alternative text'},
{name: 'align', title: 'Image align', type: 'select', options: {'': '', left: 'Left', right: 'Right', center: 'Center'}}
];
eDefTagDialog('img', form, 'Insert/edit image', 'OK');

Вот и все. Теперь у нас есть диалоговое окно вставки изображения, которое позволяет получить/установить атрибут "align" тега img.

Помимо теговых диалогов, как создать кнопку, которая берёт вводимые пользователем данные, и добавляет их в текстовое поле?

Свойство "СОДЕРЖАНИЕ" ("CONTENT") кнопки должно быть примерно таким:

js:

// function that inserts the user input from the form into the textarea. this might be defined outside as well.
myUserInput = function(form) {
  E.replaceSelection('User input is: '+ form.elements["user_input"].value);
  editor.dialog.close();//close the dialog when done.
}

//form html. we define an input field named as "user_input".
var html = 'Input : '+ eDefInputText('user_input');
html += eDefInputSubmit('sbmt', 'Submit');
html = eDefHTML('form', html, {onsubmit: 'myUserInput(this); return false;'});//run getUserInput on submission

//open editor dialog with a title and the user form.
editor.dialog.open('User Input', html);

Приведённый выше пример использует форму, которая в большей степени подходит для сложных данных, вводимых пользователем. Если вы хотите получить только единичный ввод, вы можете использовать javascript-код prompt(). Вот пример, который получает URL изображения от пользователя:

js:
var url = prompt('URL', '');//prompt for URL
var code = '<img src="'+ url +'" />';//put the url into the code.
E.replaceSelection(code);//replace the selection with the code.

Как создать кнопку, чтобы получить XHTML-совместимый код для подчеркнутого текста?

Так как тег <u> не совместим с XHTML, вы должны использовать CSS. Прежде всего, вам нужно определить класс в CSS-файле вашей темы, например;

.underlined-text {text-decoration: underline;}

Если ваш класс существует (как показано в примере выше), вы можете использовать его в свойстве "СОДЕРЖАНИЕ" ("CONTENT") вашей кнопки:

<span class="underlined-text">%TEXT%</span>

Где %TEXT% будет заменён на выделенный в текстовом поле текст.

Источник: Tips & Tricks

BUEditor: Известные проблемы

Быстрые клавиши в Internet Explorer:
Нажатие на "быструю клавишу" (Alt+KEY), когда есть выделенный фрагмент, снимает выделение с сохранением позиции курсора.

Быстрые клавиши в Firefox:
Если имеется несколько экземпляров редактора на странице, быстрые клавиши (Shift+Alt+KEY) будут работать только для первого экземпляра редактора. Это объясняется тем, что FF не допускает динамической корректировки быстрых клавиш.

Символ новой строки:
Так как символ новой строки представляется различными символами (\r, \r\n, \n) на различных платформах, может наблюдаться неожиданное поведение редактора в некоторые комбинациях платформы и браузера применительно к определению положения курсора после вставки/замены текста. Определите символ новой строки как "\n", если вам придётся использовать любые другие в ваших скриптах.

BUEditor: Использование BUEditor в не-друпаловских проектах

Хотя BUEditor является Drupal-проектом, он также доступен для использования на не-drupal-сайтах или в Drupal без включения его как модуля.

Для запуска BUEditor на странице, вы должны:

  1. Подключить файл bueditor.css как набор стилей
  2. Подключить bueditor.js и (необязательно) js-файлы в папке библиотек для использования функций, определённых в них.
  3. Определить editor.path (путь до папки редактора, относительно страницы)
  4. Определить editor.buttons (массив, содержащий кнопки редактора.)
  5. Присвоить имя класса "editor-textarea" каждому текстовому полю, которое должно быть обработано. Вы также можете использовать метод editor.processTextarea(T) в любой момент, где Т - объект "текстовое поле".

editor.buttons является массивом массивов, имеющих следующую структуру:

editor.buttons = [ [button-1], [button-2], ..., [button-N] ];

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

editor.buttons = [ [title-1, content-1, icon-1, key-1], ..., [title-N, content-N, icon-N, key-N] ];

Пример заголовка страницы для запуска BUEditor:

<style type="text/css" media="all">@import "bueditor/bueditor.css";</style>
<script type="text/javascript" src="bueditor/bueditor.js"></script>
<script type="text/javascript" src="bueditor/library/default_buttons_functions.js"></script>
<script type="text/javascript">
editor.path = 'bueditor/';//required for displaying the icons in icons folder.
editor.buttons = [
  ['Bold', '<strong>%TEXT%</strong>', 'bold.png', 'B'], //Bold
  ['Italic', '<em>%TEXT%</em>', 'italic.png', 'I'], //Italic
  ['Preview', 'js: eDefPreview();', 'Preview', 'P'