質問: エンティティページからentity_typeおよびentity_idを取得するにはどうすればよいですか? 一部のページ(パス)は1つのエンティティを表しています。例えば: これらのパスにあるページは1つのノードエンティティを表し、entity_id(nid)はxx: です。 / node/xx / node/xx/delete / node/xx/edit このパスのページは1つの検索サーバーエンティティ(検索apiモジュールで定義)を表し、entity_id(machine_name)は 'apache_solr': です。 / admin/config/search/search_api/server/apache_solr 現在のフックまたは関数が渡さない場合、このエンティティ(idおよびtype)に関する基本データをどのようにロードしますか?現在のエンティティを取得する標準的な方法 明らかに使用するもの menu_get_object($entity_type,$position_of_id_in_url) 。ただし、これはエンティティタイプを1つだけコーディングすることを前提としています。エンティティタイプをプログラムで記述する必要があり、さらに悪いことに、このエンティティが使用するエンティティidのurl位置を調査してハードコーディングする必要があります。 。私がこれまでに見つけた最も近いものは、ページの基になるシステムuri(例:substr(request_uri(),strlen($base_path)))を取得し、次に この提案のようなもの に基づいて怪しいスイッチリストを記述し、推測してからサイトが持つ可能性があると考えられるすべてのエンティティのハードコーディングケース。しかし、それよりももっと良いものがあるに違いない。コアからの一般的な解決策が最善ですが、 ctools (ページマネージャー、コンテキストなど)、 entity api などの一般的なモジュールに依存する回答も受け入れます devel など.私の緊急の必要性は、フィールド化可能なエンティティタイプに(適切な構成とモジュールで)アタッチできるウィジェットの編集フォーム hook_field_widget_form() 内にあります。したがって、一般的な解決策が最善ですが、この関数内またはフォームでのみ機能する狭い答えも受け入れます(エンティティタイプに固有のidおよびデータは$ formに埋め込まれているように見えますが、エンティティにキー入力されています特定の方法で入力するので、$ formから取り出すのは、鶏と卵の問題のようです)。------------編集------------------一部の人々は単純な一般的な問題を理解するのが難しいようです。これは別の使用例です(別の別の関連する問題が私が直面しています)。いくつかのエンティティをリストするビューがあるとします。このビューは、ノードページやユーザープロファイル(またはその両方)などの1つのエンティティを表すことができるページのブロック/ペインとして配置されます。ビューのデータを読み取り、結果を確認するフックが設定されています(foreach $view->result as...)。 hook_views_pre_render であるとしましょう。これは、$ viewオブジェクトだけを持っていることを意味します。ビューの結果行にページと同じエンティティidとエンティティタイプがある場合は、何かを行います(たとえば、行を削除するか、フィールドデータを変更します)。ビューの結果からこのデータを抽出するためのロジックがあるので、必要なのは、生成されているページのentity_typeとentity_idを検索して比較することだけです。そのデータは、drupalのどこかにあります。そうでない場合、drupalは、このビューをロードする必要があることを理解できなかったでしょう。あなたがいるフックまたは関数に渡されないときにそれを取得しますか?
回答: これは役に立ちますか?function entity_by_path($path) { $router_item = menu_get_item($path); $ent_sug_array = array(); foreach ($router_item['map'] as $key => $value) { if(is_object($value) && isset($value->type)) { $ent_sug_array[$key] = $value; } } $ent_sug = false; if(count($ent_sug_array) > 1) { $lf_sug = false; if(isset($router_item['load_functions'])) { if(count($router_item['load_functions']) == 1) { reset($router_item['load_functions']); $lf_sug = key($router_item['load_functions']); } } if($lf_sug !== false) { $ent_sug = is_object($router_item['map'][$lg_sug] && isset($router_item['map'][$lg_sug]->type)) ? $router_item['map'][$lg_sug] : $ent_sug; } } elseif(count($ent_sug_array) == 1) { $ent_sug = reset($ent_sug_array); } if(!empty($ent_sug)) { $bundle = $ent_sug->type; $ent_type = method_exists($ent_sug, 'entitytype') ? $ent_sug->entitytype() : false; //eck case if(empty($ent_type)) { $aclass = get_class($ent_sug); if($aclass == 'stdclass') { //node, user, core entity case if(isset($router_item['load_functions'])) { $lf = reset($router_item['load_functions']); $ei = entity_get_info(); foreach ($ei as $key => $value) { if(empty('load hook')) continue; if($lf == $value['load hook']) { $ent_type = $key; break; } } } }else{ //custom entity case $ent_type = $aclass; } } return array('entity'=>$ent_sug, 'type'=>$ent_type, 'bundle'=>$bundle); } return false; }