バージョン選択

フォーラム

メニュー

オンライン状況

51 人のユーザが現在オンラインです。 (30 人のユーザが フォーラム を参照しています。)
登録ユーザ: 2
ゲスト: 49
red PRIA もっと...

サイト内検索

質問 > 管理機能 > 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい

管理機能

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
ゲスト
投稿日時: 2020/1/28 19:00
対応状況: −−−
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
なるほど、そういう方法になるんですね・・・。

いろいろ手を動かしてみましたが、ルーティング上書きとしたほうが楽ですし、コードが読みやすいですね。

上書きする方針にしようと思います。決定前に試せてよかったです。
ありがとうございました!
umebius
投稿日時: 2020/1/28 17:20
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
AbstractControllerクラスを継承する必要はなくて、

コンストラクタで$containerを
プロパティに代入しておいて(下記URLのようなイメージで)
$this->container->get('form.factory')->create(SearchNewsType::class)のように、createFormの代わりに使えると思います。

https://github.com/EC-CUBE/ec-cube/blob/4.0.3/src/Eccube/Service/OrderHelper.php#L107


バージョンアップの時に動かなくなる可能性はどちらの方法でもゼロとは言えないので、私はルーティング上書きしてしまうほうが自然な気がして好きですね。
(この画面での検索フォーム挿入は結構強引にやることになると思いますので,,)


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

ゲスト
投稿日時: 2020/1/28 16:14
対応状況: −−−
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
umebius様

お世話になっております。追加で質問させてください。

■質問の概要
・EventクラスでRequestを受け取る方法は?
・Eventクラス内で既存ページに対して新規のフォームを生成する方法は?
・Eventクラス内で新規でQueryBuilderを操作する方法は?

■詳細
新着情報管理ページに新たに検索フォームを生成するには、以下の手順を行えばよいと認識しています。
①EccubeEvents::ADMIN_CONTENT_NEWS_INDEX_INITIALIZEイベントをフックする。
②生成したいFormとクエリの結果をsearch.twig(自分で作ったtwigファイル)に渡す。
③TemplateEventのaddSnippet()メソッドでnews.twig(新着情報管理ページ。EC-CUBE本体のファイル。)の</body>タグ直前に追加し、JQueryで位置を調整する。

それをもとに途中まで書いたEventクラスのコードが次のものです。
引用:

<?php

namespace Plugin\Sample;

use Eccube\Controller\AbstractController;
use Eccube\Event\TemplateEvent;
use Eccube\Repository\Master\PageMaxRepository;
use Eccube\Repository\NewsRepository;
use Knp\Component\Pager\PaginatorInterface;
use Plugin\MSEC_Client\Form\Type\Admin\Content\News\SearchNewsType;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class NewsEvent extends AbstractController implements EventSubscriberInterface
{
  /**
  * @var NewsRepository
  */
  private $newsRepository;

 /**
  * @var PageMaxRepository
  */
 private $pageMaxRepository;

 /**
  * @var PaginatorInterface
  */
 private $paginator;

public function __construct(NewsRepository $newsRepository, PageMaxRepository $pageMaxRepository, PaginatorInterface $paginator)
{
  $this->newsRepository = $newsRepository;
  $this->pageMaxRepository = $pageMaxRepository;
  $this->paginator = $paginator;
}

/**
* @return array
*/
public static function getSubscribedEvents(): array
{
  return [
    '@admin/Content/news.twig' => 'search',
   ];
}

public function search(TemplateEvent $event)
{
   $searchForm = $this->createForm(SearchNewsType::class);

   $twig = '@Sample/admin/Content/News/search.twig';
   $event->addSnippet($twig);
}
}

検索フォームを生成するcreateForm()メソッドを呼ぶため、EventクラスにAbstractControllerクラスを継承させる必要がある、と考えました。
しかし、AbstractControllerクラスを継承させると次のようなエラー出て実行できません。

引用:

Cannot autowire service "Eccube\Event\TemplateEvent": argument "$view" of method "__construct()" has no type-hint, you should configure its value explicitly.


エラーについてはネットで調べたのですが、ヒントになりそうな内容は見つけられませんでした。
Eventクラス内でリクエストを取得し、既存ページに新規フォームを生成し、クエリを新たに発行するにはどうすればよいでしょうか。

やはり、ルーティングを上書きしてまったく新しいページとして開発するほうがよいのでしょうか・・・。
seo368
投稿日時: 2020/1/27 19:32
対応状況: −−−
新米
登録日: 2020/1/27
居住地:
投稿: 1
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
I think this is one of the mosat significant information for me.
And i’m glad reading your article. But want to remark on some general things, The site style
is ideal, the articles is really nice : D. Good job, cheers
<b><a href="http://www.rumahbola.online/" alt="Judi Online">Judi Online</a></b>
<b><a href="http://www.palapaangka.org" alt="Agen Slot Online">Agen Slot Online</a></b>
<b><a href="http://newdatahk.com" alt="Data HK">Data Hk</a></b>
ゲスト
投稿日時: 2020/1/27 19:10
対応状況: −−−
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
いいえ!こちらの説明が足りませんでした。

引用:
Eccube\Controller\Admin\Content\NewsController::indexメソッドでは、 EccubeEvents::ADMIN_CONTENT_NEWS_INDEX_INITIALIZEというイベントが呼ばれますよね? このイベントをフックしてQueryBuilder($qb)を操作してしまう手もありますね。formは$requestから自分で生成してやる必要があります。

そのような方法があるのですね。一旦手を動かして、不明点がでたらまた質問したいと思います。

引用:

