Programmgesteuert ein Bundle erstellen?

6

Ich habe versucht, dieses Problem herauszufinden, bei dem der Benutzer dynamisch Projektanforderungsformulare erstellen kann (eigene Felder hinzufügen, einschließlich Dropdown-Listen, Mehrfachauswahl usw.). Der Benutzer benötigt eine Möglichkeit, mehrere Projektanforderungstypen (z. B. Bundles?) Für verschiedene Geschäftsbereiche zu erstellen. Ich dachte, die Entity / Bundle-Beziehung wäre perfekt dafür. Also hier ist meine Idee:

Verwenden Sie die Schema-API, um meine Basistabelle "Projekt" zu definieren. Verwenden Sie die Entitäts-API hook_entity_info (), um Drupal über meine neue Entität zu informieren und sie auf die Tabelle "Projekt" zu verweisen. Jetzt kann ich in diesem Hook Bundles definieren - was großartig ist. Der Benutzer muss jedoch in der Lage sein, ein Bundle zu erstellen. Wo befindet sich der Aufruf entity_create_bundle ($ entity_type, $ bundle)?

Beispiel:

Entitätstyp: Projekt (mit in DB definierten allgemeinen Feldern, und es ist feldfähig)

Bundle: IT-Projekt, HR-Projekt - die die gemeinsamen Felder von Project teilen

In einer Tabelle project_type werden zusätzliche Gruppierungen gespeichert, die ich benötige (Projektanforderungen für Geschäftsbereiche).

Jetzt habe ich Drupal 7 Module Development gelesen, was großartig war, und in Kapitel 6 definieren sie eine Entität "Kunstwerk", die ein paar Bündel, "Skulptur" und "Malerei" enthält. Die Art und Weise, wie sie die Schritte beschreiben, ist, als würden sie eine Administrationsoberfläche erstellen, um zusätzliche Grafikarten zu erstellen, aber dies ist nicht wahr (soweit ich das beurteilen kann). Nach Abschluss des Kapitels kann ich nur Objekte vom Typ "Malerei" oder "Skulptur" erstellen.

Wie kann ich Benutzern erlauben, Bundles vom Entitätstyp "Projekt" zu erstellen?

Fehlt mir etwas oder ist die Funktionalität [noch] nicht vorhanden?

Jack
quelle
Haben Sie sich das Webform-Modul angesehen? Ich bin mit der Idee der Erstellung von Entitäten (Bundles) nicht zufrieden ... aber wenn Sie sich bei dieser Idee sicher sind, schauen Sie in drupal.org/project/entityform nach !
Springer
Zuerst dachte ich, das hätte nichts mit dem zu tun, was ich wollte, aber sie haben im Wesentlichen getan, was ich brauche. Im Code sieht es so aus, als würden sie hook_entity_info_alter () verwenden, um die "entityform_type's" zu ändern. Wann wird hook_entity_info_alter () genau aufgerufen? Nur einmal bei der Installation oder wann immer?
Jack
1
Ich wollte nicht, dass dieses Modul genau das tut, was ich brauche, aber sie erstellen dieselben Tabellentypen wie ich (entityform und entityform_type), damit zusätzliche "Bundles" oder Typen erstellt werden können. Ich frage mich nur, wie hook_entity_info_alter () heißt.
Jack
hook_entity_info () und seine Änderung werden beim Löschen des Caches aufgerufen. Wenn Sie also eine Änderung in einem Modul hinzufügen, müssen Sie nur den Cache leeren, damit es wirksam wird.
Letharion

Antworten:

14

Untersuchen der Standardknotenpakete

Das Knotenmodul erstellt die Bundles "Artikel" und "Basisseite" nicht selbst. Nach einigem Graben fand ich die Definitionen für diese Bundles in der Installationsdatei des Standardinstallationsprofils.

/profiles/standard/standard.install

  // Insert default pre-defined node types into the database. For a complete
  // list of available node type attributes, refer to the node type API
  // documentation at: http://api.drupal.org/api/HEAD/function/hook_node_info.
  $types = array(
    array(
      'type' => 'page',
      'name' => st('Basic page'),
      'base' => 'node_content',
      'description' => st("Use <em>basic pages</em> for your static content, such as an 'About us' page."),
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
    ),
    array(
      'type' => 'article',
      'name' => st('Article'),
      'base' => 'node_content',
      'description' => st('Use <em>articles</em> for time-sensitive content like news, press releases or blog posts.'),
      'custom' => 1,
      'modified' => 1,
      'locked' => 0,
    ),
  );

  foreach ($types as $type) {
    $type = node_type_set_defaults($type);
    node_type_save($type);
    node_add_body_field($type);
  }

  // clear the site cache

