प्रोग्रामेटिक रूप से एक कस्टम मॉड्यूल में फ़ाइल फ़ील्ड के साथ एक सामग्री प्रकार बनाना


9

मैं एक कस्टम मॉड्यूल लिख रहा हूं, जो मैंने पहले किया है, लेकिन यह पहली बार है जब मैंने खेतों के साथ एक सामग्री प्रकार बनाने की कोशिश की है। मैंने hook_node_info लागू किया है और सामग्री प्रकार की सूची में दिखाई दे रही है प्रकार admin_menu से ड्रॉपडाउन में, हालांकि, जब मैं ब्राउज़ करता हूं तो admin/structure/typesयह सूचीबद्ध नहीं है।

मैंने हुक_ इंस्टॉलेशन लागू किया और कुछ कोड पकड़े जो मुझे एक और SO प्रश्न पर मिले। मेरे पास मेरी त्रुटि लॉग के लिए कुछ डिबग जानकारी का कोड प्रिंट है और यह इसे पसंद करता है जैसे यह सब काम करता है, लेकिन जब मैं संरचना सामग्री प्रकार पर ब्राउज़ करता हूं तो यह मेरे द्वारा जोड़े गए क्षेत्र को नहीं दिखाता है।

यहाँ हुक हैं:

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
क्या आपको सुविधाएँ पसंद नहीं हैं? मुझे फील्डयूआई का उपयोग करके सामग्री प्रकार बनाना आसान लगता है फिर फ़ीचर को कस्टम "फ़ीचर" (मॉड्यूल) में निर्यात करें। ... यह सिर्फ आपके द्वारा यहां किए गए हुक_इनफो का उपयोग करता है - और क्षेत्र परिभाषाओं के लिए सरणियां बना रहा है। आप इस तरह से अपने काम को पार कर सकते हैं।
तेन जुने

जवाबों:


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

मेरे पास समस्या यह थी कि ये (और हर दूसरा उदाहरण जो मैं ऑनलाइन पा सकता हूं) मेरे स्वयं के उपयोग के मामले का हल निकालने के लिए पर्याप्त दस्तावेज के बिना बहुत विशिष्ट उदाहरण हैं।

कस्टम फ़ील्ड के लिए सरणियाँ प्राप्त करने के लिए फ़ीचर मॉड्यूल का उपयोग करने के बारे में ओपी को टिपेन की टिप्पणी में क्या मदद मिली।

इसलिए मैंने फीचर मॉड्यूल डाउनलोड किया और इसे सक्षम किया: https://drupal.org/project/features

फिर मैंने अपने सामग्री प्रकार पर फ़ील्ड्स बनाए, सामान्य रूप से Drupal में व्यवस्थापक इंटरफ़ेस का उपयोग करके, कि मैं मॉड्यूल बनाना चाहता था। फिर मैंने स्ट्रक्चर> फीचर्स> फीचर तैयार किया और फीचर के लिए बोगस नाम (I "" टेस्ट ") का उपयोग किया और फिर कंपोनेंट एरिया में" फील्ड इंस्टेंस "पर क्लिक किया और कस्टम फील्ड के लिए बॉक्स चेक किए। सभी क्षेत्रों को कुछ नाम दिया गया है जैसे नोड- [आपका नोड प्रकार मशीन का नाम] - [क्षेत्र का नाम], इसलिए मेरे मामले में जब से मैं एक छवि क्षेत्र चाहता था यह नोड- उपन्यास_ फ़ील्ड-फ़ील्ड_इमेज था।

अपने नोड प्रकार I के लिए कस्टम फ़ील्ड चुनने के बाद, बस "डाउनलोड सुविधा" पर क्लिक किया और अपने डेस्कटॉप पर .tar फ़ाइल को सहेजा, इसे खोला, "परीक्षण" फ़ोल्डर खोला, फिर test.features.field_base.inc और परीक्षण देखा। features.field_instance.inc अपने क्षेत्र के लिए आवश्यक सरणियाँ प्राप्त करने के लिए।

तब मैंने बस उस पहली कड़ी द्वारा उल्लिखित संरचना का उपयोग किया था जिसे मैंने पोस्ट किया था और उसके बाद पूरी तरह से काम किया। मेरे लिए।

मुझे छवि फ़ील्ड्स और टैक्सोनॉमी संदर्भ फ़ील्ड्स जैसी चीज़ों के लिए आवश्यक सरणी संरचनाओं पर कोई दस्तावेज़ नहीं मिला और यह सभी अन्य ट्यूटोरियल और सहायता अनुरोधों पर ध्यान दिया गया, जो टेक्स्ट फ़ील्ड जैसी विशिष्ट चीज़ों पर केंद्रित हैं।

उम्मीद है कि किसी को भी मुझे जो परेशानी हो रही है, वह यह देखेगा और इन उदाहरणों और मेरे द्वारा किए गए फीचर्स मॉड्यूल का उपयोग करके अपना सेटअप कार्य करने में सक्षम होगा।

फीचर मॉड्यूल की इस कार्यक्षमता को इंगित करने के लिए टेनिक के लिए धन्यवाद, मैंने कभी इसका उपयोग नहीं किया था और मुझे नहीं पता था कि यह ऐसा करेगा।


4

यह कोड नया कंटेंट टाइप बनाया जाएगा जिसे इंस्टॉलेशन फ़ाइल में जोड़ना चाहिए।

जोड़ने हुक_ स्थापना ():

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

अपनी सामग्री प्रकार निकालने के लिए hook_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');
}
?>

बहुत विस्तृत प्रतिक्रिया के लिए धन्यवाद, लेकिन मैंने इसे बनाने के बाद सामग्री प्रकार में एक फ़ाइल फ़ील्ड कैसे जोड़ूँ?
केनी वायलैंड

मैंने ऊपर आपके कोड का उपयोग किया है और यह कहता है कि सामग्री प्रकार जोड़ा गया था, लेकिन यह दिखाई नहीं देताadmin/structure/types
केनी वायलैंड

1
इसे काम करने के लिए, आपको अपने मॉड्यूल में हुक_फॉर्म () लागू करने की आवश्यकता है अन्यथा यदि आप डेटाबेस में नोड_टाइप तालिका में देखते हैं, तो आप देखेंगे कि आपका नया बनाया गया प्रकार अक्षम है। हुक_फॉर्म () लागू करने से लगता है कि यह सक्रिय हो सकता है (यह इस तरह क्यों है, मुझे कोई पता नहीं है और इसका कोई मतलब नहीं है)। यह आपकी दूसरी टिप्पणी को संबोधित करता है।
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);

    }

}

कृपया अपने उत्तर में इसका एक प्रासंगिक उद्धरण शामिल करें
पियरे.विरेंस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.