कैसे प्रोग्राम बनाने के लिए फील्ड्स?


56

मैं ड्रुपल 7 में निम्नलिखित को लागू करने के लिए कैसे संपर्क कर सकता हूं?

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

फिलहाल, मैं उस बिंदु पर हूं जब मैं कंपनी इकाई में नए क्षेत्र जोड़ सकता हूं। यह इस समय ठीक काम करता है। मेरा मुद्दा यह है कि मुझे इन सभी क्षेत्रों की आवश्यकता है जैसे ही मॉड्यूल स्थापित होता है, इसलिए उन्हें इंटरफ़ेस के माध्यम से जोड़ना एक विकल्प नहीं है।

मैं सोच रहा था कि मैं यह कैसे कर सकता हूं? मुझे लगता है कि यह ऐसा करने में सक्षम है जो 'मैनेज फील्ड्स' यूआई का उपयोग करके प्रोग्राम किया जा सकता है।


मैं आपकी आवश्यकताओं के पूर्ण दायरे पर स्पष्ट नहीं हूं, लेकिन मुझे लगता है कि यह धागा आपके लिए उपयोगी होगा: drupal.org/node/721552 यह मॉड्यूल के साथ कस्टम कंटेंट टाइप बनाने के लिए नमूना कोड दिखाता है जब एक मॉड्यूल पहली बार स्थापित होता है। संभवतः आपको आवश्यक फ़ील्ड सेटिंग्स प्राप्त करने के लिए एपीआई के माध्यम से खुदाई करनी होगी, लेकिन यह एक अच्छा प्रारंभिक बिंदु होगा। मूल रूप से, आपको node_type_set_defaults()और node_type_save(), साथ ही, निश्चित रूप से देखने की आवश्यकता होगी hook_install()
हैंडोफैटन

यदि आप विशेषताओं के विपरीत कोड में ऐसा कर रहे हैं, तो उदाहरण उदाहरण के लिए उदाहरण देखें और उदाहरण उदाहरण परियोजना में नोड उदाहरण ।
rfay

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

जवाबों:


41

का प्रयोग करें field_create_field () क्षेत्र ही है और बनाने के लिए field_create_instance () दिए गए इकाई बंडल के लिए एक उदाहरण है।

कस्टम मॉड्यूल के हिस्से के रूप में फ़ील्ड बनाते समय, आप मॉड्यूल की स्थापना रद्द होने पर फ़ील्ड को हटाना या नहीं करना चाह सकते हैं। ऐसा करने के लिए, आप उपयोग कर सकते हैं field_delete_field () यदि आप क्षेत्र और सभी क्षेत्र उदाहरण को नष्ट करना चाहते हैं, या आप उपयोग कर सकते हैं यदि आप विशिष्ट उदाहरण को हटाना चाहते field_delete_instance ()


मॉड्यूल को अनइंस्टॉल करने पर हम अपने द्वारा बनाए गए फ़ील्ड को कैसे हटाते हैं?
अशोक केएस

अशोक, मैंने आपके द्वारा उत्तर में किए गए संपादन में आपके लिए एक स्पष्टीकरण जोड़ा है।
लेस्टर पीबॉडी

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
इसे हुक_ इंस्टॉलेशन () में लागू किया जाना चाहिए।
घूमता है

यदि आप सभी एक मौजूदा सामग्री प्रकार में एक नया क्षेत्र जोड़ना चाहते हैं और वहां से बैकएंड में जारी है, तो यह दृष्टिकोण पूरी तरह से ठीक है। मॉड्यूल को सक्रिय करें, इसे निष्क्रिय करें, किया। नया क्षेत्र है, संपादन योग्य, मॉड्यूल को हटाया जा सकता है।
लीमैनक्स

8

यदि आपको न तो UI और न ही प्रोग्रामिंग का उपयोग किए बिना किसी मौजूदा सामग्री प्रकार या इकाई से फ़ील्ड बनाने / हटाने की आवश्यकता है, तो आप इन अल्पज्ञात 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

जैसा कि दूसरों ने बताया है, आप सामग्री बनाने के लिए फ़ील्ड और उनके उदाहरणों को बनाने के लिए अपने मॉड्यूल के हुक_ इंस्टॉलेशन () कार्यान्वयन से फ़ील्ड एपीआई फ़ंक्शन का उपयोग कर सकते हैं । फ़ंक्शन के उदाहरण के उपयोग के लिए node_example_install () देखें ।

एक अन्य उपाय है फीचर मॉड्यूल का उपयोग करना । सुविधाएँ मॉड्यूल में कोड करने के लिए विभिन्न साइट घटकों को निर्यात कर सकती हैं। सामग्री प्रकार और फ़ील्ड इन निर्यात करने वालों में से हैं। आप या तो एक फ़ीचर मॉड्यूल उत्पन्न कर सकते हैं और अपने मौजूदा कोड को ओवरराइड कर सकते हैं, फिर फ़ीचर आपके कोड को तोड़ने से बचने के लिए अपनी पूरी कोशिश करेंगे। या आप एक डमी मॉड्यूल उत्पन्न कर सकते हैं और अपने मॉड्यूल पर फ़ील्ड से संबंधित कोड कॉपी / पेस्ट कर सकते हैं। इसके लिए मूलभूत समझ की आवश्यकता है कि सुविधाएँ कैसे काम करती हैं।


