Здесь сгруппированы материалы по CMS Drupal, как правило переведённые самостоятельно с , и которые я не нашёл на .
Я не профессиональный переводчик, поэтому возможны некоторые неточности. Если вы хотите принять участие в переводе документации по Друпалу, милости просим, я открою Вам доступ на правку статей на этом сайте. Также, предложить более лучший перевод Вы можете в комментариях.
Здоровая критика и обсуждения, а также энтузиазм участников приветствуются и всячески поощряются! :)
Здесь находится информация о модулях Друпал. Как правило, это переведённая с английского официальная документация к тому или иному модулю, а также это может быть мой личный опыт, какие-то написанные патчи, хаки к модулям и тому подобное.
Информация в этом разделе постоянно обновляется.
Как говорят сами разработчики: "Когда мы разрабатывали Друпал, стало ясно, что мы хотим иметь систему настолько модульную, насколько это вообще возможно. Модульное построение позволит обеспечить гибкость, адаптивность и непрерывность, что в свою очередь, позволит людям дорабатывать свои сайты под свои нужды и предпочтения."
Модуль Друпала просто представляет собой файл, содержащий набор процедур, написанных на PHP. Когда он используется, код модуля выполняется непосредственно в контексте сайта. Таким образом он может использовать все функции и все переменные и структуры данных основного ядра. Фактически, модуль сколько-нибудь не отличается от обычного PHP-файла: это больше идея, которая автоматически ведёт к хорошим архитектурным принципам и хорошей модели разработки. Модульность лучше всего сочетается с моделью разработки систем с открытыми исходными кодами, потому что иначе будет трудно представить как люди, работающие параллельно, не будут влиять друг на друга.
Идея заключается в том, чтобы иметь возможность запускать произвольный код в заданных местах движка. Этот произвольный код должен иметь возможность сделать то, что нужно для расширения функциональности. Места, где код должен быть выполнен, называются "хуками" (англ. "hook") и они жёстко определены и зафиксированы.
В тех местах, где доступны хуки, движок вызывает код каждого модуля, которые используют данный хук. Это сделано путём просмотра всей директории, где находятся модули. Скажем, ваш модуль называется foo (т.е. расположен в modules/foo.module) и если в нём есть хук под названием bar, движок вызовет функцию foo_bar(), если она присутствует в вашем модуле.
Таким образом, хуки позволяют модулю взаимодействовать с ядром Друпала. Система модулей Друпала основана на концепции хуков. Хук - это php-функция с названием (например) foo_bar(). Здесь foo - имя модуля (значит, полное имя модуля - foo.module), а bar - имя хука. Каждый хук имеет определённый набор параметров и определённый тип возвращаемой переменной. Для расширения возможностей Друпала модуль всего лишь должен предоставлять хуки. Когда Друпалу требуется функциональность модуля, движок определяет, какие модули предоставляют хуки, соответствующие данной ситуации. Найденные хуки вызываются во всех модулях, которые соответствующие хуки предоставили.
(оригинал в англ. версии находится .)
Этот урок рассказывает, как создать модуль для Друпал версии 5. Это дополнение к . Вы можете уточнять различные детали там. Большинство в этом уроке верно и для Друпал версии 4.7, но всё же вы должны проверить , также как и документацию "".
Модуль - это набор функций, которые присоединяются к Друпалу, предоставляя дополнительную фунциональность к вашей базовой установке Друпала. После прочтения данного урока, вы сможете создать основной блоковый модуль и использовать его как шаблон для более продвинутых модулей и модулей для нод.
Этот урок не предназначен для того, чтобы подготовить вас писать модули, предназначенные для релиза. Этот урок не освещает ни кеширование, ни рассматривает подробно управление доступом или проблемы безопасности. Используйте этот урок в качестве начала, и смотрите другие модули, Настольную книгу Друпала и Стандарты Кода для более детальной информации.
Этот урок требует от вас:
Этот урок не требует от вас какого-либо представления о внутренней работе модуля Друпала. Этот урок не научит вас писать модули для более ранних версий, чем Друпал 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, содержащем мета информацию о модуле (детали смотрите в документе ). В нашем примере, этот файл должен называться "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' ("Другое"). Неприсваивание строки для группировки абсолютно нормально, в общем случае, пакетная группировка хороша для модулей, которые поставляются вместе, или подразумевается, что они будут использоваться совместно. Если у вас есть какие-либо сомнения по поводу этого, оставьте это поле пустым.
Предложенные примеры некоторых разделов для группировки:
Эти файлы (.info) пишутся в ini-формате, и могут содержать строку ; $Id$ для того, чтобы позволить CVS вставить информацию о файле.
Для получения дополнительной информации о формате файлов ini, смотрите документ .
Мы также можем предоставить помощь и другую дополнительную информацию о нашем модуле. Вследствие использования файла .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:
Добавьте показанный выше исходный код в файл с именем onthisdate.module прежде чем сохраните и установите его.
Этот модуль позволяет пользователям с надлежащими правами загрузку изображений в Drupal. Миниатюры и картинки дополнительных размеров создаются автоматически.
Изображения могут быть размещены отдельно на главную страницу, могут быть включены в статьи или сгруппированы в галереи.
Модуль Image (начиная с 5.x версии) поставляется с несколькими дополнительными модулями:
Модуль Image используется для создания и управления изображениями на вашем сайте. Каждое изображение хранится в виде ноды, вместе с автоматически сгенерированными ограниченными производными изображениями от первоначального изображения.
Есть два используемых по умолчанию производных размеров, "Thumbnail (эскиз, миниатюра)" и "Preview (предварительный просмотр)". Миниатюра показывается в тизере для нод типа Image и при просмотре галерей изображений. Изображение размером предварительного просмотра показывается при первом отображении ноды типа Image. Размеры могут быть изменены, а также могут быть определены множество других производных размеров.
Нижеследующие модули в связке с модулем Image позволяют делать больше вещей с вашими изображениями:
Вы можете:
Для использования модуля "Image attach" нужно:
администратор/параметры/image_attach (admin/settings/image_attach, это путь по умолчанию).администратор/содержание/типы (admin/content/types) для управления типами контента, потом для каждого типа контента, к которому вы хотите прикреплять изображения, нажмите "Изменить" ("Edit") (или нажмите название типа контента) и включите опцию "Приложить изображения".Модуль позволяет пользователю как прикреплять существующие изображения (ноды типа Image) к странице/статье, так загрузить новое на лету без предварительного создания ноды типа Image (создание соответствующей ноды типа Image осуществляется автоматически).
Изображение отображается в виде миниатюры, ссылающейся на ноду типа Image, этого изображения, в верхнем правом углу ноды по умолчанию. В небольшой степени это может контролироваться на путем изменения "Прикреплённое изображение ... вес" ("Attached image ... weight") на странице управления данным типом контента в администраторской зоне сайта (см. выше), и в гораздо более крупной степени путём использования тем (themeing) и пользовательскими CSS.
Только одна нода типа Image можно подключить таким образом к другой ноде.
Модули img_assist и IMCE предлагают более изощрённые возможности вставки изображений, но для простых случаев этого может быть достаточно. Это немного лучше, чем стандартные возможности для прикрепления файлов, по меньшей мере, хотя последняя допускает несколько присоединённых файлов.
Основной вопрос заключается в том, как показывать картинки. Помимо других модулей, таких, как 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>Источник:
В случае большого изображения, спрос на память со стороны PHP резко возрастает, и загрузка такого изображения приводит к ошибке нехватки памяти. В качестве обходного манёвра, вы можете увеличить размер памяти, или же вам придётся уменьшить размеры изображения, и загружать меньшее изображение. Например, попробуйте 1024x768 пикселей вместо 2448x1836 пикселей.
Модуль 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 должны принять это во внимание и обновиться до данного релиза как можно быстрее.
Извещение безопасности:
-------------------------------
Убедитесь, что вы посетили update.php после обновления до новой версии.
Совместимость с модулем Views:
Вкратце:
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:
Эти модули имеют отношение к CCK:
Список модулей для CCK продолжает расти. смотрите в разделе загрузок.
Источник:
CCK позволяет вам добавлять различные поля к разным типам контента, используя веб-интерфейс. В Друпал 4.7 CCK создаёт как произвольный тип контента, так и произвольные поля к ним. В Друпал 5.х, произвольные типы контента могут быть созданы прямо в Друпале, и CCK позволяет вам добавлять произвольные поля к любым типам контента.
Описания шагов и путей того, как можно сделать то-то и то-то, различаются для версий 4.7 и 5.х. Имейте в виду, что инструкции наподобие "administer >> settings" не являются готовыми ссылками, по которым вам нужно перейти, а ссылаются на конкретные шаги в системе навигации, включающие в себя переходы на фиксированные страницы, т.е. "Выберите "Управление сайтом" в меню навигации, затем выберите "Настройки".
Drupal 4.7
Вы можете:
Drupal 5.x
Вы можете:
Источник:
В Друпал 5.х у вас есть возможность создавать столько различных типов контента, сколько вам нужно. CCK достраивает эту возможность, позволяя вам добавлять произвольные поля для различных типов контента. Если вы используете модуль Views, имейте в виду, что CCK также делает все ваши поля доступными для любого вида (View).
Установка модуля CCK не отличается от установки других модулей, скачайте и распакуйте архив со страницы проекта и добавьте его в папку 'sites/all/modules' вашего сайта, затем посетите страницу admin/build/modules, чтобы активировать его.
Сейчас CCK представляет собой группу модулей. Первичный модуль называется 'Content' и он необходим для работы любого другого CCK-модуля. Архив включает в себя некоторое количество модулей, которые составляют ядро модуля CCK ('Core CCK'). Это следующие модули:
Сейчас есть много других модулей, созданных для использования вместе с CCK. Вы можете видеть их на странице . Когда вы хорошо познакомитесь с CCK, вы можете скачать, установить и использовать любой из этих модулей. Однако лучший способ изучить CCK - это начать его использование только с его базовых модулей (Core CCK modules). Базовые модули имеют хорошую поддержку, и это проще - начать с малого количества альтернатив, поэтому начинайте с включения только базовых модулей CCK.
Зайдите на страницу Администрирование > Управление содержанием > Типы содержания (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 называет это "виджеты"). Они контролируют возможные пути того, какая форма ввода будет отображаться для этого поля. Доступные опции разнятся для каждого поля, но включают такие вещи, как, например текстовое поле, которое является простым пустым полем, где пользователь может ввести текст, автоматически заполняемое текстовое поле, где пользователь может ввести текст, и система будет пытаться дополнить текст из информации, имеющейся в базе данных, списки выбора, флажки, и радиокнопки.
Экран будет выглядеть наподобие этого (в скобках указан возможный русский перевод):
Начните с чего-то простого, например поля "Текст" с виджетом простого текстового поля, выбрав Текст >> Текстовое поле (Text >> Text Field).
Источник:
Далее вы перейдёте на экран, где сможете определить больше параметров, чтобы задать как это поле должно работать. Он будет выглядеть примерно так:
Простой текстовый редактор, предназначенный для облегчения написания кода (вероятно автором BUEditor'а имеется в виду HTML-код).
Редактор поставляется в конфигурации "default editor" ("редактор по умолчанию"), в которой есть предопределённый заранее набор кнопок. По умолчанию кнопки такие:
<strong> (в HTML этот тег формирует жирный текст).<em> (в HTML этот тег формирует курсив).Источник: BUEditor
Выполните следующие действия, после того, как загрузите модуль на .
администратор/параметры/bueditor (admin/settings/bueditor).Источник:
Вы должны сначала выбрать кнопки, которые вы хотите экспортировать или удалить, проставив флажки рядом с ними. Затем выберите действие, которое хотите осуществить с ними, выбрав его в выпадающем списке ниже всего списка кнопок и нажмите "GO" ("Вперёд").
Вы можете добавить кнопки для редактора двумя способами:
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-разметки в текстовое поле. Можно использовать выделенный в текстовом поле текст, обозначая его как %TEXT% . Например, если свойство "CONTENT" ("СОДЕРЖАНИЕ") кнопки такое - "<p>%TEXT%</p>", и она нажата после выделения текстового фрагмента "Привет мир!", результат будет таким: "<p>Привет мир!</p>", с сохранением выделения текстового фрагмента. Множественные вхождения %TEXT% возможны, каждое такое вхождение будет заменено на выделенный фрагмент текста. Этот тип кнопок полезен для простых HTML-тегов или других простых тегов, например, таких, как BBCode.
Примечание: если вы хотите вставить текст, содержащий как фразу %TEXT%, используйте javascript-кнопки.
Содержание javascript-кнопки должно начинаться тремя символами "js:", чтобы её можно было отличить от html-кнопки. Дальнейший код рассматривается как javascript-код и выполняется в функции, когда кнопка нажата. При написании javascript-кнопки можно использовать переменную E для доступа к текущему экземпляру редактора. Кнопки этого вида используются в особых случаях, когда недостаточно просто заменить выделенный текст. Редактор имеет множество готовых к использованию методов и переменных, что облегчает создание javascript-кнопок. Смотри раздел "API РЕДАКТОРА".
Содержание 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" будет содержать в себе возвращённое этим кодом значение. Для других кнопка будет выключена и не будет показана.
Источник:
Иконки хранятся в папке редактора "icons". Вы можете скопировать дополнительные иконки в эту папку, чтобы сделать их видимыми в списке иконок на странице настроек редактора.
Во время создания javascript-кнопки вы, возможно, захотите использовать функции или переменные из внешней javascript-библиотеки, в целях сокращения кода и улучшения его читабельности. В этом случае, вы должны разместить свою javascript-библиотеку внутри папки "library" редактора. Все файлы с расширением .js в этом каталоге будут загружаться автоматически вместе с редактором. Имейте в виду, что файлы library/...js являются общими и загружаются для каждого созданного вами редактора.
В случае, если вы хотите чтобы файл библиотеки был загружен только для конкретного редактора, вы должны создать каталог, который имеет то же имя, что и нужный вам редактор, в папке "library". Например, файлы library/editorFoo/...js загружаются только для редактора с именем "editorFoo".
После начала использования редактора, вы можете заметить, что дополнительная папка под названием "bueditor" создаётся в каталоге файловой системы Друпала. Этот каталог используется для хранения javascript-файлов, которые содержат кнопки ваших редакторов. Включение их в отдельный файл, вместо того чтобы размещать javascript-код непосредственно в сгенерированной HTML-странице, позволяет задействовать кэширование браузера и тем самым уменьшает время загрузки страницы.
Так как кнопки могут иметь php-код, что делает их динамично изменяемыми, используется вычисление хэша md5, чтобы отследить изменения в скрипте кнопок. Если в папке для временных файлов есть совпадающий файл, то он будет загружен. В противном случае, создаётся и загружается новый файл. Если загрузка файла не удаётся, кнопки включаются как встроенный в страницу скрипт.
Примечание: файлы старше 15 дней очищаются при каждом запуске крона (cron, регулярно, по расписанию, выполняемый скрипт).
Если вы включили приватный режим загрузки файлов с сервера (метод PRIVATE), кнопки всегда включаются как встроенный в страницу скрипт.
Источник:
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-кнопки.
Источник:
Каждый редактор, работающий на странице в том или ином текстовом поле, называется ЭКЗЕМПЛЯРОМ (редактора). Экземпляр редактора имеет свои собственные переменные и методы, которые позволяют легко редактировать содержание текстового поля. Доступ к активному экземпляру редактора на странице может осуществляться при помощи переменной "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);Источник:
Окно диалога - объект, который разделяют все экземпляры редактора. Он может использоваться для отображения любых данных, то есть HTML-формы, чтобы получить данные, вводимые пользователем.
Вот методы диалога редактора:
editor.dialog.open(title, content):
Открывает диалог с заданным названием в "title" и с заданным содержанием "content" в нем.
editor.dialog.close():
Закрывает диалог.
Источник:
Как расширить диалоговые окна вставки изображения или ссылки, чтобы получить значения для других атрибутов тегов "img" и "а" от пользователя?
Как создать диалоговое окно для произвольного тега, наподобие диалоговых окон для вставки изображения или ссылки?
Существует функция eDefTagDialog(tag, fields, dtitle, stitle, func) в стандартной библиотеке кнопок для создания диалогового окна для любого тега.
Вот пример простейшего использования:
eDefTagDialog('div', ['id', 'class', 'style']);Этот код создаст диалог "DIV Tag Dialog" ("Диалоговое окно для тега DIV"), запрашивающего атрибуты "id", "class", "style". Этот код также позволит обнаружить, если был выделен корректный тег DIV, и если да, значения атрибутов появятся в соответствующих полях. После отправки данных, код обрамит/заменит выбранный текст в текстовом поле.
Вы могли заметить, что поля в диалоговых окнах вставки ссылки/изображения определены как объекты, а не как строки. Это специальная форма определения атрибутов. Определение полей как объектов идеально подходит, если вы хотите:
Поле должен иметь свойство "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% будет заменён на выделенный в текстовом поле текст.
Источник:
Быстрые клавиши в Internet Explorer:
Нажатие на "быструю клавишу" (Alt+KEY), когда есть выделенный фрагмент, снимает выделение с сохранением позиции курсора.
Быстрые клавиши в Firefox:
Если имеется несколько экземпляров редактора на странице, быстрые клавиши (Shift+Alt+KEY) будут работать только для первого экземпляра редактора. Это объясняется тем, что FF не допускает динамической корректировки быстрых клавиш.
Символ новой строки:
Так как символ новой строки представляется различными символами (\r, \r\n, \n) на различных платформах, может наблюдаться неожиданное поведение редактора в некоторые комбинациях платформы и браузера применительно к определению положения курсора после вставки/замены текста. Определите символ новой строки как "\n", если вам придётся использовать любые другие в ваших скриптах.
Хотя BUEditor является Drupal-проектом, он также доступен для использования на не-drupal-сайтах или в Drupal без включения его как модуля.
Для запуска BUEditor на странице, вы должны:
bueditor.css как набор стилейbueditor.js и (необязательно) js-файлы в папке библиотек для использования функций, определённых в них.editor.path (путь до папки редактора, относительно страницы)editor.buttons (массив, содержащий кнопки редактора.)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'