it-swarm.asia

كيفية إنشاء الحقول برمجياً؟

كيف يمكنني اتباع ما يلي في Drupal 7؟

ما أحتاج إليه هو إنشاء وحدة نمطية تحدد كيانًا جديدًا قابلًا للحقل يسمى "الشركة". لدي قائمة ، لنفترض ، 20 حقلاً يجب ملؤها بكل مثيل للشركة. هذه الأسئلة محددة مسبقًا وقد يحتوي بعضها على التحقق من الصحة المخصص.

في الوقت الحالي ، أنا في الوقت الذي يمكنني فيه إضافة حقول جديدة إلى كيان الشركة. هذا يعمل بشكل جيد في الوقت الحالي. مشكلتي هي أنني بحاجة إلى أن تكون جميع هذه الحقول موجودة بمجرد تثبيت الوحدة ، لذا فإن إضافتها عبر الواجهة ليست خيارًا.

كنت أتساءل كيف يمكنني التعامل مع هذا؟ أفترض أن الأمر قادر على فعل ما يمكن فعله باستخدام واجهة مستخدم "إدارة الحقول" برمجيًا.

56
NRaf

استخدم field_create_field () لإنشاء الحقل نفسه و field_create_instance () للحصول على مثيل لحزمة الكيان المحددة.

عند إنشاء حقول كجزء من وحدة نمطية مخصصة ، قد ترغب أو لا ترغب في حذف الحقل عند إلغاء تثبيت الوحدة النمطية. للقيام بذلك ، يمكنك استخدام field_delete_field () إذا كنت تريد حذف الحقل وكل مثيل الحقل ، أو إذا كنت ترغب في حذف مثيلات معينة يمكنك استخدام field_delete_instance () .

41
tamasd

مثال على كيفية إضافة حقول برمجيًا إلى ملف تعريف المستخدم وكيفية الاستفادة منها أو لا ، في نموذج تسجيل المستخدم.


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);
  }
}
9
Francisco Luz

إذا كنت بحاجة إلى إنشاء/حذف الحقول بسرعة من نوع محتوى أو كيان موجود ، دون استخدام واجهة المستخدم أو البرمجة ، يمكنك استخدام أوامر 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>
8
Interdruper

كما أشار آخرون ، يمكنك استخدام وظائف API API من hook_install () تنفيذ الوحدة الخاصة بك لإنشاء الحقول ومثيلاتها لنوع المحتوى. راجع node_example_install () على سبيل المثال لاستخدام الوظيفة.

حل آخر لاستخدام الميزات الوحدة النمطية. يمكن للميزات تصدير مختلف مكونات الموقع إلى التعليمات البرمجية في وحدة نمطية. أنواع وحقول المحتوى من بين هذه قابلة للتصدير. يمكنك إما إنشاء وحدة ميزات وإلغاء التعليمات البرمجية الحالية الخاصة بك ، ثم الميزات ستبذل قصارى جهدها لتجنب كسر التعليمات البرمجية الخاصة بك. أو يمكنك إنشاء وحدة وهمية ونسخها./الصق الرمز المرتبط بالحقول إلى وحدتك. يتطلب هذا فهمًا أساسيًا لكيفية عمل الميزات.

4
Pierre Buyle

ستحتاج في ملف التثبيت إلى تحديد كل من "hook_install" و "hook_uninstall". تم تضمين المثال ولكن اقرأ كل شيء عن المفاتيح الإضافية في مراجع API (لم يتم اختبار الرمز لذلك قد يكون مطبعيًا هناك).

في ال hook_install يمكنك إضافة الحقول باستخدام:

field_create_field ، تقوم هذه الوظيفة بإنشاء قالب للحقل.

field_create_instance يمكن استخدامها بعد إنشاء الحقل لإضافته إلى content_types (تُعرف أيضًا بالحزم).

ملاحظة يمكن العثور على أسماء أنواع الحقول المختلفة في الوحدات التي تنشئها (وهو مفتاح عنصر الصفيف في hook_field_info الخاصة بها). يمكنك العثور على جميع وحدات تنفيذ المجال الأساسي في مجلد الوحدات/الحقل/الوحدات.

يمكن أيضًا اشتقاق الإعدادات من الوحدات الميدانية. الإعدادات التي قمت بتعيينها في 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);
        }
      }
    }
3
Suranga Panagamuwa Gamage

في الآونة الأخيرة كانت لدي حاجة مماثلة للمشروع ، وإليك كيفية تعاملي معه ، وآمل أن يساعد شخصًا ما.

ستقوم في الأساس بإنشاء الحقول التي تحتاجها باستخدام واجهة مستخدم الحقول ، وتصديرها إلى التعليمات البرمجية ثم تضمينها في الوحدة النمطية المخصصة الخاصة بك. ستحتاج إلى تمكين وحدة Devel.

قمت أيضًا بإنشاء Gist بهذه المعلومات.

ها نحن ذا....

  1. قم بإنشاء الحقول التي تحتاجها باستخدام المعتاد Drupal UI.
  2. في نفس الموقع ، انتقل إلى example.com/devel/php
  3. قم بلصق التعليمة البرمجية التالية في مربع نص "PHP code to execute".
  4. قم بتعيين المتغيرات الثلاثة الأولى ثم انقر فوق تنفيذ

    $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. سوف تحصل على مصفوفتين ، شيء من هذا القبيل ، ونأمل أن يتم ملء جميع الخصائص.

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

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

الآن قم بإضافة التعليمات البرمجية التالية إلى ملف التثبيت الخاص بك. استبدل جميع مثيلات mymodule باسم الوحدة الفعلية. قم بلصق الشفرة من إخراج devel في _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;
}
2
John Laine

يمكنك أيضًا استخدام وحدة الميزات لإنشاء الحقول في وقت التثبيت.

نظرًا لأن الميزات تنشئ رمزًا للحقول ، فإن الخيار هو فقط استخدام وحدة الميزات لإنشاء التعليمات البرمجية في وحدة وهمية ثم نسخها ولصقها في ملف تثبيت الوحدة الخاصة بك.

الفائدة هي أن الوحدة لا تعتمد على وحدة الميزات في البيئة المستهدفة الخاصة بك.

0
thesurfinganalyst

يمكنك استخدام رمز الوحدة المخصصة الموضح أدناه لإنشاء نوع محتوى برمجيًا بحقوله المتنوعة.

يمكنك إضافة هذا الرمز في ملف .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);
}
0
Nadeem Khan