エンティティURIとは何ですか?それらは何に使用されますか?
私が見るすべての答えはのようです hook_entity_info()
URIコールバックで定義するだけですエンティティを定義して、カスタムURIなしで機能させることができるのはなぜですか?カスタムURIの利点は何ですか?それは私たちが利用できる追加のカスタムでクールな機能をテーブルにもたらしますか?
エンティティURIに言及しているWeb上のいくつかの例ですが、私に賢明なままにしないでください: エンティティにURIが必要ですか? 、 カスタムDrupalエンティティの開発 、 path()、uri()、defaultUri()、entity_class_uri、何を使用しますか?
一言で言えば、エンティティURIコールバックをhook_entity_info()
で定義するという面倒な作業が必要なのはなぜですか?
エンティティ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 コントローラーと一緒に使用している場合、コントローラー内。