app/Plugin/VeriTrans4G2/Form/Type/Admin/PluginConfigType.php line 30

Open in your IDE?
  1. <?php
  2. /*
  3.  * Copyright (c) 2018 VeriTrans Inc., a Digital Garage company. All rights reserved.
  4.  * http://www.veritrans.co.jp/
  5.  */
  6. namespace Plugin\VeriTrans4G2\Form\Type\Admin;
  7. use Eccube\Common\Constant;
  8. use Eccube\Common\EccubeConfig;
  9. use Eccube\Form\Validator\Email;
  10. use Plugin\VeriTrans4G2\Form\Constraint\ContainsPushUrl;
  11. use Plugin\VeriTrans4G2\Form\Constraint\ContainsRecaptcha;
  12. use Symfony\Component\Form\AbstractType;
  13. use Symfony\Component\Form\Extension\Core\Type\TextType;
  14. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  15. use Symfony\Component\Form\FormBuilderInterface;
  16. use Symfony\Component\Validator\Constraints\Length;
  17. use Symfony\Component\Validator\Constraints\NotBlank;
  18. use Symfony\Component\Validator\Constraints\Range;
  19. use Symfony\Component\Validator\Constraints\Regex;
  20. use Symfony\Component\Form\Extension\Core\Type\EmailType;
  21. use Plugin\VeriTrans4G2\Form\Constraint\ContainsUsedMailFlg;
  22. use Plugin\VeriTrans4G2\Service\UtilService;
  23. use Symfony\Component\Validator\Constraints\Callback;
  24. use Symfony\Component\Validator\Context\ExecutionContextInterface;
  25. /**
  26.  * プラグイン設定画面用フォームクラス
  27.  */
  28. class PluginConfigType extends AbstractType
  29. {
  30.     /**
  31.      * VT用固定値配列
  32.      */
  33.     private $eccubeConfig;
  34.     /**
  35.      * ユーティリティサービス
  36.      */
  37.     private $util;
  38.     /**
  39.      * VT用固定値配列
  40.      */
  41.     private $vt4gConst;
  42.     /**
  43.      * コンストラクタ
  44.      * @param UtilService $util
  45.      * @param EccubeConfig $eccubeConfig
  46.      */
  47.     public function __construct(UtilService $utilEccubeConfig $eccubeConfig)
  48.     {
  49.         $this->eccubeConfig $eccubeConfig;
  50.         $this->vt4gConst $this->eccubeConfig->get('vt4g_plugin.const');
  51.         $this->util $util;
  52.     }
  53.     /**
  54.      * フォームを作成します。
  55.      * {@inheritDoc}
  56.      * @see \Symfony\Component\Form\AbstractType::buildForm()
  57.      */
  58.     public function buildForm(FormBuilderInterface $builder, array $options)
  59.     {
  60.         $savedData $this->util->getPluginSetting();
  61.         $isVt $this->vt4gConst['VT4G_PLUGIN_MODE'] === 'vt';
  62.         $paymentTypeList $isVt
  63.                         ? [
  64.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_10'] => $this->vt4gConst['VT4G_PAYTYPEID_CREDIT'],
  65.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_20'] => $this->vt4gConst['VT4G_PAYTYPEID_CVS'],
  66.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_30'] => $this->vt4gConst['VT4G_PAYTYPEID_BANK'],
  67.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_31'] => $this->vt4gConst['VT4G_PAYTYPEID_ATM'],
  68.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_40'] => $this->vt4gConst['VT4G_PAYTYPEID_UPOP'],
  69.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_50'] => $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY'],
  70.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_60'] => $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN'],
  71.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_63'] => $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2'],
  72.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_62'] => $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY'],
  73.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_70'] => $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL'],
  74.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_80'] => $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY'],
  75.                         ]
  76.                         : [
  77.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_10'] => $this->vt4gConst['VT4G_PAYTYPEID_CREDIT'],
  78.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_20'] => $this->vt4gConst['VT4G_PAYTYPEID_CVS'],
  79.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_30'] => $this->vt4gConst['VT4G_PAYTYPEID_BANK'],
  80.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_31'] => $this->vt4gConst['VT4G_PAYTYPEID_ATM'],
  81.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_40'] => $this->vt4gConst['VT4G_PAYTYPEID_UPOP'],
  82.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_50'] => $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY'],
  83.                             $this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_70'] => $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL'],
  84.                         ];
  85.         $builder
  86.             ->add('merchant_ccid'TextType::class, [
  87.                 'constraints' => [
  88.                     new NotBlank([
  89.                         'message' => 'vt4g_plugin.validate.not_blank'
  90.                     ]),
  91.                     new Length(
  92.                         [
  93.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_CCID"]
  94.                         ]
  95.                     ),
  96.                     new Regex([
  97.                         'pattern' => '/^[[:alnum:]]+$/i',
  98.                         'message' => 'vt4g_plugin.validate.alnum',
  99.                     ]),
  100.                 ],
  101.             ])
  102.             ->add('merchant_pass'TextType::class, [
  103.                 'constraints' => [
  104.                     new NotBlank([
  105.                         'message' => 'vt4g_plugin.validate.not_blank'
  106.                     ]),
  107.                     new Length(
  108.                         [
  109.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_PASS"]
  110.                         ]
  111.                     ),
  112.                     new Regex([
  113.                         'pattern' => '/^[[:alnum:]]+$/i',
  114.                         'message' => 'vt4g_plugin.validate.alnum',
  115.                     ]),
  116.                 ],
  117.             ])
  118.             ->add('merchant_id'TextType::class, [
  119.                 'constraints' => [
  120.                     new Length(
  121.                         [
  122.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_ID"]
  123.                         ]
  124.                     ),
  125.                     new Regex([
  126.                         'pattern' => '/^[[:alnum:]]+$/i',
  127.                         'message' => 'vt4g_plugin.validate.alnum',
  128.                     ]),
  129.                 ],
  130.                 'required' => false,
  131.             ])
  132.             ->add('merchant_hash'TextType::class, [
  133.                 'constraints' => [
  134.                     new Length(
  135.                         [
  136.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_HASH"]
  137.                         ]
  138.                     ),
  139.                     new Regex([
  140.                         'pattern' => '/^[[:alnum:]]+$/i',
  141.                         'message' => 'vt4g_plugin.validate.alnum',
  142.                     ]),
  143.                 ],
  144.                 'required' => false,
  145.             ])
  146.             ->add('token_api_key'TextType::class, [
  147.                 'constraints' => [
  148.                     new NotBlank([
  149.                         'message' => 'vt4g_plugin.validate.not_blank'
  150.                     ]),
  151.                     new Length(
  152.                         [
  153.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["TOKEN_API_KEY"]
  154.                         ]
  155.                     ),
  156.                     new Regex([
  157.                         'pattern' => '/^[[:alnum:]\-]+$/i',
  158.                         'message' => 'vt4g_plugin.validate.alnum.hyphen',
  159.                     ]),
  160.                 ],
  161.             ])
  162.             ->add('vt4g_order_id_prefix'TextType::class, [
  163.                 'constraints' => [
  164.                     new Length(
  165.                         [
  166.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["VT4G_ORDER_ID_PREFIX"]
  167.                         ]
  168.                     ),
  169.                     new Regex([
  170.                         'pattern' => '/^[[:alnum:]_\-]+$/i',
  171.                         'message' => 'vt4g_plugin.validate.alnum.hyphen.underscore',
  172.                     ]),
  173.                 ],
  174.                 'required' => false,
  175.             ])
  176.             ->add('enable_payment_type'ChoiceType::class, [
  177.                 'attr' => [
  178.                     'class' => 'vt4g_from_input_choice',
  179.                 ],
  180.                 'choices' => $paymentTypeList,
  181.                 'constraints' => [
  182.                     new NotBlank([
  183.                         'message' => 'vt4g_plugin.validate.not_blank.choice'
  184.                     ]),
  185.                 ],
  186.                 'expanded' => true,
  187.                 'multiple' => true,
  188.             ])
  189.             ->add('dummy_mode_flg'ChoiceType::class, [
  190.                 'attr' => [
  191.                     'class' => 'vt4g_from_input_choice',
  192.                 ],
  193.                 'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['DUMMY_MODE_FLG'],
  194.                 'data' => $savedData["dummy_mode_flg"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['DUMMY_MODE_FLG'],
  195.                 'constraints' => [
  196.                     new NotBlank([
  197.                         'message' => 'vt4g_plugin.validate.not_blank.choice'
  198.                     ]),
  199.                 ],
  200.                 'expanded' => true,
  201.                 'multiple' => false,
  202.             ])
  203.             ->add('vt4g_email'EmailType::class, [
  204.                 'required' => false,
  205.                 'constraints' => [
  206.                     new Email(nullnull$this->eccubeConfig['eccube_rfc_email_check'] ? 'strict' null),
  207.                 ],
  208.             ])
  209.             ->add('vt4g_shopping_index_rate_limit'ChoiceType::class, [
  210.                 'attr' => [
  211.                     'class' => 'vt4g_from_input_choice',
  212.                 ],
  213.                 'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['COMMON_FLG'],
  214.                 'data' => $savedData["vt4g_shopping_index_rate_limit"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['RATE_LIMIT'],
  215.                 'constraints' => [
  216.                     new NotBlank([
  217.                         'message' => 'vt4g_plugin.validate.not_blank.choice'
  218.                     ]),
  219.                 ],
  220.                 'expanded' => true,
  221.                 'multiple' => false,
  222.                 'disabled' => Constant::VERSION >= $this->vt4gConst['VT4G_ECCUBE_VERSION_THROTTLING'] ? false true,
  223.             ])
  224.             ->add('rollback_time_credit'TextType::class, [
  225.                 'required' => true,
  226.                 'attr' => [
  227.                     'class' => 'vt4g_from_input_text_rollback_time',
  228.                 ],
  229.                 'data' => $savedData["rollback_time_credit"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_60'],
  230.                 'constraints' => $this->getRollbackTimeConstraints(),
  231.             ])
  232.             ->add('rollback_time_cvs'TextType::class, [
  233.                 'required' => true,
  234.                 'attr' => [
  235.                     'class' => 'vt4g_from_input_text_rollback_time',
  236.                 ],
  237.                 'data' => $savedData["rollback_time_cvs"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_480'],
  238.                 'constraints' => $this->getRollbackTimeConstraints(),
  239.             ])
  240.             ->add('rollback_time_bank'TextType::class, [
  241.                 'required' => true,
  242.                 'attr' => [
  243.                     'class' => 'vt4g_from_input_text_rollback_time',
  244.                 ],
  245.                 'data' => $savedData["rollback_time_bank"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_480'],
  246.                 'constraints' => $this->getRollbackTimeConstraints(),
  247.             ])
  248.             ->add('rollback_time_atm'TextType::class, [
  249.                 'required' => true,
  250.                 'attr' => [
  251.                     'class' => 'vt4g_from_input_text_rollback_time',
  252.                 ],
  253.                 'data' => $savedData["rollback_time_atm"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_480'],
  254.                 'constraints' => $this->getRollbackTimeConstraints(),
  255.             ])
  256.             ->add('rollback_time_upop'TextType::class, [
  257.                 'required' => true,
  258.                 'attr' => [
  259.                     'class' => 'vt4g_from_input_text_rollback_time',
  260.                 ],
  261.                 'data' => $savedData["rollback_time_upop"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_60'],
  262.                 'constraints' => $this->getRollbackTimeConstraints(),
  263.             ]);
  264.         if ($isVt) {
  265.             $builder->add('rollback_time_paypay'TextType::class, [
  266.                 'required' => true,
  267.                 'attr' => [
  268.                     'class' => 'vt4g_from_input_text_rollback_time',
  269.                 ],
  270.                 'data' => $savedData["rollback_time_paypay"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_60'],
  271.                 'constraints' => $this->getRollbackTimeConstraints(),
  272.             ]);
  273.         }
  274.         $builder
  275.             ->add('push_url_auto_setting'ChoiceType::class, [
  276.                 'attr' => [
  277.                     'class' => 'vt4g_from_input_choice',
  278.                 ],
  279.                 'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['PUSH_URL_AUTO_SETTING'],
  280.                 'data' => $savedData["push_url_auto_setting"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['PUSH_URL_AUTO_SETTING'],
  281.                 'constraints' => [
  282.                     new NotBlank([
  283.                         'message' => 'vt4g_plugin.validate.not_blank.choice'
  284.                     ]),
  285.                 ],
  286.                 'expanded' => true,
  287.                 'multiple' => false,
  288.             ])
  289.             ->add('manual_push_url'TextType::class, [
  290.                 'constraints' => [
  291.                     new ContainsPushUrl(),
  292.                     new Length(
  293.                         [
  294.                             'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["PUSH_URL"]
  295.                         ]
  296.                     ),
  297.                     new Regex([
  298.                         'pattern' => '@^https?://+($|[a-zA-Z0-9_~=:&\?\.\/-])+$@i',
  299.                         'message' => 'vt4g_plugin.validate.alnum.url',
  300.                     ]),
  301.                 ],
  302.                 'required' => false,
  303.             ])
  304.             ->add('used_mail_flg'ChoiceType::class, [
  305.                 'choices' => array(
  306.                     'メール送信に同意する' => '1',
  307.                 ),
  308.                 'constraints' => [
  309.                     new ContainsUsedMailFlg(),
  310.                 ],
  311.                 'expanded' => true,
  312.                 'multiple' => true,
  313.                 'placeholder' => false,
  314.                 'required' => false,
  315.             ])
  316.             ->add('use_recaptcha'ChoiceType::class, [
  317.                 'attr' => [
  318.                     'class' => 'vt4g_from_input_choice',
  319.                 ],
  320.                 'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['USE_RECAPTCHA'],
  321.                 'data' => $savedData["use_recaptcha"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['USE_RECAPTCHA'],
  322.                 'constraints' => [
  323.                     new NotBlank([
  324.                         'message' => 'vt4g_plugin.validate.not_blank.choice'
  325.                     ]),
  326.                 ],
  327.                 'expanded' => true,
  328.                 'multiple' => false,
  329.                 'required' => true,
  330.             ])
  331.             ->add('recaptcha_site_key'TextType::class, [
  332.                 'constraints' => [
  333.                     new ContainsRecaptcha(),
  334.                 ],
  335.                 'required' => false,
  336.             ])
  337.             ->add('recaptcha_secret_key'TextType::class, [
  338.                 'constraints' => [
  339.                     new ContainsRecaptcha(),
  340.                 ],
  341.                 'required' => false,
  342.             ])
  343.             ->add('recaptcha_threshold'ChoiceType::class, [
  344.                 'choices'  => $this->vt4gConst['VT4G_FORM']['CHOICES']['RECAPTCHA_SCORE'],
  345.                 'choice_attr' => function ($value$key$index) {
  346.                     // 審査なしで使用できる値にスタイルを付与
  347.                     if ($value === '0.1' || $value === '0.3' || $value === '0.7' || $value === '0.9') {
  348.                         return [
  349.                             'style' => 'font-weight: bold; background-color: rgba(255, 255, 0, 0.3);'
  350.                         ];
  351.                     } else {
  352.                         return [];
  353.                     }
  354.                 },
  355.                 'attr' => [
  356.                     'class' => 'vt4g_from_input_choice_recaptcha_threshold',
  357.                 ],
  358.                 'constraints' => [
  359.                     new ContainsRecaptcha(),
  360.                     new Regex(
  361.                         [
  362.                             'pattern' => '/^0\.[0-9]|1\.0$/',
  363.                             'message' => 'vt4g_plugin.validate.recaptcha_threshold',
  364.                         ]
  365.                     ),
  366.                 ],
  367.             ]);
  368.     }
  369.     /**
  370.      * ロールバックまでの時間の制約条件を取得します
  371.      *
  372.      * @return array 制約条件
  373.      */
  374.     private function getRollbackTimeConstraints()
  375.     {
  376.         return [
  377.             new NotBlank(
  378.                 [
  379.                     'message' => 'vt4g_plugin.validate.not_blank'
  380.                 ]
  381.             ),
  382.             new Range(
  383.                 [
  384.                     'min' => $this->vt4gConst['VT4G_FORM']["RANGE"]["MIN"]["ROLLBACK_TIME"],
  385.                     'max' => $this->vt4gConst['VT4G_FORM']["RANGE"]["MAX"]["ROLLBACK_TIME"],
  386.                 ]
  387.             ),
  388.             new Regex(
  389.                 [
  390.                     'pattern' => '/^[0-9]+$/',
  391.                     'message' => 'vt4g_plugin.validate.num',
  392.                 ]
  393.             ),
  394.             new Callback([
  395.                 'callback' => [$this'validateNumericField'],
  396.             ]),
  397.         ];
  398.     }
  399.     /**
  400.      * 数値の入力フィールドのバリデーション
  401.      *
  402.      * @param string $value 入力値
  403.      * @param ExecutionContextInterface $context 検証用コンテキスト
  404.      */
  405.     public function validateNumericField($valueExecutionContextInterface $context)
  406.     {
  407.         // 0から始まる場合はエラーとする
  408.         if (strpos($value'0') === 0) {
  409.             $context->buildViolation(trans('vt4g_plugin.validate.num.zero.not.allowed'))->addViolation();
  410.         }
  411.     }
  412. }