記事を公開する前に表示を確認する事ができる機能。管理画面にログインしている事が前提となる。
GETでURLを参照する事により、保存済みのDBデータを参照して未公開の記事を確認する事ができる。
現在、編集中の内容をPOST送信すると、そのデータを利用して記事を確認する事ができる。
現在、編集中の下書きの内容をPOST送信し、そのデータを利用して記事を確認することができる。
エイリアス元の未公開の記事を確認する事ができる。
プレビュー実行時にはURLのクエリストリングに preview
を入れる必要があり、初期状態では、default
となっている。
プレビューモードは、コンテンツごとに定義する事ができ、モードによって、プレビュー実行時の処理内容を振り分ける事に利用できる。
# URL例:default モード
https://localhost/baser/admin/baser-core/preview/view?
url=https://localhost/service/service1&
preview=default
# URL例:draft モード
https://localhost/baser/admin/baser-core/preview/view?
url=https://localhost/service/service1&
preview=draft
# URL例:alias モード
https://localhost/baser/admin/baser-core/preview/view?
url=https://localhost/service/service1&
preview=alias
CKEditorを利用する場合、本稿モード、草稿モードの切り替えに応じて <hidden id="ContentPreviewMode" />
にプレビューモードが設定される。(default or draft)
上記 hidden タグの id は、 $this->BcAdminForm->ckeditor()
のオプション、editorPreviewModeId
で変更が可能となっており、複数フィールド配置する場合に、id を変更して対応する。
$request->getQuery('preview')
でモードを取得し、モードに応じて表示に利用するデータを切り替えます。
// 例
$postArray = $request->getData();
if ($request->getQuery('preview') === 'draft') {
$postArray['detail'] = $postArray['detail_draft'];
}
プレビュー時に実行する PreviewController
は、次の処理を行う。
url
をルーティングにより解析してコントローラーとアクション決定ルーティングにより決定したコントローラーとアクションによって、サービスクラスの呼び出しとメソッドの実行を行う。
サービスクラスとメソッドは次の命名規則に則ったものが存在すれば実行し、なければ何もしない。
# サービスクラスとアクション名
{ControllerName}FrontService::setupPreviewFor{ActionName}()
# 例)PagesController の view アクション場合
PagesFrontService::setupPreviewForView()
# その場合のテンプレート
templates/Pages/view.php
このメソッドでは引数としてコントローラーを受け取るので、テンプレートの値のセットや、テンプレートの変更などを行うことができる。
また、$controller->getRequest() では、プレビュー対象のURLに基づいたリクエスト情報を受け取る事ができる。
// 例)
class PagesFrontService
{
public function setupPreviewForView(Controller $controller)
{
$request = $controller->getRequest();
$content = $request->getAttribute('currentContent');
// DBのデータを取得
$page = $this->get($content->entity_id);
// POSTデータによって書き換える
$page = $this->Pages->patchEntity($page, $request->getData());
// Viewにセット
$controller->set([
'page' => $page
]);
// テンプレートの変更
$controller->viewBuilder()->setTemplate('etc');
}
}
コンテンツ管理にて管理するコンテンツを開発する場合、BcAdminContentsComponent
をロードする事で、保存ボタンの左に自動でプレビューボタンを自動配置する仕様となっています。
その際、プレビューボタンをクリックした場合の遷移先は、PreviewController
を利用するURLになっています。
Dom の id ContentPreviewMode
の hidden タグの value 値をプレビューモードとして送信する仕様となっていますので、変更する場合は、Javascript等で送信前に切り替えておきます。
// JQueryの場合
$("#ContentPreviewMode").val('draft');
管理画面でログイン状態である、かつ、クエリストリング preview
に何かしらの文字列が設定されていると、非公開状態のコンテンツでもルーティングが成功する仕様となっています。