ECCUBE4 Symfony Twigの書き方、フォームの書き方メモ

#はじめに
個人的なメモです

#Twigファイルを書く
こちらのQiita記事が大変参考になります。
[【PHP】Twigまとめ](https://qiita.com/assa/items/4fef2f3abd95248ed626) リンク

```PHP:hogehoge.twigファイル
{% extends '@admin/default_frame.twig' %}         //継承

{% set menus = ['product', 'product_master'] %}   //menus配列定義

{% block title %} タイトル {% endblock %}           //任意
{% block sub_title %} サブタイトル {% endblock %}   //任意

//CSS Bbootstrap4参照
{% block stylesheet %}
    <link rel="stylesheet" href="{{ asset('assets/css/tempusdominus-bootstrap-4.min.css', 'admin') }}">
{% endblock stylesheet %}

//Js、jQueryを任意に記述するところ
{% block javascript %}
    <script>
       //セレクトボックス選択発火
       $('#hogehoge').change(function() {　    //selectが変更されたとき
          $("#hogehoge").submit();            //form submit実行
       });
    </script>
{% endblock %}

//HTMLコード記述するところ
{% block main %}

 //フォーム記述以外は、だいたい、いつものHTMLの感じ

```

##フォームの表示
```PHP:'なまえ'というインプットテキストのフォームの表示
 //POSTフォーム
     //コントローラーでルーティングしている'admin_hogeroute'にリクエスト
    <form class='' id='' method="post" action="{{ path('admin_hogeroute') }}">
        <div class="">
            <label class="">なまえ</label>
                {{ form_widget(form.name) }}　 //formはcontrollerから返すform変数　　
                {{ form_errors(form.name) }}　 //.nameはそのform変数の中にあるFormType.phpのフォーム部品名
        </div>
    </form>
```
こんなふうに表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/5d5f62f3-70ab-81be-26b0-89288ca76f75.png)


##フォームにHTML属性を追加　attr の書き方
この辺りは公式ドキュにもある程度載っていた
**javascript/jQueryのセレクタに必要になってくるclass名やid名は自動命名されます。**
**どんなid値なのかは、ブラウザ側検証ツールで見てコピペ**してます
textareaとか、selectとか、HTMLオプションは、FormType.phpかTwigのどちらかで設定してます

```PHP:'フォームに属性追加

    <form class='' id='' method="post" action="{{ path('admin_hogeroute') }}">
        <div class="">
            <label class="">なまえ</label>
                {{ form_widget(form.name, { 'attr': {'autocomplete': 'on' }} ) }}
　              {{ form_errors(form.name) }}
        </div>
    </form>
```
```PHP:ブラウザ側コードはこうなっている（検証）
       <div class="">
          <label class="">なまえ</label>
          <input type="text"
                 id="admin_user_name"        //勝手に命名される
                 name="admin_user[name]"     //勝手に命名される
                 autocomplete="on"           //さっきattrで追加したやつ
           />
       </div>   
```

##フォームタイプファイルを準備
```PHP:Customize/Form/Type/Admin/HogeType.php
<?php

namespace Customize\Form\Type\Admin;

use Customize\Entity\Hoge;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class HogeType extends AbstractType
{
    public function __construct()
    {
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [    //nameはEntity.phpの変数名（テーブルカラム）
                                                //この変数名をTwig表示で使う
                'required' => false,            //オプションは公式を参考に..
            ])
      ;
    }
                          //※use 名前空間 を忘れずに!!
```

公式ドキュ：フォーム　https://symfony.com/doc/current/reference/forms/types/form.html


##フォームの例いくつか

```PHP:Customize/Form/Type/Admin/HogeType.php
<?php

namespace Customize\Form\Type\Admin;

use Customize\Entity\Hogetype;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SearchDeckType extends AbstractType
{
    public function __construct()
    {
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

   //IntegerType　input=numberができる

            ->add('id', IntegerType::class, [  //第一引数は保存や呼び出したいレコードカラム　　　　
                'required' => false,            //に対応するEntityファイルの変数名　
                'empty_data' => null,
                'attr' => [
                'min' => 0,
                ]
            ])
```
IntegerType　は　input=number
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/27e05a62-ca28-e56d-8938-c83a4e36a65e.png)

```PHP:

   //ChoiceType  selectbox,radiobottun,checkbox,listboxができる
   //ラジオボタンの例
            ->add('releaseId', ChoiceType::class, [  //第一引数は保存や呼び出したいレコードカラム　
                'choices' => [                       //に対応するEntityファイルの変数名　　　
                    '公開' => false,
                    '非公開' => true
                ],
                'expanded' => true,
                'multiple' => false,
                'required' => false,
                'placeholder' => '未選択'
            ])
```
ChoiceType の　ラジオボタン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/eda8edb1-f5e7-25fa-19fa-f548240d546f.png)


```PHP:
  //DateType  input type="datetime-local"

            ->add('eventDate', DateType::class, [  //第一引数は保存や呼び出したいレコードカラム
                'widget' => 'single_text',        // に対応するEntityファイルの変数名　
                'input' => 'datetime',
                'format' => 'yyyy-MM-dd',
                'placeholder' => ['year' => '----', 'month' => '--', 'day' => '--'],
                'required' => false
            ]);
    }

```
DateType は　input type="datetime-local"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617331/4c61807c-e0d5-8acf-00b9-e3beb6ad6550.png)





#おわりに
ECCUBE4、SymfonyフレームワークについてはRubyOnRailsと違って
参考書や日本語ソースや新しい情報が少ないです
Symfony公式ドキュのが情報網羅性がう～～んな感じ。
現在ネットに公表されている情報が貴重でとても参考になっております。
公表してくださっている先輩エンジニアの方々にお礼申し上げます。