it-swarm.com.de

Wie erstelle ich programmgesteuert Felder?

Wie kann ich Folgendes in Drupal 7) implementieren?

Ich muss lediglich ein Modul erstellen, das eine neue feldfähige Entität mit dem Namen "Unternehmen" definiert. Ich habe eine Liste von beispielsweise 20 Feldern, die von jeder Unternehmensinstanz ausgefüllt werden müssen. Diese Fragen sind vordefiniert und einige enthalten möglicherweise eine benutzerdefinierte Validierung.

Im Moment bin ich an dem Punkt angelangt, an dem ich der Unternehmensentität neue Felder hinzufügen kann. Dies funktioniert im Moment gut. Mein Problem ist, dass alle diese Felder vorhanden sein müssen, sobald das Modul installiert ist. Das Hinzufügen über die Schnittstelle ist daher keine Option.

Ich habe mich gefragt, wie ich das angehen kann. Ich würde annehmen, dass es darauf ankommt, das zu tun, was mit der Benutzeroberfläche "Felder verwalten" programmgesteuert getan werden kann.

56
NRaf

Verwenden Sie field_create_field () , um das Feld selbst zu erstellen, und field_create_instance () , um eine Instanz für das angegebene Entitätspaket zu haben.

Wenn Sie Felder als Teil eines benutzerdefinierten Moduls erstellen, möchten Sie das Feld möglicherweise löschen, wenn das Modul deinstalliert wird. Dazu können Sie field_delete_field () verwenden, wenn Sie das Feld und alle Feldinstanzen löschen möchten, oder wenn Sie bestimmte Instanzen löschen möchten, können Sie field_delete_instance () verwenden .

41
tamasd

Beispiel, wie Sie dem Benutzerprofil programmgesteuert Felder hinzufügen und diese im Benutzerregistrierungsformular verwenden oder nicht.


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

Wenn Sie schnell Felder aus einem vorhandenen Inhaltstyp oder einer vorhandenen Entität erstellen/löschen müssen, ohne die Benutzeroberfläche oder die Programmierung zu verwenden, können Sie die wenig bekannten Drush-Befehle verwenden:

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type: Entitätstyp (z. B. Knoten, Benutzer, Kommentar). Der Standardwert ist Knoten.

Beispiel: Erstellen Sie zwei neue Felder für Artikel:

drush field-create article city,text,text_textfield subtitle,text,text_textfield

Andere Befehle:

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

Wie von anderen erwähnt, können Sie die Feld-API-Funktionen aus der hook_install () Implementierung Ihres Moduls verwenden, um Felder und deren Instanzen für Ihren Inhaltstyp zu erstellen. Siehe node_example_install () zum Beispiel für die Verwendung der Funktion.

Eine andere Lösung besteht darin, das Modul Features zu verwenden. Features können verschiedene Site-Komponenten in Code in einem Modul exportieren. Inhaltstypen und Felder gehören zu diesen exportierbaren. Sie können entweder ein Feature-Modul generieren und Ihren vorhandenen Code überschreiben. Features tun dann ihr Bestes, um zu vermeiden, dass Ihr Code beschädigt wird. Oder Sie können ein Dummy-Modul generieren und den feldbezogenen Code kopieren/in Ihr Modul einfügen. Dies erfordert grundlegende Kenntnisse über die Funktionsweise von Funktionen.

4
Pierre Buyle

In Ihrer Installationsdatei müssen Sie sowohl 'hook_install' als auch 'hook_uninstall' definieren. Beispiel enthalten, aber lesen Sie alles über die zusätzlichen Schlüssel in den API-Referenzen (Code ist nicht getestet, daher können Tippfehler vorhanden sein).

In dem hook_install Sie können die Felder hinzufügen mit:

field_create_field , Diese Funktion erstellt eine Vorlage für ein Feld.

