EC-CUBE3.0.14
商品一覧ページをカスタマイズしているうちに表示件数と並び順が動作しなくなりました。
選択して画面遷移しても、未選択の状態に戻ってしまいます。
クリーンインストールしたときのサイトとファイルや動作を比較していたところ、並び順を選択したときに遷移するURLのGETパラメーターが異なることがわかりました。
■変更前
/products/list?mode=&category_id=&name=&pageno=1&disp_number=8&orderby=2&owner_id=
■変更後
/products/list?name=
変更後のファイルをデバッグしてみたところ、確かに遷移後の $request に orderby が存在しないことを確認しました。
しかし、遷移前に GET パラメーターを設定している仕組みがわからず調査が行き詰まっています。
どうすれば GET パラメーターに orderby を指定できるのでしょうか?
app/template/default/Product/list.twig
{% block javascript %}
<script>
// 並び順を変更
function fnChangeOrderBy(orderby) { // ★この関数が呼ばれていることを確認
eccube.setValue('orderby', orderby);
eccube.setValue('pageno', 1);
eccube.submitForm();
}
// 表示件数を変更
function fnChangeDispNumber(dispNumber) {
eccube.setValue('disp_number', dispNumber);
eccube.setValue('pageno', 1);
eccube.submitForm();
}
</script>
{% endblock %}
...
<form name="page_navi_top" id="page_navi_top" action="?">
{% if pagination.totalItemCount > 0 %}
<p>{{ pagination.totalItemCount }}件の商品が見つかりました。</p>
<div class="cat_result_nav">
{{ form_widget(disp_number_form, {'id': '', 'attr': {'onchange': "java script:fnChangeDispNumber(this.value);"}}) }}
{{ form_widget(order_by_form, {'id': '', 'attr': {'onchange': "java script:fnChangeOrderBy(this.value);"}}) }}
</div>
{% else %}
<p>お探しの商品は見つかりませんでした。</p>
{% endif %}
</form>
src/Eccube/Controller/ProductController.php
public function index(Application $app, Request $request)
{
$BaseInfo = $app['eccube.repository.base_info']->get();
// Doctrine SQLFilter
if ($BaseInfo->getNostockHidden() === Constant::ENABLED) {
$app['orm.em']->getFilters()->enable('nostock_hidden');
}
// handleRequestは空のqueryの場合は無視するため
if ($request->getMethod() === 'GET') {
$request->query->set('pageno', $request->query->get('pageno', ''));
}
// searchForm
/* @var $builder \Symfony\Component\Form\FormBuilderInterface */
$builder = $app['form.factory']->createNamedBuilder('', 'search_product');
$builder->setAttribute('freeze', true);
$builder->setAttribute('freeze_display_text', false);
if ($request->getMethod() === 'GET') {
$builder->setMethod('GET');
}
/* @var $searchForm \Symfony\Component\Form\FormInterface */
$searchForm = $builder->getForm();
$searchForm->handleRequest($request); // ★$request 内の orderby の値が空であることを確認
// paginator
$searchData = $searchForm->getData();
$qb = $app['eccube.repository.product']->getQueryBuilderBySearchData($searchData);
...
----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。