LoginSignup
2
1

More than 5 years have passed since last update.

[EC-CUBE4] ヘッダー(Block/header)とフッター(Block/footer)でControllerを使いたい

Posted at

EC-CUBE4のブロックは dtb_block.use_controller の値が false であればControllerなしのTwigだけで動くのですが、 true の場合はControllerが必要です。

そしてデフォルトで存在する ヘッダー(Block/header)フッター(Block/footer)false になっているので、Controllerを使用しておりません。

ヘッダー・フッターでどうしてもControllerを使用したくなった…。

手順

dtb_block.use_controllertrue

ヘッダーは dtb_block.file_nameheader に、フッターは dtb_block.file_namefooter になっております。それらの use_controllertrue にしてあげましょう。

データベース上で直接更新をかけてもいいですが、以下はマイグレーションファイルで実行した例になります。

app/DoctrineMigrations/Version20190422000001.php
<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
use Doctrine\ORM\EntityManager;
use Eccube\Entity\Block;
use Eccube\Repository\BlockRepository;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20190422000001 extends AbstractMigration implements ContainerAwareInterface
{
    /** @var ContainerInterface */
    private $container;

    /** @var EntityManager */
    private $em;

    /** @var BlockRepository */
    private $BlockRepository;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
        $this->em = $this->container->get('doctrine.orm.entity_manager');

        $this->BlockRepository = $this->em->getRepository("Eccube\Entity\Block");
    }

    public function up(Schema $schema) : void
    {
        /** @var Block $HeaderBlock */
        $HeaderBlock = $this->BlockRepository->findOneBy(["file_name" => "header"]);

        /** @var Block $FooterBlock */
        $FooterBlock = $this->BlockRepository->findOneBy(["file_name" => "footer"]);

        if(is_null($HeaderBlock) or is_null($FooterBlock)){
            return;
        }

        // EntityManager準備
        $this->em->beginTransaction();

        // UPDATE dtb_block SET use_controller = true WHERE file_name = 'header';
        $HeaderBlock->setUseController(true);
        $this->em->persist($HeaderBlock);
        $this->em->flush($HeaderBlock);

        // UPDATE dtb_block SET use_controller = true WHERE file_name = 'footer';
        $FooterBlock->setUseController(true);
        $this->em->persist($FooterBlock);
        $this->em->flush($FooterBlock);

        $this->em->commit();
    }

    public function down(Schema $schema) : void { }
}

bin/console doctrine:migrations:migrate

Controllerを準備してあげる

Controllerが準備されていないとエラーになってしまいますので HeaderController , FooterController を準備してあげましょう。

app/Customize/Controller/Block/HeaderController.php
<?php

namespace Customize\Controller\Block;

use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class HeaderController extends AbstractController
{
    /**
     * @Route("/block/header", name="block_header")
     * @Template("Block/header.twig")
     */
    public function index(Request $request)
    {
        return [];
    }
}

app/Customize/Controller/Block/FooterController.php
<?php

namespace Customize\Controller\Block;

use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class FooterController extends AbstractController
{
    /**
     * @Route("/block/footer", name="block_footer")
     * @Template("Block/footer.twig")
     */
    public function index(Request $request)
    {
        return [];
    }
}

以上です。ヘッダー・フッターに値を渡したい場合は return で渡してあげましょう。
それでは。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1