管理画面でカスタムフィールドのソート

binbin > 管理画面でカスタムフィールドのソート @ 2018/12/4 20:05
プラグインのイベントで、BlogPostを拡張してカスタムフィールドを追加しました。
DBテーブルも追加しました。

同じくイベントで追加したカスタムフィールドを、管理画面のブログ記事一覧で表示させることはできたのですが、
このカスタムフィールドを、既にあるpaginetorのソートで、並び替えしたいのですが、できますでしょうか?


(添付画像にはカスタムフィールが表示されていませんが、)
basercmsの管理画面で最初からあるソート機能、テーブルのヘッダ部分に緑色のテキストをクリックすると並び替わる機能に、
別モデルのカスタムフィールドを追加して、それもソートさせたいのです。

さて、これはどうやって実装しようかと悩みまして、

1,イベントで割り込ませる
2,そもそも、それ用に管理画面を作ってしまう。

Blog.BlogPosts.beforeRender
この辺のイベントにpaginatorを割り込ませれば、できるのかなーと思ったり、
無理そうなら、それ用に管理画面作ってしまおうかなーと思ったり、なにか良い方法は無いかなーと探しております。
なにか、それっぽいことをやったことがありましたら、なにかヒントだけでもお願いいたします。

seto > Re: 管理画面でカスタムフィールドのソート @ 2018/12/5 13:27
こんにちは

ブログ記事一覧ページの縦の列に、追加したテーブルの項目の表示ができたものの、ソート機能が動作しないということでよろしかったでしょうか。

私の方で試した流れを書いてみますね。

------------------------------------------------------------------------
- Blog.BlogPost.beforeFindで、追加したテーブルとblogPostsをhasOneで紐づけ
- 一覧ページのビューに手を入れて項目を追加

-> 追加した項目のページネーションが動かない
------------------------------------------------------------------------

原因を調べると、BlogPostsControllerのadmin_index内でpaginate関数が実行される前に、アソシエーションを追加しないといけないのですが、beforeFindだとタイミングが遅すぎるということがわかりました。

そこで、もっと前の段階でアソシエーションを貼るとソート機能が動作しました。
私はControllerEventListenerのinitializeで確認しましたが、admin_index内で発火しているsearchIndexというイベントの方を使ったほうがいいかもしれません。

また、表示側の調整も、今回は確認のためにコアのビューを書き換えたのですが、以下のファイル内でShowHeadやShowRowというイベントが存在しているようなので、これを使うといい感じにプラグインからブログ記事一覧ページの表示に干渉できるかと思います。
lib/Baser/Plugin/Blog/View/Elements/admin/blog_posts/index_list.php
lib/Baser/Plugin/Blog/View/Elements/admin/blog_posts/index_row.php

<?php echo $this->BcListTable->dispatchShowHead() ?>
<?php echo $this->BcListTable->dispatchShowRow($data) ?>

binbin > Re: 管理画面でカスタムフィールドのソート @ 2018/12/5 16:42
setoさん

返信ありがとうございます!
おかげさまで、なんとかできました!

読み込む順番はまったく考えてませんでした。
beforeFindだと遅かったんですね、、、
ありがとうございます!!


以下、ちょっとハマったところ。

Blog.BlogPosts.searchIndex
ControllerEventListenerにこのイベントを書いてみたんですが、発火できませんでした。
しょうがないので、initializeに書いて、
if($Controller->BlogPost) で振り分けしして、動作しました。

$this->Paginator->sort('customField', 'title' , ['escape' => false, 'class' => 'btn-direction', 'model' => 'pluginName.ModelName']);

次に、Viewでこんな書き方をしてたんですが、これは動作しませんでした。

$this->Paginator->sort('ModelName.customField', 'title' , ['escape' => false, 'class' => 'btn-direction');

optionのmodelを消して、keyの部分にモデルを繋げることで動作できました。

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
35 人のユーザが現在オンラインです。 (32 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 35