Як програмно створити поля?


56

Як я можу підійти до виконання наступного в Drupal 7?

Що мені потрібно зробити, це створити модуль, який визначає нову сукупність, що називається, під назвою "Компанія". У мене є список, скажімо, 20 полів, які необхідно заповнити кожним екземпляром компанії. Ці питання заздалегідь визначені, а деякі можуть містити перевірку на замовлення.

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

Мені було цікаво, як я можу підійти до цього? Я припускаю, що це може зробити те, що можна зробити, використовуючи програмний інтерфейс "Управління полями".


Мені не зрозуміло повне коло ваших потреб, але я думаю, що цей потік буде корисним для вас: drupal.org/node/721552 Він показує зразок коду для створення користувальницького типу вмісту з полями, коли модуль вперше встановлений. Вам, мабуть, доведеться перекопати API, щоб отримати потрібні точні настройки поля, але це було б хорошою відправною точкою. В принципі, ви повинні дивитися на node_type_set_defaults()і node_type_save(), а також, звичайно, hook_install().
handsofaten

Якщо ви робите це в коді на відміну від функцій, подивіться приклад полів та приклад вузла в проекті " Приклади" .
rfay

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

Відповіді:


41

Використовуйте field_create_field (), щоб створити саме поле, а field_create_instantion () мати примірник для даного сукупності об'єктів.

Створюючи поля як частину спеціального модуля, ви можете або не захочете видалити поле під час видалення модуля. Для цього ви можете використовувати field_delete_field (), якщо ви хочете видалити поле та всі екземпляри поля, або якщо ви хочете видалити конкретні екземпляри, ви можете використовувати field_delete_instantion () .


Як видалити поля, створені під час видалення модуля?
Ашок К.С.

Ашок, я додав пояснення для вас у редакцію, яку я щойно зробив у відповідь.
Лестер Пібоді

9

Приклад того, як програмно додавати поля до профілю користувача та як їх використовувати чи ні, у форму реєстрації користувача.


function MYMODULE_enable() {
  // Check if our field is not already created.
  if (!field_info_field('field_myField')) {

    // Create the field base.
    $field = array(
      'field_name' => 'field_myField', 
      'type' => 'text', 
    );
    field_create_field($field);

    // Create the field instance on the bundle.
    $instance = array(
      'field_name' => 'field_myField', 
      'entity_type' => 'user', 
      'label' => 'My Field Name', 
      'bundle' => 'user', 
      // If you don't set the "required" property then the field wont be required by default.
      'required' => TRUE,
      'settings' => array(
        // Here you inform either or not you want this field showing up on the registration form.
        'user_register_form' => 1,
      ),
      'widget' => array(
        'type' => 'textfield',
      ), 
    );
    field_create_instance($instance);
  }
}

3
Це має бути реалізовано в mook_install ().
revagomes

Якщо все, що ви хочете зробити, - це додати нове поле до вже існуючого типу вмісту, а звідти продовжувати роботу в бекенде, такий підхід є абсолютно чудовим. Активуйте модуль, відключіть його, зробіть. Нове поле існує, можна редагувати, модуль можна видалити.
leymannx

8

Якщо вам потрібно швидко створити / видалити поля з існуючого типу вмісту або об'єкта, не використовуючи ні інтерфейс користувача, ні програмування, ви можете використовувати ці маловідомі команди Drush:

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type: Тип сутності (наприклад, вузол, користувач, коментар). За замовчуванням вузол.

Наприклад: Створіть два нових поля для статті:

drush field-create article city,text,text_textfield subtitle,text,text_textfield

Інші команди:

drush field-delete <field_name> [--bundle] [--entity_type]
drush field-info [field | types]
drush field-update <field_name> Return URL for field editing web page.
drush field-clone <source_field_name> <dst_field_name>

4

Як зазначають інші, ви можете використовувати функції API API від реалізації модуля_установки () вашого модуля для створення полів та їх примірників для вашого типу вмісту. Дивіться, наприклад, node_example_install (), наприклад, використання функції.

Іншим рішенням є використання модуля Особливості . Особливості можуть експортувати різні компоненти сайту до коду в модулі. Типи вмісту та поля є серед цих експортованих. Ви можете або генерувати модуль функцій, і переосмислити наявний код. Функції будуть робити все можливе, щоб уникнути порушення коду. Або ви можете створити фіктивний модуль і скопіювати ./вставте код, пов'язаний з полями, у свій модуль. Це вимагає основного розуміння того, як функціонує функція.


