web-dev-qa-db-ja.com

エンティティURIとは何ですか?

エンティティURIとは何ですか?それらは何に使用されますか?

私が見るすべての答えはのようです hook_entity_info() URIコールバックで定義するだけですエンティティを定義して、カスタムURIなしで機能させることができるのはなぜですか?カスタムURIの利点は何ですか?それは私たちが利用できる追加のカスタムでクールな機能をテーブルにもたらしますか?

エンティティURIに言及しているWeb上のいくつかの例ですが、私に賢明なままにしないでください: エンティティにURIが必要ですか?カスタムDrupalエンティティの開発path()、uri()、defaultUri()、entity_class_uri、何を使用しますか?

一言で言えば、エンティティURIコールバックをhook_entity_info()で定義するという面倒な作業が必要なのはなぜですか?

3
amateur barista

エンティティURIコールバックを定義する手間がかかるのはなぜですか?

他のモジュールがエンティティのURIをオーバーライドしたり、デフォルトのURIを提供したりできるようにするため。

たとえば、student moduleによって定義されたstudentエンティティがあります。エンティティURIはstudent /%studentであり、次のフックから定義されます。

_/**
 * Implements hook_entity_info().
 */
function student_entity_info() {
  $return = array(
    'student' => array(
      'label' => t('Student'),
      ...
      'uri callback' => 'student_uri',
      ...
    ),
  );
  return $return;
}

/**
 * Entity uri callback: gives modules a chance to specify a path for a student.
 */
function student_uri($student) {
  return array(
    'path' => 'student/' . $student->student_id,
  );
}
_

ここで、別のモジュールstudent_specialがあり、studentオブジェクトのプロパティに応じて異なるURIを提供するとします。 hook_entity_info_alter() を実装することで、URIをオーバーライドできます。

_/**
 * Implements hook_entity_info_alter().
 */
function student_special_entity_info_alter(&$entity_info) {
  // Add a URI callback to the student entity.
  $entity_info['student']['uri callback'] = 'student_special_uri';
}

/**
 * Entity uri callback: points to a unique URI if the given student is awesome.
 */
function student_special_uri($student) {
  // First look for a return value in the default entity uri callback.
  $default_uri = student_uri($student);

  if ($student->is_awesome) {
    return array(
      'path' => 'awesome-student/' . $student->student_id,
    );
  }
  return $default_uri;
}
_

次に、リンクの作成や、学生エンティティのビューページへのユーザーのリダイレクトなど、さまざまな目的で学生URIを使用できます。たとえば、フォームを送信した後で、新しく作成した生徒にユーザーをリダイレクトする場合などです。

_/**
 * Submit handler for the student create/edit form.
 */
function student_form_submit($form, &$form_state) {

  ...

  // Save the student entity.
  student_save($student);

  // Redirect the user to the student URI.
  $student_uri = entity_uri('student', $student);
  $form_state['redirect'] = $student_uri['path'];
  drupal_set_message(t('Student %title saved.', array('%title' => entity_label('student', $student))));
}
_

これにより、特にデフォルトのURIをオーバーライドするモジュールがある場合は特に、正しいURIを取得できます。

それは私たちが利用できる追加のカスタムでクールな機能をテーブルにもたらしますか?

悲しいかな、虹の終わりには幸運のお守りはありません。 @ googletorp の言及のように、URIを機能させるにはメニューコールバックを定義する必要があります。そうでない場合、URIは既存のDrupalにマップされない文字列です。メニューのコールバック。

カスタムエンティティURIをメニューコールバック項目にマッピングするには、2つの方法があります。標準の hook_menu() の実装による方法と、hook_menu()メソッドのオーバーライドによる方法です。 Entity API をカスタム admin ui コントローラーと一緒に使用している場合、コントローラー内。

9
angheloko