<rmcreative>

RSS

Drupal: своя CCK-нода в модуле

4 марта 2010

UPD: Владимир Гарвардт указал на модуль Features, генерирующий подобный каркасный модуль автоматически.

CCK довольно удобен в работе, но не очень удобен в развёртывании: хоть и есть импорт-экспорт, но хочется всё-таки поставить один раз модуль и получить при его установке необходимые настройки. Конечно, можно отказаться от CCK и использовать node api, но во-первых потеряется довольно большое количество приятных возможностей (та же интеграция с Views), а во-вторых — использовать такой модуль параллельно с CCK будет проблематично. CCK захватывает стандартные hook_load(), hook_view() и другие.

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

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

  1. Добавляем свой тип CCK используя админку CCK. Administer → Content management → Content types → Add content type.

  2. Экспортируем только что созданный тип данных: Administer → Content management → Content types → Export. Следует запомнить типы полей, которые вы использовали (особенно те, что не являются стандартными для CCK). Они понадобятся нам далее. Полученный код вставляем в review.def.inc.php (создаём в директории модуля):

function _review_cck_export() {
  // сюда вставляем наш код
  return $content;
}
  1. Пишем инсталлер 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;
}
  1. Прописываем зависимости в 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

  1. Инсталлятор готов. Создаём review.module, проверяем инсталлятор и описываем

остальной функционал как обычно.

Чтобы поменять поля нашего CCK-типа данных, используем админку, генерируем заново код и вставляем его в review.def.inc.php, заменяя старую версию. Добавляем в review.install функцию для автоматического обновления:

function review_update_1() {
    // node_type_delete('review');
    _review_add_cck_node();
    return array();
}

Использованы идеи и части кода из:

Комментарии RSS

  1. №2373
    mmm
    mmm 04 марта 2010 г., 23:51:29

    Давненько читаю ваш блок, назрел такой вопрос. Вы разрабатываете интернет приложения и на drupal и на различных php фреймворках (Yii, CodeIgniter возможно еще что то). Так вот в каких ситуациях лучше применять drupal, а в каких какой либо из этих фреймворков???

    От себя - на сколько мне известно, друпал хорошо грузит хостинг, но зато думается мне можно быстрее поднять проект. По поводу посещаемости проекта в будущем даже и предположить не могу...

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

    За ранее благодарю за ответ...

  2. №2374
    alyoung
    alyoung 05 марта 2010 г., 4:28:11

    mmm, попробуйте присмотреться к CMS Cogear. Она с социальным уклоном и написана на фреймворке CodeIgniter.

  3. №2375
    mmm
    mmm 05 марта 2010 г., 10:44:22

    alyoung, CMS Cogear интересный проект, но cms достаточно новая и непонятно на долго ли автору данной системы хватит энтузиазма развивать её..

  4. №2377
    Sam
    Sam 05 марта 2010 г., 12:20:49

    Из социальных довольно хороша LiveStreet. Про выбор между фреймворком и CMS рассказать сложно. В вашем случае, наверное, лучше будет с CMS.

  5. №2491
    CuamckuyKot
    CuamckuyKot 26 апр. 2010 г., 22:15:17

    mmm

    Автор у cogear терпеливый, усидчивый и целеустремленный, поэтому все будет хорошо :-)

  6. №5083
    Sergey
    Sergey 29 июля 2011 г., 13:36:52

    Странно update не работает выдает ошибку The content type our_content already exists in this database. Exiting. No import performed.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.