Как программно создать новый тип контента в Drupal 7 - PullRequest
8 голосов
/ 14 ноября 2011

Я создаю модуль (my_module) в Drupal 7. Он имеет некоторую функциональность, а также создаст новый тип контента.В my_module.install я реализовал hook_install (my_module_install). Могу ли я использовать более одной реализации hook_install для создания нового типа контента (my_cck_install) в этом модуле?Если (да), как мне это сделать?Иначе: я делаю это в другом модуле?: -)

Ответы [ 4 ]

9 голосов
/ 14 ноября 2011

Вы не можете использовать более одной реализации hook_install в одном модуле; в PHP вы не можете иметь 2 функции с одинаковыми именами, которые исключают это.

В любом случае вам просто нужно добавить новый тип контента в тот же hook_install (посмотрите, как это делает стандартный профиль установки, в /profiles/standard/standard.install). Вот как я всегда добавляю новые типы контента из установочного файла (на примере модуля отзывов):

function testimonial_install() {
  // Make sure a testimonial content type doesn't already exist
  if (!in_array('testimonial', node_type_get_names())) {
    $type = array(
      'type' => 'testimonial',
      'name' => st('Testimonial'),
      'base' => 'node_content',
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
      'title_label' => 'Customer / Client Name'
    );

    $type = node_type_set_defaults($type);
    node_type_save($type);
    node_add_body_field($type);
  }
}
3 голосов
/ 18 декабря 2012

Следующий код создаст тип контента под названием «Событие» с именем машины «событие» и полем заголовка -

//CREATE NEW CONTENT TYPE
function orderform_node_info() {
  return array(
    'event' => array(
    'name' => t('Event'),
    'base' => 'event',
    'description' => t('A event content type'),
    'has_title' => TRUE
    ),
  );
}


function event_form($node,$form_state) {
  $form['title'] = array(
    '#type' => 'textfield',
    '#title' => t('event Title'),
    '#default_value' => !empty($node->title) ? $node->title : '',
    '#required' => TRUE,
    '#weight' => -5
  );
  return $form;
}
//END CONTENT TYPE

Вы должны поместить его в файл .module ... если вы хотите добавить дополнительные поля, дайте мне знать, и я исправлю вас кодом ... удачи!

1 голос
/ 09 сентября 2016

/ * * Реализация в узле ловушечного узла в .Module файле * /

function test_node_info() {
return array(
  'product' => array(
    'name' => t('Product'),
    'base' => 'product',
    'description' => t('Product Title'),
  )
);

}

/ ** * Реализация hook_form () * /

function product_form($node, $form_state) {
return node_content_form($node, $form_state);

} / ** * Реализует hook_install () в .install файле . * /

function test_install() {
node_types_rebuild();
$types = node_type_get_types();
node_add_body_field($types['product']);
//New way to implement to add fields in your content type
foreach (_test_installed_fields() as $field) {
    field_create_field($field);
}
foreach (_test_installed_instances() as $fieldinstance) {
    $fieldinstance['entity_type'] = 'node';
    $fieldinstance['bundle'] = 'product';
    field_create_instance($fieldinstance);
}

}

/ * * Определите свои поля * /

function _test_installed_fields() {
$t = get_t();
return array(
  'product_title123' => array(
    'field_name' => 'product_title123',
    'label' => $t('Product Title'),
    'type' => 'text'
  ),
  'description123' => array(
    'field_name' => 'description123',
    'label' => $t('Description'),
    'type' => 'text'
  ),

);

} * * тысяча двадцать-один

/ * * Определите свой экземпляр полей * /

function _test_installed_instances() {
$t = get_t();
return array(
  'product_title123' => array(
    'field_name' => 'product_title123',
    'type' => 'text',
    'label' => $t('Product Title'),
    'widget' => array(
      'type' => 'text_textfield'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Product Title'),
        'type' => 'text'
      )
    )
  ),
  'description123' => array(
    'field_name' => 'description123',
    'type' => 'text',
    'label' => $t('Description'),
    'widget' => array(
      'type' => 'text_textarea_with_summary'
    ),
    'display' => array(
      'example_node_list' => array(
        'label' => $t('Description'),
        'type' => 'text'
      )
    )
  ),

);

}

/ ** * Реализует hook_uninstall (). * /

function test_uninstall() {
$ournewtype = 'product';
$sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
$result = db_query($sql, array(':type' => $ournewtype));
$nodeids = array();
foreach ($result as $row) {
    $nodeids[] = $row->nid;
}
node_delete_multiple($nodeids);
node_type_delete($ournewtype);

}

Вот и все.

0 голосов
/ 26 июня 2016
     /**
     * Implements hook_node_info()
     */
    function mymodule_node_info() {
        return array(
            'news' => array(
                'name' => t('News'),
                'base' => 'news',
                'description' => t('You can add  News here'),
                'has_title' => TRUE,
                'title_label' => t('News title')
             )
        );
    }

 /**
 * Implement hook_form()
 */
function mymodule_form($node, $form_state) {
    return node_content_form($node, $form_state);
}

Добавьте реализацию к mymodule.install следующим образом:

/**
 * Implements hook_install().
 */
function mymodule_install() {
    node_types_rebuild();
    $types = node_type_get_types();|
      node_add_body_field($types['news']);
}

Подробное описание можно получить с кодом здесь

...