Eccube4 の商品の価格 Eccube\Form\Type\PriceType では0以上の数値のみが設定できる。
マイナス価格はエラーとなる。
マイナス価格をOKとするには、formのextensionで価格フィールドの設定を上書きすればよい。
・オプション「'accept_minus' => true」とし、
・値チェックのminを 0 でなくマイナス値にする。
app\Customize\Form\Extension\Admin\ProductClassFormExtension.php
namespace Customize\Form\Extension\Admin;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Form\Type\Admin\ProductClassType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Eccube\Form\Type\PriceType;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Class ProductClassFormExtension .
*/
class ProductClassFormExtension extends AbstractTypeExtension
{
/**
* @var EccubeConfig
*/
private $eccubeConfig;
/**
* @var EntityManagerInterface
*/
private $entityManager;
public function __construct(EccubeConfig $eccubeConfig, EntityManagerInterface $entityManager)
{
$this->eccubeConfig = $eccubeConfig;
$this->entityManager = $entityManager;
}
/**
* RelatedCollectionExtension.
*
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// マイナス価格を許容する
->add('price02', PriceType::class, [
'required' => true,
'accept_minus' => true,
'constraints' => [
new Assert\Length(['min' => (-1) * $this->eccubeConfig['eccube_price_len'], 'max' => $this->eccubeConfig['eccube_price_len']]),
],
])
->add('price01', PriceType::class, [
'required' => false,
'accept_minus' => true,
'constraints' => [
new Assert\Length(['min' => (-1) * $this->eccubeConfig['eccube_price_len'], 'max' => $this->eccubeConfig['eccube_price_len']]),
],
])
;
}
/**
* product admin form name.
*
* @return string
*/
public function getExtendedType()
{
return ProductClassType::class;
}
/**
* product admin form name.
*
* @return string[]
*/
public static function getExtendedTypes()
{
return [ProductClassType::class];
}
}
追記:管理画面の方で、1か所だけ本体プログラムを修正する必要があった。どうしても回避できず・・・