Ein paar Anmerkungen zu diesem Code

  1. Die Entity-API wird nicht verwendet
  2. st() Die Funktion sollte nur während eines Drupal-Installationsvorgangs verwendet werden
  3. Der Knoten enthält viele Nicht-Feld-API-Felder, die er verarbeitet node_type_save
  4. Knotenaufrufe field_attach_create_bundle, um Feldmodule über das neue Bundle zu informieren

Erstellen eines Bundles mit der Entity-API

Ich bin nicht sicher, wie Sie Ihre Entitäten definiert haben, aber wenn Sie die Entitäts-API verwendet haben, sieht Ihr Code zur Bundle-Erstellung möglicherweise folgendermaßen aus:

$bundle = new stdClass();
$bundle->type = 'project_hr';
$bundle->label = t('HR Project');
$bundle->is_new = true;
$bundle->description = t("A super cool project");

$controller = new ProjectTypeController('project_type'); //assuming you defined this extension of EntityAPIController
$controller->save($bundle);

Ein Hinweis zu Entitäten

  • Ein Entitätstyp ist eine abstrakte Basisklasse
  • Ein Bundle ist eine erweiterte Entitätstypklasse
  • Ein Feld ist ein Klassenmitglied, eine Eigenschaft, eine Variable oder eine Feldinstanz
  • Eine Entität ist ein Objekt oder eine Instanz einer Basis- oder erweiterten Klasse

Mehr über Entitäten

tmsimont
quelle
Heh - danke dafür ... es ist fast ein Jahr her seit meiner Informatik-Capstone-Klasse, als ich das brauchte - ABER ich habe am Ende etwas Ähnliches wie deine Lösung gemacht :).
Jack
4
Ja, ich weiß, ich lauere auf einer alten Frage, aber ich habe festgestellt, dass Google selbst dieselbe Frage gestellt hat. Ich antwortete mehr zu meinem eigenen Vorteil (und anderen gleichgesinnten Googlern) als zu
Ihrem
3

Ich habe eine ganze Weile versucht, das herauszufinden. Ich arbeite an einem Projekt, das auf dem Modellmodul basiert ( https://drupal.org/project/model ). In meinem Installationsskript wollte ich Bundles erstellen. Das Codebeispiel für das Entity-API-Beispiel in der Antwort "Untersuchen der Standardknotenpakete" ist nah, aber nicht ganz richtig (nun, es war nicht für mich).

Das folgende Snippet sollte funktionieren:

$bundles = field_info_bundles('project_type');

if (empty($bundles['project_hr'])) {
    $controller = new ProjectTypeController('project_type'); //assuming you defined this extension of EntityAPIController

    $params = array();
    $params['type'] = 'project_hr';
    $params['label'] = t('HR Project');
    $params['is_new'] = TRUE;
    $params['description'] = t('A super cool project.');

    $bundle = $controller->create($params);
    $controller->save($bundle);
}

Das field_info_bundles prüft, ob das Bundle vorhanden ist (Sie versuchen also nicht, es zweimal zu erstellen). Dadurch werden Informationen zu den für die Entität project_type erstellten Bundles abgerufen.

Wenn das Bundle nicht vorhanden ist, können Sie das Bundle erstellen.

Zuerst erstellen Sie einen Controller und dann ein Parameterarray mit den Optionen für das Bundle, das Sie erstellen möchten. Anschließend erstellen Sie mit dem Controller ein Bundle-Objekt (dies erstellt ein PHP-Objekt mit allen "Standard" -Entitätsfeldern und -Methoden und fügt dann Ihre Parameter zum Objekt hinzu. Anschließend speichern Sie das Bundle mit dem Controller. Dieser letzte Teil bleibt bestehen das Bundle in der Datenbank.

Ich hoffe das hilft.

Damien Whaley
quelle
2

Ich versuche so etwas zu tun, und es sieht so aus, als ob das Knotenmodul bereits den Code enthält. Wenn Sie einen neuen Inhaltstyp erstellen, erstellt es ein neues Bundle für die Knotenentität und fügt das Feld "body" hinzu es standardmäßig (unter Verwendung der Feld-API). Alle diese Operationen und Formulare (Tabelle der Bündel, CRUD der Bündel usw.) werden von Hand erstellt.

Dank der Drupal-Entwickler können Sie den im Node-Modul enthaltenen Code kopieren.

Ich denke, später kann ich meine Arbeit als Drupal-Modul für die visuelle Erstellung von Entitäten und deren Hierarchie von Bundles veröffentlichen.

Zaycker
quelle