<?php
/*
* Copyright (c) 2018 VeriTrans Inc., a Digital Garage company. All rights reserved.
* http://www.veritrans.co.jp/
*/
namespace Plugin\VeriTrans4G2\Form\Type\Admin;
use Eccube\Common\Constant;
use Eccube\Common\EccubeConfig;
use Eccube\Form\Validator\Email;
use Plugin\VeriTrans4G2\Form\Constraint\ContainsPushUrl;
use Plugin\VeriTrans4G2\Form\Constraint\ContainsRecaptcha;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Range;
use Symfony\Component\Validator\Constraints\Regex;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Plugin\VeriTrans4G2\Form\Constraint\ContainsUsedMailFlg;
use Plugin\VeriTrans4G2\Service\UtilService;
use Symfony\Component\Validator\Constraints\Callback;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* プラグイン設定画面用フォームクラス
*/
class PluginConfigType extends AbstractType
{
/**
* VT用固定値配列
*/
private $eccubeConfig;
/**
* ユーティリティサービス
*/
private $util;
/**
* VT用固定値配列
*/
private $vt4gConst;
/**
* コンストラクタ
* @param UtilService $util
* @param EccubeConfig $eccubeConfig
*/
public function __construct(UtilService $util, EccubeConfig $eccubeConfig)
{
$this->eccubeConfig = $eccubeConfig;
$this->vt4gConst = $this->eccubeConfig->get('vt4g_plugin.const');
$this->util = $util;
}
/**
* フォームを作成します。
* {@inheritDoc}
* @see \Symfony\Component\Form\AbstractType::buildForm()
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$savedData = $this->util->getPluginSetting();
$isVt = $this->vt4gConst['VT4G_PLUGIN_MODE'] === 'vt';
$paymentTypeList = $isVt
? [
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_10'] => $this->vt4gConst['VT4G_PAYTYPEID_CREDIT'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_20'] => $this->vt4gConst['VT4G_PAYTYPEID_CVS'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_30'] => $this->vt4gConst['VT4G_PAYTYPEID_BANK'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_31'] => $this->vt4gConst['VT4G_PAYTYPEID_ATM'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_40'] => $this->vt4gConst['VT4G_PAYTYPEID_UPOP'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_50'] => $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_60'] => $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_63'] => $this->vt4gConst['VT4G_PAYTYPEID_RAKUTEN_V2'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_62'] => $this->vt4gConst['VT4G_PAYTYPEID_LINEPAY'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_70'] => $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_80'] => $this->vt4gConst['VT4G_PAYTYPEID_PAYPAY'],
]
: [
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_10'] => $this->vt4gConst['VT4G_PAYTYPEID_CREDIT'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_20'] => $this->vt4gConst['VT4G_PAYTYPEID_CVS'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_30'] => $this->vt4gConst['VT4G_PAYTYPEID_BANK'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_31'] => $this->vt4gConst['VT4G_PAYTYPEID_ATM'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_40'] => $this->vt4gConst['VT4G_PAYTYPEID_UPOP'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_50'] => $this->vt4gConst['VT4G_PAYTYPEID_ALIPAY'],
$this->vt4gConst['VT4G_PAYNAME_PAYTYPEID_70'] => $this->vt4gConst['VT4G_PAYTYPEID_PAYPAL'],
];
$builder
->add('merchant_ccid', TextType::class, [
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank'
]),
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_CCID"]
]
),
new Regex([
'pattern' => '/^[[:alnum:]]+$/i',
'message' => 'vt4g_plugin.validate.alnum',
]),
],
])
->add('merchant_pass', TextType::class, [
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank'
]),
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_PASS"]
]
),
new Regex([
'pattern' => '/^[[:alnum:]]+$/i',
'message' => 'vt4g_plugin.validate.alnum',
]),
],
])
->add('merchant_id', TextType::class, [
'constraints' => [
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_ID"]
]
),
new Regex([
'pattern' => '/^[[:alnum:]]+$/i',
'message' => 'vt4g_plugin.validate.alnum',
]),
],
'required' => false,
])
->add('merchant_hash', TextType::class, [
'constraints' => [
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["MERCHANT_HASH"]
]
),
new Regex([
'pattern' => '/^[[:alnum:]]+$/i',
'message' => 'vt4g_plugin.validate.alnum',
]),
],
'required' => false,
])
->add('token_api_key', TextType::class, [
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank'
]),
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["TOKEN_API_KEY"]
]
),
new Regex([
'pattern' => '/^[[:alnum:]\-]+$/i',
'message' => 'vt4g_plugin.validate.alnum.hyphen',
]),
],
])
->add('vt4g_order_id_prefix', TextType::class, [
'constraints' => [
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["VT4G_ORDER_ID_PREFIX"]
]
),
new Regex([
'pattern' => '/^[[:alnum:]_\-]+$/i',
'message' => 'vt4g_plugin.validate.alnum.hyphen.underscore',
]),
],
'required' => false,
])
->add('enable_payment_type', ChoiceType::class, [
'attr' => [
'class' => 'vt4g_from_input_choice',
],
'choices' => $paymentTypeList,
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank.choice'
]),
],
'expanded' => true,
'multiple' => true,
])
->add('dummy_mode_flg', ChoiceType::class, [
'attr' => [
'class' => 'vt4g_from_input_choice',
],
'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['DUMMY_MODE_FLG'],
'data' => $savedData["dummy_mode_flg"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['DUMMY_MODE_FLG'],
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank.choice'
]),
],
'expanded' => true,
'multiple' => false,
])
->add('vt4g_email', EmailType::class, [
'required' => false,
'constraints' => [
new Email(null, null, $this->eccubeConfig['eccube_rfc_email_check'] ? 'strict' : null),
],
])
->add('vt4g_shopping_index_rate_limit', ChoiceType::class, [
'attr' => [
'class' => 'vt4g_from_input_choice',
],
'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['COMMON_FLG'],
'data' => $savedData["vt4g_shopping_index_rate_limit"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['RATE_LIMIT'],
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank.choice'
]),
],
'expanded' => true,
'multiple' => false,
'disabled' => Constant::VERSION >= $this->vt4gConst['VT4G_ECCUBE_VERSION_THROTTLING'] ? false : true,
])
->add('rollback_time_credit', TextType::class, [
'required' => true,
'attr' => [
'class' => 'vt4g_from_input_text_rollback_time',
],
'data' => $savedData["rollback_time_credit"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_60'],
'constraints' => $this->getRollbackTimeConstraints(),
])
->add('rollback_time_cvs', TextType::class, [
'required' => true,
'attr' => [
'class' => 'vt4g_from_input_text_rollback_time',
],
'data' => $savedData["rollback_time_cvs"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_480'],
'constraints' => $this->getRollbackTimeConstraints(),
])
->add('rollback_time_bank', TextType::class, [
'required' => true,
'attr' => [
'class' => 'vt4g_from_input_text_rollback_time',
],
'data' => $savedData["rollback_time_bank"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_480'],
'constraints' => $this->getRollbackTimeConstraints(),
])
->add('rollback_time_atm', TextType::class, [
'required' => true,
'attr' => [
'class' => 'vt4g_from_input_text_rollback_time',
],
'data' => $savedData["rollback_time_atm"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_480'],
'constraints' => $this->getRollbackTimeConstraints(),
])
->add('rollback_time_upop', TextType::class, [
'required' => true,
'attr' => [
'class' => 'vt4g_from_input_text_rollback_time',
],
'data' => $savedData["rollback_time_upop"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_60'],
'constraints' => $this->getRollbackTimeConstraints(),
]);
if ($isVt) {
$builder->add('rollback_time_paypay', TextType::class, [
'required' => true,
'attr' => [
'class' => 'vt4g_from_input_text_rollback_time',
],
'data' => $savedData["rollback_time_paypay"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['ROLLBACK_TIME']['TIME_60'],
'constraints' => $this->getRollbackTimeConstraints(),
]);
}
$builder
->add('push_url_auto_setting', ChoiceType::class, [
'attr' => [
'class' => 'vt4g_from_input_choice',
],
'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['PUSH_URL_AUTO_SETTING'],
'data' => $savedData["push_url_auto_setting"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['PUSH_URL_AUTO_SETTING'],
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank.choice'
]),
],
'expanded' => true,
'multiple' => false,
])
->add('manual_push_url', TextType::class, [
'constraints' => [
new ContainsPushUrl(),
new Length(
[
'max' => $this->vt4gConst['VT4G_FORM']["LENGTH"]["MAX"]["PUSH_URL"]
]
),
new Regex([
'pattern' => '@^https?://+($|[a-zA-Z0-9_~=:&\?\.\/-])+$@i',
'message' => 'vt4g_plugin.validate.alnum.url',
]),
],
'required' => false,
])
->add('used_mail_flg', ChoiceType::class, [
'choices' => array(
'メール送信に同意する' => '1',
),
'constraints' => [
new ContainsUsedMailFlg(),
],
'expanded' => true,
'multiple' => true,
'placeholder' => false,
'required' => false,
])
->add('use_recaptcha', ChoiceType::class, [
'attr' => [
'class' => 'vt4g_from_input_choice',
],
'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['USE_RECAPTCHA'],
'data' => $savedData["use_recaptcha"] ?? $this->vt4gConst['VT4G_FORM']['DEFAULT']['USE_RECAPTCHA'],
'constraints' => [
new NotBlank([
'message' => 'vt4g_plugin.validate.not_blank.choice'
]),
],
'expanded' => true,
'multiple' => false,
'required' => true,
])
->add('recaptcha_site_key', TextType::class, [
'constraints' => [
new ContainsRecaptcha(),
],
'required' => false,
])
->add('recaptcha_secret_key', TextType::class, [
'constraints' => [
new ContainsRecaptcha(),
],
'required' => false,
])
->add('recaptcha_threshold', ChoiceType::class, [
'choices' => $this->vt4gConst['VT4G_FORM']['CHOICES']['RECAPTCHA_SCORE'],
'choice_attr' => function ($value, $key, $index) {
// 審査なしで使用できる値にスタイルを付与
if ($value === '0.1' || $value === '0.3' || $value === '0.7' || $value === '0.9') {
return [
'style' => 'font-weight: bold; background-color: rgba(255, 255, 0, 0.3);'
];
} else {
return [];
}
},
'attr' => [
'class' => 'vt4g_from_input_choice_recaptcha_threshold',
],
'constraints' => [
new ContainsRecaptcha(),
new Regex(
[
'pattern' => '/^0\.[0-9]|1\.0$/',
'message' => 'vt4g_plugin.validate.recaptcha_threshold',
]
),
],
]);
}
/**
* ロールバックまでの時間の制約条件を取得します
*
* @return array 制約条件
*/
private function getRollbackTimeConstraints()
{
return [
new NotBlank(
[
'message' => 'vt4g_plugin.validate.not_blank'
]
),
new Range(
[
'min' => $this->vt4gConst['VT4G_FORM']["RANGE"]["MIN"]["ROLLBACK_TIME"],
'max' => $this->vt4gConst['VT4G_FORM']["RANGE"]["MAX"]["ROLLBACK_TIME"],
]
),
new Regex(
[
'pattern' => '/^[0-9]+$/',
'message' => 'vt4g_plugin.validate.num',
]
),
new Callback([
'callback' => [$this, 'validateNumericField'],
]),
];
}
/**
* 数値の入力フィールドのバリデーション
*
* @param string $value 入力値
* @param ExecutionContextInterface $context 検証用コンテキスト
*/
public function validateNumericField($value, ExecutionContextInterface $context)
{
// 0から始まる場合はエラーとする
if (strpos($value, '0') === 0) {
$context->buildViolation(trans('vt4g_plugin.validate.num.zero.not.allowed'))->addViolation();
}
}
}