it-swarm-eu.dev

Programové vytvoření typu obsahu se souborovým polem ve vlastním modulu

Píšu vlastní modul, který jsem udělal dříve, ale toto je poprvé, co jsem se pokusil vytvořit typ obsahu s poli. Implementoval jsem hook_node_info a typ obsahu se zobrazuje v seznamu typů obsahu v rozevírací nabídce od admin_menu, ale když přejdu na admin/structure/types, Není uveden.

Implementoval jsem hook_install a chytil nějaký kód, který jsem našel na jiné SO otázka. Mám kód vytisknout nějaké informace o ladění do mého protokolu chyb a vypadá to, že to všechno funguje , ale při procházení Typ obsahu struktury nezobrazí pole, které jsem přidal.

Zde jsou háčky:

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));
}

V databázi vidím tabulku s názvem field_data_field_mymod_myfile, Takže vím, že první část fungovala. Tabulka je však prázdná.

Protokol chyb ukazuje, že metoda field_create_instance() vrátila toto:

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

Proč se moje pole nezobrazuje u tohoto typu obsahu?

9
Kenny Wyland

To není tak velká odpověď, jako rozšíření o předchozí odpověď.

Zjistil jsem, že tyto dva odkazy jsou velmi užitečné při zjišťování, co systém potřebuje, aby byla vlastní pole přidána do vašeho typu uzlu vlastního modulu.

Nejlepší: http://www.sitepoint.com/creating-a-new-drupal-node-type/

Dobré doplňující informace: http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

Problém, který jsem měl, spočíval v tom, že tyto (a každý další příklad, který mohu najít online), jsou velmi konkrétní příklady bez dostatečné dokumentace, které mi pomohou vymyslet řešení mého vlastního případu použití.

Pomohl to tenkenův komentář k OP o použití modulu Features k získání polí pro vlastní pole.

Takže jsem si stáhl modul Features a povolil: https://drupal.org/project/features

Pak jsem vytvořil pole pro svůj typ obsahu pomocí administrátorského rozhraní v Drupal jako byste normálně chtěli, aby se modul vytvořil. Pak jsem procházel Struktura> Funkce> Vytvořit funkci a vložil v falešném názvu (použil jsem „test“) pro funkci a poté v oblasti komponentů klikněte na „Pole instance“ a zaškrtněte políčka pro vlastní pole. Všechna pole jsou pojmenována jako node- [váš typ uzlu typu name] - [název pole], takže v mém případě, když jsem chtěl obrazové pole, bylo to uzel-novel_section-field_image.

Po výběru vlastních polí pro můj typ uzlu jsem jednoduše klikl na "Stáhnout funkci" a uložil soubor .tar na plochu, otevřel jej, otevřel složku "test" a prohlížel si test.features.field_base.inc a test. features.field_instance.inc k získání polí, které jsem potřeboval pro svá pole.

Pak jsem použil strukturu naznačenou prvním odkazem, který jsem zveřejnil, a poté to fungovalo perfektně. Pro mě.

Nemohl jsem najít žádnou dokumentaci o strukturách polí potřebných pro věci, jako jsou obrazová pole a referenční pole taxonomie, a zdálo se, že všechny ostatní návody a žádosti o pomoc online jsou zaměřeny na konkrétní věci, jako jsou textová pole.

Doufejme, že to bude mít kdokoli, kdo má stejné potíže, jaké jsem měl, a bude schopen provést jejich nastavení pomocí těchto příkladů a modulu Funkce jako já.

Díky tomu, že jsem poukázal na tuto funkčnost modulu Funkce, nikdy jsem ji nepoužil a nevěděl, že to udělá.

6
Jason Gray

Tento kód, který bude vytvořen nový typ obsahu, který by měl přidat do souboru .install.

Přidání hook_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);
}
?>

Měli byste udělat drupal zprávu a zapsat tuto událost do protokolu:

<?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')); 
  }
}
?>

Poskytněte hook_uninstall () k odstranění vašeho typu obsah:

<?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');
}
?>
4
Nitesh Sethia

Tento příspěvek je trochu zastaralý, ale pokud to pomůže, zjistil jsem, že tento článek je velmi jasný. Ukazuje vám, jak vytvořit nový typ obsahu krok za krokem.

Odkaz na tutoriál

<?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);

    }

}
1
Shlomi Nissan