web-dev-qa-db-ja.com

コードでパネル表示を読み込む

データベースからパネルディスプレイをロードするには、 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.

パネルディスプレイが機能にエクスポートされ、コードベースのストレージを使用している場合、パネルディスプレイをコードにロードするにはどうすればよいですか?

3
David Thomas

次のようなさまざまなアプローチを試した後:

$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);
}
1
David Thomas

テーブルとそのエクスポートされたデータセットの関係は、テーブルのスキーマ定義の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()内で宣言する必要があります。

1
Fabian Iwand