3

У вашому інсталювальному файлі вам потрібно буде визначити як "kuk_install", так і "kuk_uninstall". Приклад включений, але прочитайте все про додаткові ключі в посиланнях на API (код не перевірений, так що, можливо, там написані помилки).

У полі hook_installви можете додати поля за допомогою:

field_create_field , Ця функція будує шаблон для поля.

field_create_instance Можна використовувати після створення поля, щоб додати його до content_types (також відомий як пакети).

ПРИМІТКА Імена різних типів полів можна знайти в модулях, що їх генерують (це ключ елемента масиву у їхній куці_field_info). Ви можете знайти всі основні модулі реалізації модулів у папці модулі / поле / модулі.

Параметри також можуть бути отримані з польових модулів. Налаштування, які ви встановили в, - field_create_fieldце налаштування на сайті. Ви встановили field_instance_createці типи node_type

    MY_MODULE_install(){
      // Generate the base for the field
      $field = array( 
        'field_name' => 'FIELD_MACHINE_NAME', 
        'type' => 'FIELD_TYPE' // See note above for what to put here
      );
      // Instance 
      $instance = array(
        'field_name' => 'FIELD_MACHINE_NAME', 
        'entity_type' => 'node', 
      ); 

      // Create instances of the field and add them to the content_types
      $node_types = node_type_get_types(); 
      foreach($node_types as $node_type){
         $instance['bundle'] = $node_type->type; 
         field_create_instance($instance); 
      }
    }

В hook_uninstall

field_delete_instance та field_delete_field можна використовувати для їх видалення знову, field_delete_fieldвикликається автоматично, якщо ви видалите останній екземпляр (як правило).

    MY_MODULE_uninstall(){
      $node_types = node_type_get_types(); 
      foreach($node_types as $node_type){
        if($instance = field_info_instance('node', 'FIELD_MACHINE_NAME', $node_type->type)) {
          field_delete_instance($instance);
        }
      }
    }

2

Нещодавно у мене була схожа потреба в проекті, ось як я підійшов до нього, сподіваюся, він комусь допоможе.

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

Я також створив історію з цією інформацією.

Ось і ми....

  1. Створіть потрібні поля, використовуючи звичайний інтерфейс Drupal.
  2. На цьому ж веб-сайті перейдіть на сторінку example.com/devel/php
  3. Вставте наступний код у текстове поле "PHP-код для виконання".
  4. Встановіть перші 3 змінні та натисніть кнопку Execute

    $entity_type = 'node';    
    $field_name = 'body';    
    $bundle_name = 'article'; 
    
    $info_config = field_info_field($field_name);
    $info_instance = field_info_instance($entity_type, $field_name, $bundle_name);
    unset($info_config['id']);
    unset($info_instance['id'], $info_instance['field_id']);
    include_once DRUPAL_ROOT . '/includes/utility.inc';
    $output = "\$fields['" . $field_name . "'] = " . drupal_var_export($info_config) . ";\n";
    $output .= "\$instances['" . $field_name . "'] = " . drupal_var_export($info_instance) . ";";
    drupal_set_message("<textarea rows=30 style=\"width: 100%;\">" . $output . '</textarea>');
    
  5. Ви отримаєте 2 масиви, щось подібне, сподіваємось, що всі властивості заповнені.

$fields['field_some_field'] = array(
  'properties of the field'
);

$instances['field_some_field'] = array(
  'properties of the instance'
);

Тепер додайте наступний код у свій .install файл. Замініть всі екземпляри мій модуля фактичним іменем модуля. Вставте код з виводу devel у _mymodule_field_data та _mymodule_instance_data, як зазначено у відповідних функціях нижче. Ви можете зробити це для будь-якої кількості завдань, просто покладіть всі масиви $ поля у функцію _mymodule_field_data та всі $ екземпляри у функції _mymodule_instan_data.

