Drupal: своя CCK-нода в модуле
4 марта 2010
UPD: Владимир Гарвардт указал на модуль Features, генерирующий подобный каркасный модуль автоматически.
CCK довольно удобен в работе, но не очень удобен в развёртывании: хоть и есть импорт-экспорт, но хочется всё-таки поставить один раз модуль и получить при его установке необходимые настройки. Конечно, можно отказаться от CCK и использовать node api, но во-первых потеряется довольно большое количество приятных возможностей (та же интеграция с Views), а во-вторых — использовать такой модуль параллельно с CCK будет проблематично. CCK захватывает стандартные hook_load(), hook_view() и другие.
К счастью, создать новый тип CCK программно при установке модуля не так сложно.
В моём случае модуль назывался review, так что показывать буду на его примере.
Добавляем свой тип CCK используя админку CCK. Administer → Content management → Content types → Add content type.
Экспортируем только что созданный тип данных: Administer → Content management → Content types → Export. Следует запомнить типы полей, которые вы использовали (особенно те, что не являются стандартными для CCK). Они понадобятся нам далее. Полученный код вставляем в review.def.inc.php (создаём в директории модуля):
function _review_cck_export() { // сюда вставляем наш код return $content; }
- Пишем инсталлер review.install:
/** * Implementation of hook_install(); */ function review_install() { // если нужно заменять существующий тип CCK // при установке: // node_type_delete('review'); _review_add_cck_node(); } /** * Implementation of hook_uninstall(); */ function review_uninstall() { // уладяем тип данных node_type_delete('review'); // перестраиваем меню menu_rebuild(); } function _review_add_cck_node() { // подключаем экспортированный код CCK module_load_include('inc.php', 'review', 'review.def'); $content = _review_cck_export(); // Используем модуль content_copy даже если он отключен require_once './' . drupal_get_path('module', 'content') . '/modules/content_copy/content_copy.module'; // создаём новый тип $form_state['values']['type_name'] = '<create>'; $form_state['values']['macro'] = '$content = '.var_export($content, TRUE).';'; // форма content_copy_import_form — часть модуля content_copy drupal_execute('content_copy_import_form', $form_state); // чистим кэш content_clear_type_cache(); } /** * Implementation of hook_requirements(). * Проверям зависимости от других модулей. * Если таковые не установлены — выкидываем ошибки. */ function review_requirements($phase) { $requirements = array(); $t = get_t(); // В моём случае необходимы несколько модулей для разных // типов полей $dependencies = array( 'content' => 'Content', 'text' => 'Text', 'nodereference' => 'Node Reference', 'number' => 'Number', 'link' => 'Link' ); switch ($phase) { case 'install': $error = FALSE; $value = ''; foreach ($dependencies as $dependency => $module_nice_name) { if (!module_exists($dependency)) { $error = TRUE; $value .= $t($module_nice_name . " to be pre-installed; "); $severity = REQUIREMENT_ERROR; } } if ($error) { $requirements['review'] = array( 'title' => $t('Review requires: '), 'value' => $value . $t(' if the required modules are now installed, please enable this module again.'), 'severity' => $severity, ); } break; } return $requirements; }
- Прописываем зависимости в review.info:
; $Id$ name = CCK review description = Provides review CCK content type version = "1.0" dependencies[] = content dependencies[] = text dependencies[] = nodereference dependencies[] = number dependencies[] = link core = 6.x
- Инсталлятор готов. Создаём review.module, проверяем инсталлятор и описываем
остальной функционал как обычно.
Чтобы поменять поля нашего CCK-типа данных, используем админку, генерируем заново код и вставляем его в review.def.inc.php, заменяя старую версию. Добавляем в review.install функцию для автоматического обновления:
function review_update_1() { // node_type_delete('review'); _review_add_cck_node(); return array(); }
Использованы идеи и части кода из:
Комментарии RSS по email OK
Давненько читаю ваш блок, назрел такой вопрос. Вы разрабатываете интернет приложения и на drupal и на различных php фреймворках (Yii, CodeIgniter возможно еще что то). Так вот в каких ситуациях лучше применять drupal, а в каких какой либо из этих фреймворков???
От себя - на сколько мне известно, друпал хорошо грузит хостинг, но зато думается мне можно быстрее поднять проект. По поводу посещаемости проекта в будущем даже и предположить не могу...
П.С. Планирую запустить проект с соц. уклоном, но знания чисто поверхностные в выше озвученных вещях, не социальные проекты разрабатываю на другой cms, она классная, но не заточена все таки под социальность, да и к тому же надо еще что то пробовать и изучать...
За ранее благодарю за ответ...
mmm, попробуйте присмотреться к CMS Cogear. Она с социальным уклоном и написана на фреймворке CodeIgniter.
alyoung, CMS Cogear интересный проект, но cms достаточно новая и непонятно на долго ли автору данной системы хватит энтузиазма развивать её..
Из социальных довольно хороша LiveStreet. Про выбор между фреймворком и CMS рассказать сложно. В вашем случае, наверное, лучше будет с CMS.
mmm
Автор у cogear терпеливый, усидчивый и целеустремленный, поэтому все будет хорошо :-)
Странно update не работает выдает ошибку The content type our_content already exists in this database. Exiting. No import performed.