field_create_instance Kann nach dem Erstellen des Felds verwendet werden, um es zu content_types (auch als Bundles bezeichnet) hinzuzufügen.

HINWEIS Die Namen der verschiedenen Feldtypen finden Sie in den Modulen, die sie generieren (dies ist der Schlüssel des Array-Elements in ihrer hook_field_info). Sie finden alle Kernfeld-Implementierungsmodule im Ordner modules/field/modules.

Einstellungen können auch aus den Feldmodulen abgeleitet werden. Die Einstellungen, die Sie in field_create_field sind die Site-weiten. Die, die Sie in field_instance_create sind die knotentypspezifischen

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

In dem hook_uninstall

field_delete_instance und field_delete_field können verwendet werden, um sie wieder zu entfernen, field_delete_field wird automatisch aufgerufen, wenn Sie die letzte Instanz (normalerweise) löschen.

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

Ich hatte kürzlich ein ähnliches Bedürfnis nach einem Projekt. Hier ist, wie ich es angegangen bin. Ich hoffe, es hilft jemandem.

Grundsätzlich erstellen Sie die benötigten Felder über die Feldoberfläche, exportieren sie in Code und fügen sie dann in Ihr benutzerdefiniertes Modul ein. Sie müssen das Entwicklungsmodul aktiviert haben.

Ich habe auch ein Gist mit diesen Informationen erstellt.

Auf geht's....

  1. Erstellen Sie die benötigten Felder mit der üblichen Benutzeroberfläche Drupal).
  2. Gehen Sie auf derselben Site zu example.com/devel/php
  3. Fügen Sie den folgenden Code in das Textfeld "Auszuführender PHP-Code" ein.
  4. Stellen Sie die ersten 3 Variablen ein und klicken Sie dann auf Ausführen

    $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. Sie erhalten 2 Arrays, so etwas, hoffentlich mit allen ausgefüllten Eigenschaften.

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

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

Fügen Sie nun den folgenden Code zu Ihrer Installationsdatei hinzu. Ersetzen Sie alle Instanzen von mymodule durch den tatsächlichen Modulnamen. Fügen Sie den Code aus der Entwicklungsausgabe in die _mymodule_field_data und _mymodule_instance_data ein, wie in den jeweiligen Funktionen unten angegeben. Sie können dies für so viele Felder tun, wie Sie möchten. Fügen Sie einfach alle $ fields-Arrays in die Funktion _mymodule_field_data und alle $ instance in die Funktion _mymodule_instance_data ein.

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

Sie können auch das Feature-Modul verwenden, um die Felder zur Installationszeit zu erstellen.

Da Features Code für Felder generieren, besteht eine Option darin, den Feature-Modul zu verwenden, um den Code in ein Dummy-Modul zu generieren und ihn dann zu kopieren und in die Installationsdatei Ihres Moduls einzufügen.

Der Vorteil ist, dass das Modul nicht vom Funktionsmodul in Ihrer Zielumgebung abhängt.

0

Sie können den unten angegebenen Code für benutzerdefinierte Unternehmensmodule verwenden, um programmgesteuert einen Inhaltstyp mit seinen verschiedenen Feldern zu erstellen.

Sie können diesen Code in eine Installationsdatei Ihres benutzerdefinierten Moduls einfügen. Es wird programmgesteuert einen Inhaltstyp namens "Firma" und seine verschiedenen Arten von Feldern (Text, Zahlen, Datum (Hinweis: Sie müssen das Datumsmodul installieren, da das Datumsfeld nicht standardmäßig bereitgestellt wird), Bild, Liste) hinzufügen.

Ich habe auch den Deinstallationscode hinzugefügt, der den Inhaltstyp "Firma" zusammen mit all seinen Feldern und Daten entfernt, wenn Sie Ihr Modul "Benutzerdefiniertes Computermodul" deinstallieren.

Sie können diese Felder nach Ihren Wünschen ändern/entfernen:

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