function mymodule_install() {

  // Create all the fields we are adding to our entity type.
  // http://api.drupal.org/api/function/field_create_field/7
  foreach (_mymodule_field_data() as $field) {
    field_create_field($field);
  }

  // Create all the instances for our fields.
  // http://api.drupal.org/api/function/field_create_instance/7
  foreach (_mymodule_instance_data() as $instance) {
    field_create_instance($instance);
  }
}

// Create the array of information about the fields we want to create.
function _mymodule_field_data() {
  $fields = array();
  // Paste $fields data from devel ouput here.
  return $fields;
  }

// Create the array of information about the instances we want to create.
function _mymodule_instance_data() {
  $instances = array();
  // Paste $instances data from devel output here.
  return $instances;
}


0

Можна також розглянути можливість використання модуля "Особливості" для створення полів під час встановлення.

Оскільки функції генерують код для полів, опція полягає лише у використанні модуля Feature для створення коду в фіктивний модуль, а потім копіювання та вставка у файл .install вашого модуля.

Перевага полягає в тому, що модуль не залежить від модуля функцій у вашому цільовому середовищі.


1
Altough Features - це хороший спосіб експорту полів у код, це не спосіб використання функцій. Функції не використовують Field API CRUD для створення полів із створеної .install.
П’єр Буйле

0

Ви можете використовувати код customcompanymodule, наведений нижче, для програмного створення типу вмісту з його різними полями.

Ви можете додати цей код у .install файл вашого спеціального модуля. Це програмно додасть тип вмісту під назвою "компанія" та його різні типи полів (текст, числовий, дата (зверніть увагу: вам потрібно буде встановити модуль Дата, оскільки поле "Дата" за замовчуванням не передбачене), зображення, список).

Я також додав код для видалення, який видалить тип вмісту "компанія" разом із усіма його полями та даними, коли ви будете видаляти модуль "customcompanymodule".

Ви можете змінити / видалити ці поля відповідно до ваших потреб:

function customcompanymodule_install() {
     $t = get_t();
     node_types_rebuild();
     $company = array(
    'type' => 'company',
    'name' => $t('Company'),
    'base' => 'node_content',
    'module' => 'node',
    'description' => $t('Content type to handle companys.'),
    'body_label' => $t('Company Description'),
    'title_label' => $t('Company Title'),
    'promote' => 0,
    'status' => 1,
    'comment' => 0,
);
$content_type = node_type_set_defaults($company);

node_type_save($content_type);

foreach (_company_installed_fields() as $field) {
    field_create_field($field);
}

foreach (_company_installed_instances() as $instance) {
    $instance['entity_type'] = 'node';
    $instance['bundle'] = 'company';
    field_create_instance($instance);
}

$weight = db_query("SELECT weight FROM {system} WHERE name = :name",    array(':name' => 'categories'))->fetchField();
db_update('system')->fields(array(
            'weight' => $weight + 1,
        ))
        ->condition('name', 'company')
        ->execute();
}

