EC-CUBE4のブロックは dtb_block.use_controller の値が false
であればControllerなしのTwigだけで動くのですが、 true
の場合はControllerが必要です。
そしてデフォルトで存在する ヘッダー(Block/header) と フッター(Block/footer) は false
になっているので、Controllerを使用しておりません。
ヘッダー・フッターでどうしてもControllerを使用したくなった…。
手順
dtb_block.use_controller を true
に
ヘッダーは dtb_block.file_name が header
に、フッターは dtb_block.file_name が footer
になっております。それらの use_controller を true
にしてあげましょう。
データベース上で直接更新をかけてもいいですが、以下はマイグレーションファイルで実行した例になります。
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 で渡してあげましょう。
それでは。