プログラムでバンドルを作成しますか?


6

私は、ユーザーがプロジェクトリクエストフォームを動的に作成できるようにする(ドロップダウン、複数選択などを含む独自のフィールドを追加する)この問題を理解しようとしています。ユーザーは、さまざまなビジネスユニットに対して複数のプロジェクトリクエストタイプ(バンドルなど)を作成する方法を必要としています。エンティティとバンドルの関係がこれに最適であると考えました。だからここに私の考えがあります:

Schema APIを使用して、ベーステーブル「プロジェクト」を定義します。Entity APIのhook_entity_info()を使用して、新しいプロジェクトについてDrupalに通知し、「プロジェクト」テーブルを指すようにします。このフックで、バンドルを定義できます-これは素晴らしいことです。しかし、ユーザーがバンドルを作成できるようにする必要があります。entity_create_bundle($ entity_type、$ bundle)呼び出しはどこにありますか?

例:

エンティティタイプ:プロジェクト(DBで定義された共通フィールドを持ち、フィールド化可能)

バンドル:ITプロジェクト、HRプロジェクト-プロジェクトの共通フィールドを共有します

project_typeテーブルには、必要な追加のグループ化(ビジネスユニットに対するプロジェクトリクエスト)が格納されます。

今、私は素晴らしいDrupal 7モジュール開発を読んでいます。第6章では、「彫刻」と「絵画」という2つのバンドルを持つエンティティ「アートワーク」を定義しています。彼らが手順を説明する方法は、追加のアートワークタイプを作成するための管理インターフェイスを構築しているようですが、これは(私が言えることから)正しくありません。この章を終えると、「絵画」または「彫刻」タイプのエンティティのみを作成できます。

ユーザーが「プロジェクト」エンティティタイプのバンドルを作成できるようにするにはどうすればよいですか?

何かが足りないのですか、それとも機能がまだありませんか?


webformモジュールを調べましたか?エンティティ(バンドル)の作成のアイデアに不快です...しかし、これについて確信がある場合は、drupal.org/project/entityformを調べてください
ジャンパー

最初はこれは私が望むものとは何の関係もないと思っていましたが、基本的に彼らは私が必要とすることをしました。コードでは、hook_entity_info_alter()を使用して「entityform_type's」を変更しているようです。hook_entity_info_alter()はいつ正確に呼び出されますか?インストール時に一度だけ、またはいつですか?
ジャック

1
このモジュールが私が必要とするものを正確に実行するという意味ではありませんでしたが、追加の「バンドル」またはタイプを作成できるように、同じタイプのテーブル(entityformおよびentityform_type)を作成します。私は、hook_entity_info_alter()がどのように呼び出されるのか疑問に思っています。
ジャック、

hook_entity_info()とその変更は、キャッシュのクリア時に呼び出されます。したがって、モジュールに変更を追加する場合、変更を有効にするために必要なのはキャッシュをクリアすることだけです。
Letharion、2012

回答:


14

デフォルトのノードバンドルの調査

Nodeモジュールは「Article」および「Basic page」バンドル自体を作成しません。少し掘り下げた後、標準のインストールプロファイルのインストールファイルにこれらのバンドルの定義が見つかりました。

/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

このコードに関する注意点

  1. Entity APIを使用していません
  2. st() 関数は、Drupalのインストールプロセス中にのみ使用する必要があります
  3. ノードには、処理するフィールドAPI以外のフィールドが多数含まれています node_type_save
  4. field_attach_create_bundle新しいバンドルについてフィールドモジュールに通知するノード呼び出し

Entity APIを使用したバンドルの作成

エンティティの定義方法はわかりませんが、Entity APIを使用した場合、バンドル作成コードは次のようになります。

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

エンティティに関する注意

  • エンティティタイプは抽象基本クラスです
  • バンドルは拡張エンティティタイプクラスです
  • フィールドは、クラスメンバー、プロパティ、変数、またはフィールドインスタンスです。
  • エンティティは、基本クラスまたは拡張クラスのオブジェクトまたはインスタンスです

エンティティの詳細


へえ-このおかげで...私がこれを必要としたのは私のComputer Science Capstoneクラスからほぼ1年になります-しかし、私は結局あなたの解決策に似たことをしました:)
Jack

4
私は古い質問に潜んでいることを知っていますが、Googleに同じ質問をしているのを見つけました。私はあなたよりも自分自身(および他の志を同じくするGoogle社員)のために答えました:)
tmsimont 2013年

3

私はこれを理解しようとかなりの時間を費やしました。私はモデルモジュール(https://drupal.org/project/model)に基づくプロジェクトに取り組んでいます。私のインストールスクリプトでは、バンドルを作成したいと思いました。「デフォルトのノードバンドルを調べる」の回答にあるEntity APIの例のコードサンプルは近いですが、完全に正しくはありません(それは私には適していませんでした)。

次のスニペットが機能するはずです。

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

field_info_bundlesは、バンドルが存在するかどうかを確認します(2度作成しないでください)。これは、project_typeエンティティ用に作成されたバンドルの情報を取得します。

バンドルが存在しない場合は、次にバンドルを作成できます。

まず、コントローラーを作成してから、作成するバンドルのオプションを含むパラメーター配列を作成します。次に、コントローラーを使用してバンドルオブジェクトを作成します(これにより、すべての「標準」エンティティフィールドとメソッドを含むPHPオブジェクトが作成され、パラメーターがオブジェクトに追加されます。次に、コントローラーを使用してバンドルを保存します。この最後の部分は持続しますデータベース内のバンドル。

これがお役に立てば幸いです。


2

私はそのようなことをやろうとしており、新しいタイプのコンテンツを作成すると、ノードエンティティの新しいバンドルが作成され、「body」フィールドが追加されるため、Nodeモジュールにはすでにコードが含まれているようですデフォルトで(フィールドAPIを使用して)。これらすべての操作とフォーム(バンドルのテーブル、バンドルのCRUDなど)は手動で作成されます。

Drupal開発者のおかげで、Nodeモジュールに含まれているコードをコピーできます。

後でエンティティを視覚的に作成するためのdrupalモジュールとしてバンドルとそのバンドルの階層を公開できると思います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.