Наследование модулей


Мне интересно, существует ли какая-то система наследования для модулей Drupal 7.
Я хочу создать модуль, в котором пользователи могут загружать PDF-файл (прикрепленный к узлу), который будет загружен в Calameo (онлайн-просмотрщик PDF) через веб-службы REST.

Как бы я это сделал? hook_file() кажется недостаточным, и я чувствовал бы себя глупо, просто копируя весь файловый модуль и внося свои коррективы, так как я не хочу справляться с загрузкой файла, просто обработка и отображение его.

 5
7
Author: kiamlaluno, 2011-07-21

2 answers

Система крючков - это способ "ООП" в Drupal. Drupal был создан, когда PHP был единственной версией PHP; это означает, что PHP не реализовывал концепции, присутствующие в других языках ООП, таких как защищенные и частные методы, интерфейсы и т.д.

В результате Drupal изначально не реализовал столько классов, сколько вы найдете в последнем выпуске Drupal, и классы, которые не использовались для наиболее важных частей API, реализованных Drupal, таких как API контента, форма API и API меню. Drupal использует множество простых функций, но способ их использования позволяет реализовать нечто похожее на концепции ООП. Разница в том, что в Drupal нет необходимости создавать класс, расширяющий другой класс. Каждый модуль, реализующий правый хук, может расширять код, реализованный другим модулем.

Например, если вам нужно расширить форму, предоставляемую другим модулем, вы реализуете hook_form_alter() или hook_form_FORM_ID_alter(), и вы можете добавлять поля формы из формы, созданной другим модулем, не зная, какой "класс" этого модуля. (Иначе говоря, в парадигме ООП вам нужно знать, какой класс вы хотите расширить.)

В конкретном случае, если вам нужно предоставить способ разрешить пользователям загружать файл во время редактирования узла, который затем загружается на сайт службы, вы можете:

  • Измените форму редактирования узла, чтобы добавить поле формы managed_file с использованием кода, аналогичного следующему:
$form['mymodule_pdf_file'] = array(
  '#title' => t('Image'),
  '#type' => 'managed_file',
  '#description' => t('The uploaded PDF will be loaded on the Calameo web server.'),
  '#default_value' => variable_get('mymodule_pdf_file', ''),
  '#upload_location' => 'public://mymodule_pdf_files/',
);
  • Добавьте обработчик отправки формы, который загружает файл с помощью $file = file_load($form_state['values']['mymodule_pdf_file']), загрузите его на сервер Calameo.

  • Файлы, загруженные с полем формы "managed_file", по умолчанию являются временными; это означает, что они удаляются, когда им исполняется 6 часов, при первом выполнении задач cron. Если вы хотите сделать их постоянными, то вам следует использовать код, подобный следующему один:

$file = file_load($form_state['values']['my_file_field']);
$file->status = FILE_STATUS_PERMANENT;
file_save($file);
 4
Author: kiamlaluno, 2011-07-21 16:20:17

Drupal использует систему крючков, см. документы о ООП в Drupal.

Короче говоря.

Вы можете подключиться к файловой системе и выполнить необходимую обработку; где и как подключиться, зависит от того, как вы планируете использовать файловую систему, например, поле файла или что-то еще. Если вы хотите создать саму форму загрузки, сохранить загруженные файлы довольно просто с помощью file_save_upload() и file_move().

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

Возможно, вы захотите взглянуть на поле Scribd , которое может делать то, что вы хотите (только Drupal 6 atm, но концепция все еще стоит того, чтобы ее изучить).

 2
Author: googletorp, 2011-07-21 14:55:14