Програмно створення типу вмісту з полем файлу в спеціальному модулі


9

Я пишу спеціальний модуль, який я робив раніше, але це перший раз, коли я намагався створити тип вмісту з полями. Я реалізував moka_node_info, і Тип вмісту відображається у списку типів вмісту у спадному меню admin_menu, однак, коли я переглядаю admin/structure/typesйого, він не перераховується.

Я реалізував kuk_install і схопив якийсь код, який я знайшов в іншому питанні. У мене код роздруковує деяку інформацію про налагодження до мого журналу помилок, і ЛЮБИТЬ, як це все працює, але коли я переглядаю тип вмісту структури, він не показує додане поле.

Ось гачки:

function mymod_node_info() {
  return array(
    'mymod_content' => array(
      'name' => t('My Mod'),
      'base' => 'mymod_content',
      'description' => t('A Description'),
    )
  );
}

function mymod_install() {
    error_log('mymod_install');
    $types = node_type_get_types();

    if ( ! field_info_field('field_mymod_myfile') ) {
        $field = array(
            'field_name' => 'field_mymod_myfile',
            'type' => 'file',
        );
        $created_field = field_create_field($field);
        error_log('---- field_create_field -----');
        error_log(var_export($created_field, true));
    }

    $instance = array(
        'field_name' => 'field_mymod_myfile',
        'entity_type' => 'mymod_content',
        'bundle' => 'mymod_content',
        'required' => TRUE,
    );
    $created_instance = field_create_instance($instance);
    error_log('---- field_create_instance -----');
    error_log(var_export($created_instance, true));
}

Я бачу таблицю, яка називається field_data_field_mymod_myfileв базі даних, тому я знаю, що перша частина працювала. Однак таблиця порожня.

Журнал помилок показує, що field_create_instance()метод повернув це:

array (
  'field_name' => 'field_mymod_myfile',
  'entity_type' => 'mymod_content',
  'bundle' => 'mymod_content',
  'required' => true,
  'field_id' => '5',
)

Чому моє поле не відображається для цього типу вмісту?


1
вам не подобаються функції? Мені найпростіше зробити тип вмісту за допомогою FieldUI, а потім експортувати функцію на спеціальний "функція" (модуль). ... це просто створюючи масиви, використовуючи тут ви_возок_info_info_inruy - і масиви для визначення полів. Ви могли перехресно перевірити свою роботу таким чином.
tenken

Відповіді:


7

Це не стільки відповідь, скільки розширення попередньої відповіді.

Ці два посилання виявились дуже корисними для з'ясування того, що потрібно системі, щоб користувацькі поля були додані до вашого типу власного модуля.

Найкраще: http://www.sitepoint.com/creating-a-new-drupal-node-type/

Хороша додаткова інформація: http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

Проблема, яку я мав, полягала в тому, що ці (і всі інші приклади, які я можу знайти в Інтернеті) - це дуже конкретні приклади без достатньої документації, щоб допомогти мені розібратися у власному випадку використання.

Що допомогло, це коментар tenken до ОП щодо використання модуля "Особливості" для отримання масивів для спеціальних полів.

Тому я завантажив модуль функцій і включив його: https://drupal.org/project/features

Тоді я створив поля для мого типу вмісту, використовуючи адміністраторський інтерфейс у Drupal, як ви зазвичай, що я хотів створити модуль. Потім я переглянув "Структура"> "Особливості"> "Створити функцію" і поставив нечітке ім'я (я використав "тест") для функції, а потім в області компонентів натисніть на "Екземпляри поля" і встановіть прапорці на власні поля. Всі поля названі чимось на кшталт node- [назва вашого типу вузла машини] - [назва поля], тому в моєму випадку, оскільки я хотів, щоб поле зображення було node-novel_section-field_image.

Після вибору користувальницьких полів для мого типу вузла я просто натиснув "Завантажити функцію" і зберег файл .tar на робочому столі, відкрив його, відкрив папку "тест", потім переглянув тест.features.field_base.inc і тестував. features.field_instan.inc, щоб отримати масиви, необхідні для моїх полів.

Тоді я просто використав структуру, викладену тим першим посиланням, яке я розмістив, і після цього воно прекрасно працювало. Для мене.

Я не зміг знайти жодної документації щодо структур масиву, необхідних для таких речей, як поля зображень та опорні поля таксономії, і, здавалося, всі інші навчальні посібники та запити про допомогу в мережі зосереджені на конкретних речах, таких як текстові поля.