3

अपनी स्थापित फ़ाइल में आपको 'hook_install' और 'hook_uninstall' दोनों को परिभाषित करने की आवश्यकता होगी। उदाहरण में शामिल है, लेकिन एपीआई संदर्भों में अतिरिक्त कुंजियों के बारे में सभी पढ़ें (कोड अप्रकाशित है इसलिए वहां टाइपो हो सकता है)।

में hook_installआप का उपयोग कर फ़ील्ड जोड़ सकते हैं:

field_create_field , यह फ़ंक्शन किसी फ़ील्ड के लिए टेम्पलेट बनाता है।

field_create_instance सामग्री_types (जिसे बंडल के रूप में भी जाना जाता है) में जोड़ने के लिए फ़ील्ड बनाने के बाद इसका उपयोग किया जा सकता है।

नोट विभिन्न फ़ील्ड प्रकार के नाम उन्हें उत्पन्न करने वाले मॉड्यूल में पाए जा सकते हैं (यह उनके हुक_फ़ील्ड_फिलियो में सरणी आइटम की कुंजी है)। आप मॉड्यूल / क्षेत्र / मॉड्यूल फ़ोल्डर में सभी मुख्य क्षेत्र कार्यान्वयन मॉड्यूल पा सकते हैं।

सेटिंग्स को क्षेत्र के मॉड्यूल से भी प्राप्त किया जा सकता है। आपके द्वारा सेट की गई सेटिंग field_create_fieldसाइट विस्तृत हैं। आपके द्वारा सेट field_instance_createकिए गए नोड्स विशिष्ट हैं

    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

मुझे हाल ही में एक परियोजना की समान आवश्यकता थी, यहां बताया गया है कि मैंने इसे कैसे संपर्क किया, आशा है कि यह किसी की मदद करता है।

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

मैंने इस जानकारी के साथ एक जिस्ट भी बनाया ।

ये रहा....

  1. सामान्य Drupal UI का उपयोग करके, अपनी इच्छित फ़ील्ड बनाएं।
  2. उसी साइट पर, example.com/devel/php पर जाएं
  3. "कोड निष्पादित करने के लिए PHP कोड" में निम्नलिखित कोड पेस्ट करें।
  4. पहले 3 चर सेट करें और फिर निष्पादित पर क्लिक करें

    $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 फ़ाइल में निम्न कोड जोड़ें। मायमॉडल के सभी उदाहरणों को वास्तविक मॉड्यूल नाम से बदलें। नीचे दिए गए संबंधित फ़ंक्शंस के अनुसार, कोड को dem आउटपुट से _mymodule_field_data और _mymodule_instance_data में पेस्ट करें। आप इसे जितने चाहें उतने फ़ील्ड के लिए कर सकते हैं, बस सभी $ फ़ील्ड एरेज़ को _mymodule_field_data फ़ंक्शन में और सभी $ इंस्टेंस को _mymodule_instance_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

आप स्थापित समय पर फ़ील्ड बनाने के लिए फ़ीचर मॉड्यूल का उपयोग करने पर भी विचार कर सकते हैं।

जैसा कि फ़ील्‍ड फ़ील्ड के लिए कोड जेनरेट करता है, एक विकल्प सिर्फ कोड को डमी मॉड्यूल में जेनरेट करने के लिए फ़ीचर मॉड्यूल का उपयोग करना है और फिर अपने मॉड्यूल की स्थापना फ़ाइल में कॉपी और पेस्ट करना है।

लाभ यह है कि मॉड्यूल आपके लक्षित वातावरण में फीचर मॉड्यूल पर निर्भर नहीं करता है।


1
ऑल्टो फीचर्स फ़ील्ड को कोड में एक्सपोर्ट करने का एक अच्छा तरीका है, जो कि फीचर्स का उपयोग करने का तरीका नहीं है। विशेषताएँ जनरेट किए गए फ़ील्ड से फ़ील्ड API CRUD का उपयोग नहीं करते हैं।
पियरे बाइल

0

आप नीचे दिए गए customcompanymodule कोड का उपयोग अपने विभिन्न क्षेत्रों के साथ सामग्री प्रकार को प्रोग्राम बनाने के लिए कर सकते हैं।

आप इस कोड को अपने कस्टम मॉड्यूल की। ​​स्थापना फ़ाइल में जोड़ सकते हैं। यह प्रोग्रामेटिक रूप से "कंपनी" नामक एक सामग्री प्रकार और इसके विभिन्न प्रकार के फ़ील्ड (पाठ, संख्यात्मक, दिनांक (नोट: आपको दिनांक मॉड्यूल स्थापित करने की आवश्यकता होगी, क्योंकि दिनांक फ़ील्ड डिफ़ॉल्ट रूप से प्रदान नहीं की जाती है), छवि, सूची) को जोड़ देगा।

मैंने अपने सभी फ़ील्ड्स और डेटा के साथ सामग्री प्रकार "कंपनी" को निकालने वाले अनइंस्टॉल कोड को भी जोड़ दिया है जब आप अपने '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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.