Разделение логики модуля Drupal и пользовательского интерфейса - PullRequest
3 голосов
/ 12 октября 2010

Я написал модуль D6, который предоставляет пользователю возможность общаться, настраивать параметры и тестировать службу API 3-го участника.
Модуль работает как задумано, но я хочу отделить класс коммуникатора и связать его как модуль foo. Затем упакуйте остальное (страница администратора) как модуль foo-ui. Так же, как взгляды и views-ui.
Я понятия не имею о том, что такое лучшие практики / шаблоны проектирования для этого. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Как я знаю, конкретного шаблона нет, но всегда есть вопрос:

- Почему я должен разделить логику и интерфейс моего модуля на несколько модулей?Это действительно необходимо?

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

Хорошо, если предположить, что нашему модулю нужна вещь _ui.Здесь в качестве примера я пытаюсь разделить основные функциональные возможности модуля и его интерфейс настройки.Взгляните на Модуль API развертывания , это довольно крошечный и простой модуль, который подходит для нашего случая.Вот $ tree ./unfuddle_api:

unfuddle_api/
|-- LICENSE.txt
|-- README.txt
|-- unfuddle_api.classes.inc
|-- unfuddle_api.info
|-- unfuddle_api.install
|-- unfuddle_api.module

0 directories, 6 files

Прочитайте его код!unfuddle_api.install не устанавливает схему, но реализует hook_uninstall() для удаления нескольких переменных, используя variable_del() при удалении модуля.Эти переменные на самом деле являются параметрами соединения API, которые будут установлены на странице администратора модуля, некоторые из них могут быть и в вашем модуле.
IMO это часть, которую нужно перенести на unfuddle_api_uimodule.

Файл unfuddle_api.classes.inc является классом-оболочкой API для развертывания , это каким-то образом сторонний код, заключенный в класс, который будет использоваться для создания экземпляра объекта.
ИМО это должно остаться в основном модуле.Но ради дизайна мы должны изменить метод конструктора, удалив вызовы variable_get() и установив переданные параметры прямо в свойства класса.Мы добавим их позже в файл .module.

Файл unfuddle_api.module содержит основной код модуля. Реализация hook_perm() плюс один для hook_menu() для создания страницы администратора ивспомогательная функция с именем unfuddle_api_create(), которая каким-то образом является вспомогательной Factory для создания объекта из Unfuddle класса, закодированного в unfuddle_api.classes.inc.
IMO, обе реализации ловушек должны быть перенесены на *Модуль 1051 *.Также удаленная variable_get() часть unfuddle_api.classes.inc, описанная выше, должна быть добавлена ​​здесь в unfuddle_api_create() функцию .

Итак, в общих чертах: у нас есть модуль unfuddle_api, который действует как оболочка для класса API Unfuddle.Он предоставляет нам все функциональные возможности, но не настраивает пользовательский интерфейс.Все конфиги должны быть установлены через модуль unfuddle_api_create() в коде.
Также у нас есть модуль unfuddle_api_ui, который зависит от модуля unfuddle_api и, если он будет включен, предоставит нам конфигурацию основного модуля в пользовательском интерфейсе.

Надеюсь, это поможет.

2 голосов
/ 13 октября 2010

Также полезно для модулей, которые не используют пользовательский интерфейс.Отключение пользовательского интерфейса экономит некоторые ресурсы.Я предлагаю вам проверить модуль imagecache в качестве примера.http://drupal.org/project/imagecache

1 голос
/ 12 октября 2010

Нет простого ответа. Вам необходимо принудительно отделить функциональность от пользовательского интерфейса самостоятельно . Поэтому вам нужно поместить все API вашей программы в один модуль, а пользовательский интерфейс - в другой. Напишите тестовые примеры для вашего API - используя модуль simpletest . Записывая контрольные примеры, вы становитесь «потребителем» своих API. Фактически, вы можете отложить реализацию вашего пользовательского интерфейса на достаточно долгое время, чтобы быть уверенным, что в модуле есть правильный набор функций / классов, отвечающих за функциональность «ядра».

Также вам следует изучить модуль CTools . Он дает некоторые полезные инструменты, такие как возможность создания экспортных файлов и т. Д.

У Drupal нет большого количества литературы в виде книг, как, например, Java или C #. Но PHP делает. Проверьте книги по шаблонам проектирования в PHP. Хотя я не читал об этом, «PHP в действии» Мэннинга, похоже, содержит много информации именно о том, что вы просите.

Другой способ сделать такие вещи - посмотреть, как это сделали другие. Модуль imagecache достаточно мал, и он отделяет пользовательский интерфейс от функциональности (есть отдельный модуль пользовательского интерфейса Imagecache, который необходимо включить). Почему бы на самом деле не изучить исходный код imagecache? [Views - это 1 МБ + исходного кода, поэтому, вероятно, пока что не очень хорошая идея исследовать это: -)]

...