【EC-CUBE 4】ページ管理のページの並び順を入れ替えるカスタマイズ

EC-CUBE4の管理画面「コンテンツ管理 → ページ管理」では、ページの並び順を変更する機能が標準では備わっていません。多数の固定ページを管理する際、任意の順序でページを整理できると、作業効率が向上します。この記事では、独自の「並び順(sort_no)」カラムを追加し、管理画面でページの順序を自由に設定できるようにするカスタマイズ方法を紹介します。

▼▼▼カスタマイズ(順番入れ替え)後▼▼▼

【動作環境】
EC CUBEのバージョン:4.3.0
サーバー:XServer

目次

カスタマイズの手順

カスタマイズの流れは以下の通りです。

  1. Page エンティティにsort_noカラムを追加する
  2. PageRepository を拡張し、sort_noの昇順でページを取得するメソッドを作成する
  3. 管理画面の PageController をオーバーライドして、ページ一覧をカスタム取得メソッドで表示する

これで管理画面上のページ一覧が「sort_no」によって並び替えられるようになります。

STEP

Pageエンティティに sort_no カラムを追加

既存テーブルの拡張は、まず対象テーブルに対応するエンティティを拡張するための「Traitファイル」を作成します。(既存テーブルの拡張方法については こちらの記事 にて解説しています)

今回は dtb_page を拡張(sort_noカラムを追加)するので、Customize/Entity/PageTrait.php(以下)を作成します。

<?php

namespace Customize\Entity;

use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation\EntityExtension;

/**
 * 拡張したいエンティティ(ここでは「Page」エンティティ)を指定。
 * 
 * @EntityExtension("Eccube\Entity\Page")
 */
trait PageTrait
{
  /**
   * 表示順を管理するカラム。
   *
   * @var int
   * @ORM\Column(name="sort_no", type="integer", nullable=false, options={"default" : 0})
   */
  private $sort_no = 0;


    /**
     * setメソッドで$sort_noを保存できるようにする。
     * 値が設定されなかった場合、0に設定される。
     * 
     * @param int $sort_no
     * 
     * @return $this
     */
    public function setSortNo(int $sort_no = 0): self
    {
      $this->sort_no = $sort_no;

      return $this;
    }

    /**
     * getメソッドで$sort_noを取り出せるようにする。
     * 値が設定されていない場合、0を返す。
     * 
     * @return int
     */
    public function getSortNo()
    {
      return $this->sort_no;
    }
}
Traitファイルの基本構成
  • 拡張したいエンティティを指定する
  • 新しいプロパティの宣言
  • データを保存するための「setメソッド」を作成
  • データを取り出すための「getメソッド」を作成

Traitファイルがアップできたら、サーバーにSSH接続して以下コマンドを実行していきます。

SSH接続方法(XServer)

もしレンタルサーバーのXServerを使っていれば、以下記事でSSH接続方法を解説しています。

Proxyを作成する

ルートディレクトリで以下コマンドを入力し、「app/proxy/…」下にPage.phpを作成します。

bin/console eccube:generate:proxies

成功すれば、「gen -> /home/・・・・・・・・・・/app/proxy/entity/src/Eccube/Entity/Page.php」という文言が表示され、実際にそのディレクトリにPage.phpファイルが作成されます。

PHPのバージョンがパッケージの要件を満たしていない場合、コマンド実行時にエラーがでます!
Composer detected issues in your platform:
Your Composer dependencies require a PHP version ">= 8.1.0". You are running 7.4.33.

あまりはっきり分かっていませんが、SSH環境のPHPと、Webサーバーで動作するPHPのバージョンにズレがある場合に発生するようです。(このエラーは、SSH環境では7.4.33、Webサーバーでは8.3.10のとき)

この場合、以下のように「/user/bin/php8.3」をコマンドの先頭に置くことで回避できます。

/user/bin/php8.3 bin/console eccube:generate:proxies

SQLを実行し、データベースに反映する

Proxyを作成できたら、引き続きコマンドを使ってデータベースに反映させます。

bin/console cache:clear --no-warmup

作成した Proxy を認識できるよう、キャッシュを削除。

