データベースからパネルディスプレイをロードするには、 panels_load_display($did)
を使用できます
ただし、$did
値はデータベースからの自動インクリメント値です。エクスポートされたパネルページの表示には表示されません(機能のエクスポートなど)。
おそらく ctools_export_object_load
を使用して、エクスポートされたパネル表示をロードできると思いました。
ただし、表示がデータベースのpanels_display
テーブルにある場合にのみ結果が返され、エクスポートされたコードストレージ表示では空の空が返されることがわかりました。
例えば:
// Attempt to load Panels display
ctools_include('export');
$uuid = '49c15c71-d5d1-d574-b539-0149f912f925';
$display = ctools_export_load_object('panels_display', 'conditions', array('uuid' => $uuid ));
var_export($display); // empty array if not in DB.
パネルディスプレイが機能にエクスポートされ、コードベースのストレージを使用している場合、パネルディスプレイをコードにロードするにはどうすればよいですか?
次のようなさまざまなアプローチを試した後:
$page = ctools_export_load_object('page_manager_pages', 'names', array('app'));
var_export($page);
// And also
$handler = ctools_export_load_object('page_manager_handlers', 'names', array('page_app__panel_context_7d7ea5ec-d257-43aa-bfe6-a0c25623111d'));
var_export($handler);
パネルディスプレイがコード内にあり、dbに保存されている場合、パネルディスプレイを確実にロードできないことがわかりました。
たぶん別の方法があるかもしれませんが、ctools、パネル、ページマネージャーの迷路の中で、私はより簡単な解決策に終わりました。
ミニパネル!
ページ表示と比較して、プログラムでミニパネルをロードしてレンダリングする方がはるかに簡単です。
$minipanel_name = 'minipanel_machine_name';
// This loads the minipanel, both from DB or from code export.
$minipanel = panels_mini_load($minipanel_name);
// Render the minipanel display
if (empty($minipanel) || empty($minipanel->display)) {
watchdog('module', 'Unable to load minipanel: !name', array('!name' => $minipanel_name));
}else if (!empty($minipanel->display)) {
$display = $minipanel->display;
// Pass data as dynamic args to panel display
// This is optional, but used for this case.
$display->args = array('data' => $data);
$output = panels_render_display($display);
}
テーブルとそのエクスポートされたデータセットの関係は、テーブルのスキーマ定義のexport
キーを介して宣言されます。 _page_manager_pages
_ と _panels_display
_ の両方でそのキーを確認できます。
ctoolsでは、デフォルトのフックを定義することもできます。 nonが指定された場合、 _default_{table}
_ にフォールバックします。
ctools_export_load_object()
を介してエクスポート可能なctoolsをロードする場合、ctoolsはまずテーブルにオブジェクトを照会し、次に デフォルトフックを呼び出す を使用して、コードに格納されているオブジェクトを取得します。
ページマネージャページがエクスポートされるとき、_panels_display
_オブジェクトは独自のフックの下で個別に宣言されず、hook_default_page_manager_pages()
でラップされます。
それらをUUIDで取得するには、hook_default_panels_display()
内で宣言する必要があります。