BeginnerEngineerBlog
中の人
中の人

【ECCUBE4】FormTypeを確認するやり方

公開: 2022-02-19 02:31
更新: 2023-04-06 14:49
1568
ECCUBE4.1 symfony4.x FormType メモ
ECCUBE4でFormTypeを確認する方法を紹介します!使い所はあまりないかと思いますが、知っておけばいざという時役に立つかもしれません!

こんにちは!

中の人です!

メモですが、symfomyでformTypeが何のformTypeか判定する方法を紹介します。


準備


まずformTypeを確認するため、例として管理者用のログイン画面を表示するControllerをCustomizeディレクトリに作成します。

📁 app\Customize\Controller\Admin\AdminController.php

<?php

namespace Customize\Controller\Admin;

use Eccube\Controller\AbstractController;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Eccube\Form\Type\Admin\LoginType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

class AdminController extends AbstractController
{
    private $authorizationChecker;

    private $helper;

    public function __construct(
        AuthorizationCheckerInterface $authorizationChecker,
        AuthenticationUtils $helper
    )
    {
        $this->authorizationChecker = $authorizationChecker;
        $this->helper = $helper;
    }

    /**
     * @Route("/%eccube_admin_route%/login", name="admin_login", methods={"GET", "POST"})
     * @Template("@admin/login.twig")
     */
    public function login(Request $request)
    {
        if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
            return $this->redirectToRoute('admin_homepage');
        }

        /* @var $form \Symfony\Component\Form\FormInterface */
        $builder = $this->formFactory->createNamedBuilder('', LoginType::class);

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

        $form = $builder->getForm();

        return [
            'error' => $this->helper->getLastAuthenticationError(),
            'form' => $form->createView(),
        ];
    }
}

src/Eccube/Controller/Admin/AdminController.phpのloginアクションをコピペします。

で、まず一旦、このままの状態で管理者用ログイン画面を見てみましょう。


はい、こんな感じですね。

ではformTypeを確認していきます。


FromTypeを確認する方法


// ~~ 省略
public function login(Request $request)
{
    if ($this->authorizationChecker->isGranted('ROLE_ADMIN')) {
        return $this->redirectToRoute('admin_homepage');
    }

    /* @var $form \Symfony\Component\Form\FormInterface */
    $builder = $this->formFactory->createNamedBuilder('', LoginType::class); // 👈 こいつ
// ~~ 省略

管理者用ログイン画面に使用されているformTypeは

use Eccube\Form\Type\Admin\LoginType;

が使用されています。

一旦このTypeにどの様なformTypeが設定されているか見てみます。

📁 src/Eccube/Form/Type/Admin/LoginType.php

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Eccube\Form\Type\Admin;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;

class LoginType extends AbstractType
{
    /**
     * @var SessionInterface
     */
    protected $session;

    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('login_id', TextType::class, [
            'attr' => [
                'maxlength' => 50,
            ],
            'constraints' => [
                new Assert\NotBlank(),
            ],
            'data' => $this->session->get('_security.last_username'),
        ]);
        $builder->add('password', PasswordType::class, [
            'attr' => [
                'maxlength' => 50,
            ],
            'constraints' => [
                new Assert\NotBlank(),
            ],
        ]);
    }

    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'csrf_protection' => false,
        ]);
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'admin_login';
    }
}


public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('login_id', TextType::class, [
        'attr' => [
            'maxlength' => 50,
        ],
        'constraints' => [
            new Assert\NotBlank(),
        ],
        'data' => $this->session->get('_security.last_username'),
    ]);
    $builder->add('password', PasswordType::class, [
        'attr' => [
            'maxlength' => 50,
        ],
        'constraints' => [
            new Assert\NotBlank(),
        ],
    ]);
}

login_idフォームがTextType
passwordがPasswordType
みたいですね。

ということで、それぞれformTypeを確認してみます。

先ほど作成したAdminControllerへ以下を追加して確認します。

// ~~ 省略
use Symfony\Component\Form\Extension\Core\Type\PasswordType; 👈 追加
use Symfony\Component\Form\Extension\Core\Type\TextType; 👈 追加

// ~~ 省略

$this->eventDispatcher->dispatch(EccubeEvents::ADMIN_ADMIM_LOGIN_INITIALIZE, $event);

$form = $builder->getForm();

// 👇 ここから
$login_id_form_type = $form->get('login_id')->getConfig()->getType()->getInnerType();
$password_form_type = $form->get('password')->getConfig()->getType()->getInnerType();
if ($login_id_form_type instanceof TextType) {
    echo 'こんにちお';
}
if ($password_form_type instanceof PasswordType) {
    echo 'こんばんお';
}
// 👆 ここまで追加

return [
    'error' => $this->helper->getLastAuthenticationError(),
    'form' => $form->createView(),
];

// ~~ 省略


この実行結果は以下になります。


左上に
  • こんにちお
  • こんばんお

が表示されてますね!

ということでFormTypeを確認する方法の紹介を終わります!


終わりに


まぁ、これだけの内容ですが、ECCUBE4系でプラグインを作っている時、

  • このFromTypeのときはこんな処理をしたい!

て思って色々調べてようやくわかった内容なんですよね。。

誰かの参考になれば幸いです!

ではまた!
0
0
0
0
通信エラーが発生しました。
【広告】
似たような記事