mSearch:MODX Revolutionの検索とフィルター





HabréのMODXブログが完全に構想したものは、少し復活させる必要があります。 最近、ほぼ完全に書き直されて拡張されたコンポーネントを紹介します。



これはmSearchと呼ばれ、当初はロシア語の形態を考慮して最も単純なサイト検索として考案されました。 つまり、Sphinxやその他の本格的なシステムをインストールせずに、あらゆるサイトにシンプルで簡単なソリューションが必要でした。



グーグルの過程でこのタスクのphpMorphyを使用した 興味深い実装に 出会いました 。 さまざまな辞書形式を生成する、インデックス付きのテーブルでの全文検索。 私はこのアイデアが好きで、それが私の基準に合っていて、この方法に基づいて決定を書きました。





mSearch



これはスニペットとプラグインです。 スニペット検索、プラグインは保存時にドキュメントのインデックスを作成します。



通常どおり、4回のクリックでリポジトリからインストールします。 この場合、ロシア語のphpMorphy辞書をダウンロードしてインストールするように求められます。拒否しないでください。



本番サイトに拡張機能をインストールする場合、既存のドキュメントのインデックスを作成する必要があります。 これは単純に行われます:

[[!mSearch?

&indexer=`1`

&offset=`0`

&limit=`200`

]]






最初のパラメーターは、私たちが探しているのではなく、インデックス付けしていることを示し、2番目と3番目は大規模サイトの選択制限です。 多数のドキュメントがあり、サーバーが停止している場合、オフセット値を変更し、この例では最初に0、200、400などのように、いくつかの起動で作業する必要があります。



ドキュメントがある場合、サイトへのインストール後、インデックス作成は1回だけ必要です。 次に、ドキュメントを保存するときにmSearchIndexerプラグインがインデックスを作成します。



スニペットプロパティですべてのmSearchパラメーターを確認できますが、ここでは主なもののみを記述します。



プラグインには、パラメーターindexFields、includeTVs、includeTVList、disablePhpMorphyもあります。 アップグレード中にリソースのインデックスを作成します。

これらのパラメーターはプライマリインデックスにも影響します(&インデクサー= `1`)。



多くのパラメーターは、getResourcesのように誤って呼び出されることはありません。 これは、それらが同じように機能することを意味します。 このスニペットは、getPageを介したページネーション出力を完全にサポートしており、場合によってはgetResourcesを安全に置き換えることができます。



検索はインデックステーブルに基づいており、大量のドキュメントがある場合でも、良好な速度が得られるため、〜6000個を確認しました。



もちろん、この方法は理想的ではなく、関連性があり、すべてがスムーズであるわけではありませんが、いずれにしてもロシア語とMODXのより良い解決策はありません。 私の意見では、主なことは、どこを見るか、どのテンプレートを使用するか、どの親を使用するかなどを指定できることです。 さて、&whereパラメーターを使用すると、検索を完全にカスタマイズできます。



ここから検索できます 。 形態はロシア語でのみ機能することに注意してください。



mSearchの論理的な用途は、店舗の製品を検索し、getResourcesの代わりに見つかった結果を表示することでした。 そしてこれは、見つかった製品を柔軟にフィルタリングするために、mFilterスニペットの記述に進化しました。



mFilter



これは、mSearchの2番目のスニペットです。 登録用のチャンクを使用して、検出された(または事前に指定された)リソースのフィルターを個別に生成します。 デフォルトでは、デジタル値はスライダーとして表示され、テキスト値はチェックボックスとして表示されます。



フィルタは、リソースのTVパラメータ、および/またはminiShop製品のプロパティに従って構築されます。



こんな感じです。



左側にパラメータが表示され、右側に「Sony」というフレーズのデモサイトの検索結果が表示されます。 各パラメーターの近くには数字があります-これは、このパラメーターを選択したときに得られる結果の数です。 つまり、すべてのフィルターオプションがオンザフライで計算され、不可能な組み合わせは無効になります。



Ajaxを介してのみ機能します(たとえば、 jsスクリプトを添付)。 ページがロードされると、必要なすべてのリソースプロパティが選択されてフィルターが構築され、キャッシュされ、フィルターの形式が表示されます。 フォームが変更されるたびに、フォームがサーバーに送信され、フィルタースイッチの結果とステータスが返されます。



非常に高速に動作しますが、実際の大容量ではまだテストされていません。



mFilterの主なパラメーター:



フィルター結果を表示するには、 getPagegetResourcesスニペット 必要です (miniShopを使用している場合-msGetResources)。



jqueryプラグインも必要です。

jQuery 1.7+-メインヘルパー

jQueryUI 1.8+-価格やその他の数値にはスライダーウィジェットのみが必要です

jQuery Form 2.7+-フォームの送信と応答の受信



miniShopストアの特定のカテゴリから製品を撤回するには、getCatIdsスニペットを使用できます。

 if (!empty($_REQUEST['query'])) {return;} $parent = $modx->resource->id; $tmp = $modx->getChildIds($parent); if (empty($tmp)) {return 0;} $tpls = explode(',', $modx->getOption('minishop.goods_tpl')); $q = $modx->newQuery('modResource', array('id:IN' => $tmp, 'template:IN' => $tpls, 'deleted:!=' => 1, 'published' => 1)); $q->select('id'); if ($q->prepare() && $q->stmt->execute()) { $ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0); return implode(',', $ids); }
      
      





呼び出し例:

[[!mFilter?

&resources=`[[!getCatIds]]`

&includeTVs=`1`

&includeTVList=`category,color,size,action`

&includeMS=`1`

&includeMSList=`add2,price`

&tpl=`tpl.msGoods.row`

&templates=`5`

&sortFilters=`tv_category,tv_subcategory,ms_add2,tv_color,tv_size,tv_action,ms_price`

]]








おわりに



すべての設計チャンクと作業用のjsスクリプトが含まれています。 もちろん、最初からすべてを正しく構成できるというのは事実ではありません。このためには、MODX、jQuery、およびAjaxの知識が必要です。 すべての「機能しない!」については、まず、ブラウザコンソールでjavascriptエラーを確認します。



しかし、私は、できる限り、フィルターを構築するタスクを単純化しようとしました。 そして今、特定の欲求で、あなたはあなたのウェブサイト/ストアでそれを行うことができます。



デモサイトの管理パネルで、フィルターと検索がどのように有効になっているかを確認できます。 ログインとパスワード: test



ちなみに
mFilterのすべての作業は、 Simple Dream Web Studioによって注文され、支払われました。



All Articles