実行すると、
[OK] Cache for the ・・・・・・・ was successfully cleared.
というような文言が表示されます。

bin/console doctrine:schema:update --dump-sql

実行されるSQLを確認するためのコマンド。
このコマンドではSQLは実行されず、あくまで確認用です。

bin/console doctrine:schema:update --dump-sql --force

先程のコマンドに「–force」を付けることで、実際にSQLが実行されます。
このコマンド実行後、問題がなければデータベースが拡張されています。

実際にデータベースを開き、『dtb_page』の最終行にsort_noが追加されていればOKです。

コマンド実行後の『dtb_page』の構造
STEP

PageRepository を拡張し、sort_no の昇順でページを取得するメソッドを作成する

EC-CUBEの標準の PageRepository には、ページを並び替える機能が備わっていません。(ID順に表示されます。)そこで、PageRepository を拡張した CustomPageRepository を新たに作成し、sort_noに基づいてページを並び替えるメソッドgetSortedPageList()を追加します。(Repositoryの拡張については こちらの記事 で解説しています)

PageRepository を拡張した Customize/Repository/CustomPageRepository.php は以下の通りです。

<?php

namespace Customize\Repository;

use Eccube\Repository\PageRepository;

class CustomPageRepository extends PageRepository
{
    /**
     * sort_noでソート(昇順)されたページ一覧を取得
     *
     * @return \Eccube\Entity\Page[]
     */
    public function getSortedPageList()
    {
        return $this->createQueryBuilder('p')
            ->andWhere('p.id <> 0')
            ->andWhere('(p.MasterPage is null OR p.edit_type = :edit_type)')
            ->setParameter('edit_type', \Eccube\Entity\Page::EDIT_TYPE_DEFAULT_CONFIRM)
            ->orderBy('p.sort_no', 'ASC')
            ->addOrderBy('p.id', 'ASC')
            ->getQuery()
            ->getResult();
    }
}

このリポジトリではgetSortedPageList()メソッドを定義しており、STEP 1で追加したsort_noが昇順となるようページを取得します。

STEP

管理画面の PageController をオーバーライドして、ページ一覧をカスタム取得メソッドで表示する

最後に、EC-CUBE標準の PageController で定義されているindex()メソッドをオーバーライドして 、STEP 2 で定義したgetSortedPageList()メソッドを使ってページ一覧を取得するように変更します。

以下が新たに作成した Customize/Controller/Admin/Content/PageController.php です。

<?php

namespace Customize\Controller\Admin\Content;

use Eccube\Controller\AbstractController;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;
use Customize\Repository\CustomPageRepository;

class PageController extends AbstractController
{
    /**
     * @var CustomPageRepository
     */
    protected $customPageRepository;

    /**
     * PageController constructor.
     *
     * @param CustomPageRepository $customPageRepository
     */
    public function __construct(
        CustomPageRepository $customPageRepository
    ) {
        $this->customPageRepository = $customPageRepository;
    }

    /**
     * @Route("/%eccube_admin_route%/content/page", name="admin_content_page", methods={"GET"})
     * @Template("@admin/Content/page.twig")
     */
    public function index(Request $request, RouterInterface $router)
    {
        $Pages = $this->customPageRepository->getSortedPageList();

        $event = new EventArgs(
            [
                'Pages' => $Pages,
            ],
            $request
        );
        $this->eventDispatcher->dispatch($event, EccubeEvents::ADMIN_CONTENT_PAGE_INDEX_COMPLETE);

        return [
            'Pages' => $Pages,
            'router' => $router,
        ];
    }
}
STEP

sort_no を入力 & キャッシュを削除

以上でカスタマイズ完了です。
dtb_page のsort_noを入力してキャッシュを削除し、ページがsort_noの昇順(数字が小さい順)に並び替えられるか確認しましょう。

まとめ & 次のステップ

以上、管理画面 > コンテンツ管理 > ページ管理 で表示されるページ一覧の順番を任意に入れ替える方法について紹介しました。テーブル・リポジトリ・コントローラの拡張に慣れていれば比較的簡単に実装できると思いますが、今回の実装ではテーブルに直接sort_noを入力しなければならないため、管理画面から直接修正できるUIが実装できるとより便利ですね。


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次