Сподіваємось, хтось із тими ж проблемами, які у мене виникли, побачить це і зможе зробити їх налаштування за допомогою цих прикладів та модуля функцій, як я.

Завдяки tenken за вказівку на цю функціональність модуля Особливості, я ніколи не використовував його і не знав, що це буде робити.


4

Це код, який буде створений новий тип вмісту, який слід додати у .install файл.

Додавання_установки_встановлення ():

<?php
function your_module_name_install() {
  // use get_t() to get the name of our localization function for translation
  // during install, when t() is not available.
  $t = get_t();

  // Define the node type.
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );

  // Complete the node type definition by setting any defaults not explicitly
  // declared above.
  // http://api.drupal.org/api/function/node_type_set_defaults/7
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);

  // Save the content type
  node_type_save($content_type);
}
?>

Вам слід зробити друпальське повідомлення та написати цю подію до журналу:

<?php
function your_module_name_install() {
  $t = get_t();
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);
// Check if we create content type or update.
  $status = node_type_save($content_type);
// Replacement rule for the messages.
  $t_args = array('%name' => $content_type->name);
  if ($status == SAVED_UPDATED) { // update case
    drupal_set_message($t('The content type %name has been updated.', $t_args));
  } 
  elseif ($status == SAVED_NEW) { // create case
    drupal_set_message($t('The content type %name has been added.', $t_args));
    watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
  }
}
?>

Укажіть kuck_uninstall (), щоб видалити тип вмісту :

<?php
function your_module_name_uninstall() {
  // Gather all the example content that might have been created while this
  // module was enabled.  Simple selects still use db_query().
  // http://api.drupal.org/api/function/db_query/7
  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
  $result = db_query($sql, array(':type' => 'node_example'));
  $nids = array();
  foreach ($result as $row) {
    $nids[] = $row->nid;
  }
  // Delete all the nodes at once
  // http://api.drupal.org/api/function/node_delete_multiple/7
  node_delete_multiple($nids);
  // Delete our content type
  // http://api.drupal.org/api/function/node_type_delete/7
  node_type_delete('node_example');
}
?>

Дякую за дуже детальну відповідь, але як додати поле "Файл" до типу вмісту після його створення?
Kenny Wyland

Я використовував ваш код вище, і він говорить, що тип вмісту додано, але він не відображаєтьсяadmin/structure/types
Kenny Wyland

1
Для того, щоб це спрацювало, вам потрібно реалізувати у вашому модулі гачку_form (), інакше якщо ви заглянете в таблицю node_type в базі даних, ви помітите, що ваш новостворений тип вимкнено. Реалізація mock_form (), здається, активує його (чому це так, я не маю уявлення, і це не має великого сенсу). Це до речі стосується вашого другого коментаря.
user5013

1

Ця публікація трохи застаріла, але якщо вона допоможе, я вважаю цю статтю дуже зрозумілою. Він показує, як поетапно створити новий тип вмісту.

Посилання на підручник

<?php

/**
 * Implements hook_install().
 */
function book_install()
{

    $t = get_t();

    // Step 1 - Define the custom content type

    $content_type = array(

        'type'          => 'book',
        'name'          => $t('Book'),
        'description'   => $t('Create a new book'),
        'title_label'   => $t('Book title'),
        'base'          => 'node_content',
        'custom'        => TRUE,

    );

    $node_type = node_type_set_defaults($content_type);

    node_type_save($node_type);

    // Step 2 - Create new fields

    $fields = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'    => 'book_author_name',
            'type'          => 'text',
            'cardinality'   => 1,

        ),

        // Description

        'book_description'  => array(

            'field_name'    => 'book_description',
            'type'          => 'text_long',
            'cardinality'   => 1,

        ),

    );

    foreach( $fields as $field ) {

        field_create_field($field);

    }

    // Step 3 - Attach fields to content type

    $instances = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'   => 'book_author_name',
            'label'        => $t('Author Name'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textfield'
            ),

        ),

        // Description

        'book_description'  => array(

            'field_name'   => 'book_description',
            'label'        => $t('Description'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textarea'
            ),

        ),

    );

    foreach( $instances as $instance ) { // Loop through our instances

        $instance['entity_type']   = 'node';
        $instance['bundle']        = 'book'; // Attach the instance to our content type

        field_create_instance($instance);

    }

}

Будь ласка, включіть у відповідь відповідну цитату про це
Pierre.Vriens
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.