ただ、私ならプラグイン内に別のコントローラ作って、indexメソッドのルーティングごとオーバーライドしてしまうかもしれません(^^;

おっしゃるとおりで、検索機能を実装してクエリをいじるとなると上書きしたほうが楽そうに思いますね・・・。EC-CUBE本体のアップデートとの兼ね合いになりそうですが・・。

回答ありがとうございました!
umebius
投稿日時: 2020/1/27 19:01
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
なるほど、少し勘違いしていました。

Eccube\Controller\Admin\Content\NewsController::indexメソッドでは、
EccubeEvents::ADMIN_CONTENT_NEWS_INDEX_INITIALIZEというイベントが呼ばれますよね?

このイベントをフックしてQueryBuilder($qb)を操作してしまう手もありますね。formは$requestから自分で生成してやる必要があります。

画面にも検索フォームを渡さないといけないので、TemplateEventでもformを生成してtwigに渡してやる必要があります。
-------

ただ、私ならプラグイン内に別のコントローラ作って、indexメソッドのルーティングごとオーバーライドしてしまうかもしれません(^^;


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

ゲスト
投稿日時: 2020/1/27 18:58
対応状況: −−−
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
umebius様の記事では、既存twigにjsファイルを追加するのではなく、jsが書かれたtwigを取り込んでいるんですね。
こちらは調べて手を動かせば自己解決できそうなので、回答いただかなくて大丈夫です。失礼しました。
ゲスト
投稿日時: 2020/1/27 18:50
対応状況: −−−
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
さっそくのご返信、ありがとうございます!
既存検索フォームに項目を追加する方法も、クエリをカスタマイズする方法も、知らなかったので大変参考になります。

■質問①について
まだコードをしっかり読んでいませんが、公式ドキュメントの例も、umebius様の記事も、既存の検索フォームに検索項目を追加する...という例ですよね。
新規の検索フォームも、同様の方法で実装できますか?

頂いた記事から、クエリをカスタマイズすることで検索機能を追加するためには、各Repositoryのなかで$this->queries->customize()メソッドを呼ぶ必要があるのではないかと考えました。
EC-CUBE本体のクラスであるNewsRepositoryでは、それが呼ばれていません。この場合はクエリを変更できない・・・と考えるべきですか?

■質問②について
引用:
これはご指摘の通りで、JavaScriptのコードで要素追加がプラグインでは一般的に用いられます。

こちらについても、ありがとうございます。
Symfony側でHTMLのclass属性名などによって位置を指定する、というような方法は存在せず、JavaScriptで行うのが一般的なのですね。

この場合、twigのファイル名指定などで出力できるのでしょうか?
例えば、取り込みたいtwigファイルが50行あったら、JavaScript内にHTMLをべた書きするよりも、ファイル名指定で出力したいと考えての質問です。
umebius
投稿日時: 2020/1/27 18:09
対応状況: −−−
登録日: 2016/7/22
居住地:
投稿: 2085
Re: 【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
>既存ページ(新着情報管理ページ)には、どうやって検索機能を設けたらよいのでしょうか?

公式ドキュメントのこちらのページが参考になるかと思います。
https://doc4.ec-cube.net/customize_formtype

また、新着ではなく受注一覧ですが、検索項目を追加する方法をご紹介していますので、よろしければ参考にして見てください。
[4系プラグイン開発] たった3ステップで受注一覧へ検索絞り込み条件を追加する方法


>仮に質問①の検索機能を実装できたとして、HTMLの配置位置をピンポイントに指定することは可能ですか?

これはご指摘の通りで、JavaScriptのコードで要素追加がプラグインでは一般的に用いられます。


----------------
EC-CUBEカスタマイズ・高速化・脆弱性対策・SEO ご相談ください。

2系・3系から4系へのバージョンアップ実績豊富

ゲスト
投稿日時: 2020/1/27 18:03
対応状況: 解決済
【EC-CUBE4.0.3】独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設けたい
■質問①
独自プラグインで既存ページ(新着情報管理ページ)に検索機能を設ける方法がわかりません。実装の方針を提示していただけないでしょうか。

開発するにあたり、練習として、
独自プラグインで新規ページを作成し、以下の機能は実装できました。
・ID、名前、コードだけのシンプルなCRUD
・一覧ページでの検索
・一覧ページでのページネーション

既存ページ(新着情報管理ページ)には、どうやって検索機能を設けたらよいのでしょうか?
Eventクラスを作成し、既存ページでイベントが発火されたら〇〇メソッドを呼ぶ、という仕組みなのかなと推測しています。
が、Controllerなどで利用していたcreateForm()メソッドを呼ぶにはTraitをuseする必要がありそうです。このような方法で合っているでしょうか?

■質問②
こちらのページに、
4.0(旧3.n)ドキュメント化に向けた情報や実装の参考にしたい情報
>TemplateEventを利用することで「</body>タグ直前」または「<head></head>内」に出力するコードを追加できます。
>ここにJavaScriptのコードを出力することでUI要素を追加できます。
とありますが、独自プラグインで追加するHTML要素は</body>タグ直前にしか設置できない、
あるいは、特定の位置にHTMLを追加するにはJSで要素を追加する必要がありますか?

仮に質問①の検索機能を実装できたとして、HTMLの配置位置をピンポイントに指定することは可能ですか?

■開発環境
EC-CUBE4 開発者向けドキュメントを参考に、公式のdocker-compose.ymlを用いて開発環境を構築しています。
EC-CUBE github
・EC-CUBE4.0.3
・PHP7.3
・MySQL5.7

以上です。よろしくお願いいたします。
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,668名です
総投稿数は109,924件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2311
5
umebius
2085
6
yuh
1819
7
h_tanaka
1637
8
red
1569
9
mcontact
1276
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.