it-swarm-ja.com

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

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

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

例:

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

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

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

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

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

何かが足りないのでしょうか、それともそこには機能がありませんか?

6
Jack

デフォルトの検査Node bundles

Nodeモジュールは「記事」と「基本ページ」のバンドル自体を作成しません。いくつかの調査の結果、標準のインストールプロファイルのインストールファイルにこれらのバンドルの定義が見つかりました。

/ 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. ノードには、_node_type_save_で処理するフィールドAPI以外のフィールドが多数含まれています
  4. ノードは_field_attach_create_bundle_を呼び出して、Fieldモジュールに新しいバンドルを通知します

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

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

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

エンティティの詳細

14
tmsimont

私はこれを理解しようとかなりの時間を費やしました。私はモデルモジュール( https://drupal.org/project/model )に基づくプロジェクトに取り組んでいます。私のインストールスクリプトでは、バンドルを作成したいと思いました。 「デフォルトのNode bundles "を調べる」の回答にある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オブジェクトが作成され、オブジェクトにパラメーターが追加されます。次に、コントローラーを使用してバンドルを保存します。この最後の部分は、バンドルをデータベースに永続化します。

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

3
Damien Whaley

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

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

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

2
zaycker