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