連絡が遅くなり失礼いたしました。
再び行き詰まってしまったため、ご教授いただけませんでしょうか。
あれからMasterTypeを利用すべく、
・Customize\Repository\Master\ExampleRepositoryの設置。
・ExampleテーブルをCustomize\Entity\Master\Exampleに移動し、dtbからmtbに変更。
・Customize\Form\Type\Master\ExampleTypeの追加。
・Customize\Form\Extension\Shopping\OrderTypeExtensionの追加。
・Customize\Entity\OrderTraitにてOrderテーブルにexample_id及びそのセッタとゲッタの設置。
を行いました。
【現状】
・mtbにテーブルの追加はできている。
・ご注文手続き、ご注文確認ともにデータの受け渡しはできており、表示もできる。
・注文確認画面で注文するボタンを押下すると、注文完了画面ではなく購入エラー画面に飛ばされる。
・購入エラー後にOrderテーブルを見ると、新たに受注が立っており、example_idに選択した値が含まれているが受注一覧には表示されていない。
【試したこと】
・ShoppingController.phpの以下の348行部分でvar_dumpを行ったところ、追加した値がNullになっている。
注文処理で一度OrderのUpdateが行われる際にNullになっているのではと考えていますが、間違いございませんでしょうか。
・エラーとしてはShoppingControllerの$form->isValid()がfalseになっていることで、注文処理に入ることすらできていない。(var_dump下のif文の条件が$form->isValid()がtrueでないと入れない。)
ShoppingController.php(一部抜粋)// フォームの生成.
$form = $this->createForm(OrderType::class, $Order, [
// 確認画面から注文処理へ遷移する場合は, Orderエンティティで値を引き回すためフォーム項目の定義をスキップする.
'skip_add_form' => true,
]);
$form->handleRequest($request);
var_dump($Order->getExampleId());exit; //☆この部分で取得した値がNullになっている。
if ($form->isSubmitted() && $form->isValid()) {
log_info('[注文処理] 注文処理を開始します.', [$Order->getId()]);
try {
/*
* 集計処理
*/
log_info('[注文処理] 集計処理を開始します.', [$Order->getId()]);
$response = $this->executePurchaseFlow($Order);
$this->entityManager->flush();
【分からないこと】
1.そもそもこのやり方で大丈夫かどうか。
2.処理として足りていない部分はどこか。
3.注文するボタン押下後、どのような処理が走るか。
以下に関連のあるソースを添付いたしますので、
おかしな点があればご指摘いただけたらありがたいです。
よろしくお願いいたします。
ExampleRepository.php<?php
namespace Customize\Repository\Master;
use Customize\Entity\Master\Example;
use Symfony\Bridge\Doctrine\RegistryInterface;
use Eccube\Repository\AbstractRepository;
class ExampleRepository extends AbstractRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, Example::class);
}
}
Example.php<?php
namespace Customize\Entity\Master;
use Doctrine\ORM\Mapping as ORM;
/**
* Example
*
* @ORM\Table(name="mtb_example")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
* @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="Customize\Repository\Master\ExampleRepository")
* @ORM\Cache(usage="NONSTRICT_READ_WRITE")
*/
class Example extends \Eccube\Entity\Master\AbstractMasterEntity
{
}
}
ExampleType.php<?php
namespace Customize\Form\Type\Master;
use Eccube\Form\Type\MasterType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ExampleType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$options['example_options']['required'] = $options['required'];
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'class' => 'Customize\Entity\Master\Example',
'expanded' => true,
'placeholder' => false,
]);
}
public function getParent()
{
return MasterType::class;
}
public function getBlockPrefix()
{
return 'example';
}
}
OrderTypeExtension.php<?php
namespace Customize\Form\Extension\Shopping;
use Eccube\Entity\Order;
use Eccube\Form\Type\Shopping\OrderType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
use Customize\Form\Type\Master\ExampleType;
class OrderTypeExtension extends AbstractTypeExtension
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('example_id', ExampleType::class, [
'label' => 'テストです',
'required' => true,
'expanded' => true,
'multiple' => false,
'constraints' => [
new Assert\NotBlank(),
],
]);
}
/**
* {@inheritdoc}
*/
public function getExtendedType()
{
return OrderType::class;
}
}
OrderTrait.php<?php
namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;
use Eccube\Annotation as Eccube;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @Eccube\EntityExtension("Eccube\Entity\Order")
*/
trait OrderTrait
{
/**
* @var \Customize\Entity\Master\Example
* @ORM\ManyToOne(targetEntity="Customize\Entity\Master\Example")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="example_id", referencedColumnName="id", nullable=true)
* })
*/
private $Example;
/**
* @param \Customize\Entity\Master\Example|null $example_id
* @return Order
*/
public function setExampleId(\Customize\Entity\Master\Example $example_id = null)
{
$this->Example = $example_id;
return $this;
}
/**
* @return \Customize\Entity\Master\Example|null
*/
public function getExampleId()
{
return $this->Example;
}
}