function _company_installed_fields() {
$t = get_t();
$fields = array(
    'company_startdate' => array(
        'field_name' => 'company_startdate',
        'label' => $t('Company Start Date'),
        'cardinality' => 1,
        'type' => 'datetime',
        'module' => 'date',
        'settings' => array(
            'granularity' => array(
                'month' => 'month',
                'day' => 'day',
                'hour' => 'hour',
                'minute' => 'minute',
                'year' => 'year',
                'second' => 0,
            ),
            'tz_handling' => 'site',
            'timezone_db' => 'UTC',
            'cache_enabled' => 0,
            'cache_count' => '4',
            'todate' => 'required',
        ),
    ),
    'company_totalwinners' => array(
        'field_name' => 'company_totalwinners',
        'label' => $t('Maximum Company Winners'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_minwinner' => array(
        'field_name' => 'company_minwinner',
        'label' => $t('Minimum Entries for Company to Activate'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_totalentries' => array(
        'field_name' => 'company_totalentries',
        'label' => $t('Company Total Entries'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_points' => array(
        'field_name' => 'company_points',
        'label' => $t('Company Points'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_image' => array(
        'field_name' => 'company_image',
        'label' => $t('Image'),
        'cardinality' => 1,
        'type' => 'image',
        'settings' => array(
            'default_image' => 0,
            'uri_scheme' => 'public',
        ),
    ),
    'company_description' => array(
        'field_name' => 'company_description',
        'label' => $t('Company Description'),
        'cardinality' => 1,
        'type' => 'text',
        'module' => 'text',
        'length' => '255'
    ),
    'company_winner' => array(
        'field_name' => 'company_winner',
        'label' => $t('Company Description'),
        'cardinality' => 1,
        'type' => 'text',
        'module' => 'text',
        'length' => '255'
    ),
    'field_autowinnerselection' => array(
        'field_name' => 'field_autowinnerselection',
        'label' => $t('Auto Company Winner Selection'),
        'type' => 'list_boolean',
        'module' => 'list',
        'active' => '1',
        'locked' => '0',
        'cardinality' => '1',
        'deleted' => '0'
    ),
);
return $fields;
}

function _company_installed_instances() {
$t = get_t();
$instances = array(
    'company_startdate' => array(
        'field_name' => 'company_startdate',
        'label' => $t('Company Lifespan'),
        'cardinality' => 1,
        'widget' => array(
            'type' => 'date_popup',
            'module' => 'date',
            'settings' => array(
                'input_format' => 'm/d/Y - H:i:s',
                'input_format_custom' => '',
                'year_range' => '-3:+3',
                'increment' => '15',
                'label_position' => 'above',
                'text_parts' => array(),
            ),
        ),
    ),
    'company_totalwinners' => array(
        'field_name' => 'company_totalwinners',
        'label' => $t('Maximum Company Winners'),
        'cardinality' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_minwinner' => array(
        'field_name' => 'company_minwinner',
        'label' => $t('Minimum Number of Entries for Company to Activate'),
        'cardinality' => 1,
        'required' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_totalentries' => array(
        'field_name' => 'company_totalentries',
        'label' => $t('Company Total Entries'),
        'cardinality' => 1,
        'required' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_points' => array(
        'field_name' => 'company_points',
        'label' => $t('Company Points'),
        'cardinality' => 1,
        'required' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_image' => array(
        'field_name' => 'company_image',
        'label' => $t('Image'),
        'cardinality' => 1,
        'required' => 1,
        'type' => 'company_image',
        'settings' => array(
            'max_filesize' => '',
            'max_resolution' => '213x140',
            'min_resolution' => '213x140',
            'alt_field' => 1,
            'default_image' => 0
        ),
        'widget' => array(
            'settings' => array(
                'preview_image_style' => 'thumbnail',
                'progress_indicator' => 'throbber',
            ),
        ),
        'display' => array(
            'default' => array(
                'label' => 'hidden',
                'type' => 'image',
                'settings' => array('image_style' => 'medium', 'image_link' => ''),
                'weight' => -1,
            ),
            'teaser' => array(
                'label' => 'hidden',
                'type' => 'image',
                'settings' => array('image_style' => 'thumbnail', 'image_link' => 'content'),
                'weight' => -1,
            ),
        ),
    ),
    'company_description' => array(
        'field_name' => 'company_description',
        'label' => $t('Company Description'),
        'cardinality' => 1,
        'widget' => array(
            'weight' => '-3',
            'type' => 'text_textfield',
            'module' => 'text',
            'active' => 1,
            'settings' => array(
                'size' => '1000',
            ),
        ),
    ),
    'company_winner' => array(
        'field_name' => 'company_winner',
        'label' => $t('Company Winner'),
        'cardinality' => 1,
        'widget' => array(
            'weight' => '-3',
            'type' => 'text_textfield',
            'module' => 'text',
            'active' => 1,
            'settings' => array(
                'size' => '60',
            ),
        ),
    ),
    'field_autowinnerselection' => array(
        'field_name' => 'field_autowinnerselection',
        'required' => 1,
        'label' => $t('Auto Company Winner Selection'),
        'widget' => array(
            'weight' => '-3',
            'type' => 'options_buttons',
            'module' => 'options',
            'active' => 1,
            'settings' => array(),
        ),
    ),
);
return $instances;
}

function customcompanymodule_uninstall() {
$content_types = array(
    'name1' => 'company',
);
$sql = 'SELECT nid FROM {node} n WHERE n.type = :type1';
$result = db_query($sql, array(':type1' => $content_types['name1']));
$nids = array();
foreach ($result as $row) {
    $nids[] = $row->nid;
}
node_delete_multiple($nids);
node_type_delete($content_types['name1']);
field_purge_batch(1000);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.