app/Plugin/ProductField/EventSubscriber/ProductSubscriber.php line 78

Open in your IDE?
  1. <?php
  2. namespace Plugin\ProductField\EventSubscriber;
  3. use Eccube\Controller\AbstractController;
  4. use Eccube\Event\TemplateEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Plugin\ProductField\Repository\ConfigRepository;
  7. use Plugin\ProductField\Repository\ProductFieldContentRepository;
  8. use Plugin\ProductField\Common\CommonField;
  9. use Plugin\ProductField\Common\CommonDefine;
  10. use Eccube\Event\EccubeEvents;
  11. use Eccube\Event\EventArgs;
  12. use Eccube\Common\EccubeConfig;
  13. use Plugin\ProductField\Service\ProductFileUploader;
  14. use Symfony\Component\Form\Extension\Core\Type\HiddenType;
  15. use Symfony\Component\Asset\Packages;
  16. use Symfony\Component\Validator\Constraints\NotBlank;
  17. class ProductSubscriber extends AbstractController implements EventSubscriberInterface
  18. {
  19.     /**
  20.      * @var ConfigRepository
  21.      */
  22.     protected $configRepository;
  23.     protected $ProductFieldContentRepository;
  24.     protected $eccubeConfig;
  25.     protected $productFileUploader;
  26.     protected $packages;
  27.     /**
  28.      * ConfigController constructor.
  29.      *
  30.      * @param ConfigRepository $configRepository
  31.      */
  32.     public function __construct(
  33.     ConfigRepository $configRepository,
  34.     ProductFieldContentRepository $ProductFieldContentRepository,
  35.     EccubeConfig $eccubeConfig,
  36.     ProductFileUploader $productFileUploader,
  37.     Packages $packages
  38.     )
  39.     {
  40.         $this->configRepository $configRepository;
  41.         $this->ProductFieldContentRepository $ProductFieldContentRepository;
  42.         $this->eccubeConfig $eccubeConfig;
  43.         $this->productFileUploader $productFileUploader;
  44.         $this->packages $packages;
  45.     }
  46.     protected function getProductFieldContent($product_id$meta_key) {
  47.         $ProductFieldContent $this->ProductFieldContentRepository->getProductFieldContent($product_id,$meta_key);
  48.         if(empty($ProductFieldContent)){
  49.             //無いとき
  50.             $ProductFieldContent $this->ProductFieldContentRepository->newProductFieldContent($product_id,$meta_key);
  51.         }
  52.         return $ProductFieldContent;
  53.     }
  54.     /**
  55.      * @inheritDoc
  56.      */
  57.     public static function getSubscribedEvents()
  58.     {
  59.         return [
  60.             '@admin/Product/product.twig' => 'onTemplateAdminProduct',
  61.              EccubeEvents::ADMIN_PRODUCT_EDIT_INITIALIZE => 'onAdminProductEditInit',
  62.              EccubeEvents::ADMIN_PRODUCT_EDIT_COMPLETE => 'onAdminProductEditComplete'
  63.         ];
  64.     }
  65.     public function onAdminProductEditInit(EventArgs $event)
  66.     {
  67.        
  68.         $Configs $this->configRepository->joinMetaKey($event->getArguments()["Product"]["id"]);
  69.         $builder $event->getArgument('builder');
  70.      
  71.         //auto_render trueにすると製品に自動的に表示されるがhtmlを編集したいのでコメントアウト onTemplateAdminProductでtwig追加
  72.         if(!empty($Configs)){
  73.             foreach($Configs as $index => $Config){
  74.                 $CommonField = new CommonField();
  75.                 //関連商品で必要
  76.                 $CommonField->setEntityManager($this->getDoctrine()->getManager());
  77.                 $create $CommonField->create([
  78.                    "product_id" => $event->getArguments()["Product"]["id"],
  79.                    "data" => $Config,
  80.                    "eccube_save_image_dir" => $this->eccubeConfig["eccube_save_image_dir"],
  81.                 ]);
  82.               
  83.                 $validation $CommonField->validation($Config);
  84.                 if($Config["a_type"] === "select" || $Config["a_type"] === "radio" || $Config["a_type"] === "checkbox" || $Config["a_type"] === "relation_product" || $Config["a_type"] === "relation_product_multiple"){
  85.                     //choicesがある場合、三項演算子などで空を含めるとエラーになるので分岐
  86.                     $builder->add(CommonDefine::ADD_FIELD_NAME."_".$Config["a_meta_key"],$create["type"], [
  87.                         'placeholder' => '選択して下さい',
  88.                         'constraints' => $validation,
  89.                         'mapped' => false,//フォームのプロパティでない場合
  90.                         'attr' => $create["attr"],
  91.                         // 'required' => !empty($Config["a_not_blank"]) ? true : false,
  92.                         'required' => true,
  93.                         'label' => $create["name"],
  94.                         'data' => $create["data"],
  95.                         'choices' =>  array_keys($create["choices"]),
  96.                         'choice_label' => function ($choice$key$value) use ($create) {
  97.                             //キーと値が逆なので変更
  98.                             return $create["choices"][$choice];
  99.                         },
  100.                         'expanded' => $Config["a_type"] === "radio" || $Config["a_type"] === "checkbox" true false,
  101.                         'multiple' => $Config["a_type"] === "checkbox" ||  $Config["a_type"] === "relation_product_multiple" true false,
  102.                         'eccube_form_options' => [
  103.                             'plg_product_field_required' => !empty($Config["a_not_blank"]) ? true false,
  104.                             'plg_product_field_render' => true,
  105.                             'plg_product_field_image' => false,
  106.                             'plg_product_field_file' => false,
  107.                             'plg_product_field_hidden' => false,
  108.                             'auto_render' => false// 自動表示フラグ
  109.                         ],
  110.                     ]);
  111.                 }else{
  112.                     $builder->add(CommonDefine::ADD_FIELD_NAME."_".$Config["a_meta_key"],$create["type"], [
  113.                         'constraints' => $validation,
  114.                         'mapped' => false,//フォームのプロパティでない場合
  115.                         'attr' => $create["attr"],
  116.                         'required' => !empty($Config["a_not_blank"]) ? true false,
  117.                         'label' => $create["name"],
  118.                         'data' => $create["data"],
  119.                         'eccube_form_options' => [
  120.                             'plg_product_field_required' => !empty($Config["a_not_blank"]) ? true false,
  121.                             'plg_product_field_render' => true,
  122.                             'plg_product_field_image' => $Config["a_type"] === "image" true false,
  123.                             'plg_product_field_file' => $Config["a_type"] === "file" true false,
  124.                             'plg_product_field_hidden' => false,
  125.                             'auto_render' => false// 自動表示フラグ
  126.                         ],
  127.                     ]);
  128.                     if($Config["a_type"] === "image" || $Config["a_type"] === "file"){
  129.                         $builder->add($Config["a_type"]."_".CommonDefine::ADD_FIELD_NAME."_".$Config["a_meta_key"],HiddenType::class, [
  130.                             'constraints' => !empty($Config["a_not_blank"]) && !empty($create["data"]) ? [new NotBlank()] : [],
  131.                             'mapped' => false,
  132.                             'data' => !empty($create["data"]) ? $this->packages->getUrl($Config["b_meta_content"], 'save_image') : "",
  133.                             'error_bubbling'=>false,
  134.                             'eccube_form_options' => [
  135.                                 'plg_product_field_required' => false,
  136.                                 'plg_product_field_render' => true,
  137.                                 'plg_product_field_image' => false,
  138.                                 'plg_product_field_file' => false,
  139.                                 'plg_product_field_hidden' => true,
  140.                                 'auto_render' => false// 自動表示フラグ
  141.                             ],
  142.                         ]);
  143.                     }
  144.                 }
  145.             }
  146.         }
  147.     }
  148.     
  149.     public function onTemplateAdminProduct(TemplateEvent $event)
  150.     {
  151.         $form_adds = [];
  152.         
  153.         foreach($event->getParameters()["form"] as $f){
  154.             if(!empty($f->vars["eccube_form_options"]["plg_product_field_render"])){
  155.                 $form_adds[] = $f;
  156.             }
  157.         }
  158.         $event->setParameter('form_adds'$form_adds);
  159.         $event->addSnippet('@ProductField/admin/Product/product_fields.twig');
  160.     }
  161.     
  162.     public function onAdminProductEditComplete(EventArgs $event){
  163.         $form $event->getArgument('form');
  164.         $Configs $this->configRepository->joinMetaKey($event->getArgument('Product')->getId());
  165.      
  166.         if(!empty($Configs)){
  167.             foreach($form as $key => $f){
  168.                  //plg_product_field_renderがなければスキップ plg_product_field_hiddenがtrueならスキップ
  169.                 if(empty($f->getConfig()->getOptions()["eccube_form_options"]["plg_product_field_render"]) || !empty($f->getConfig()->getOptions()["eccube_form_options"]["plg_product_field_hidden"])){
  170.                     continue;
  171.                 }
  172.                 foreach($Configs as $Config){
  173.                     if($key === CommonDefine::ADD_FIELD_NAME "_" $Config["a_meta_key"]){
  174.                         $ProductFieldContent $this->getProductFieldContent($event->getArgument('Product')->getId(),$Config["a_meta_key"]);
  175.                         //画像ファイルで空でなければ
  176.                         if($Config["a_type"] === "image" || $Config["a_type"] === "file"){
  177.                             if(empty($form->get($Config["a_type"]."_".$f->getName())->getData())){
  178.                                 $ProductFieldContent->setMetaContent("");
  179.                             }
  180.                             if(!empty($f->getData())){
  181.                                 $filename $this->productFileUploader->upload($f->getData());
  182.                                 $ProductFieldContent->setMetaContent($filename);
  183.                             }
  184.                         }elseif($Config["a_type"] === "checkbox"){
  185.                             $ProductFieldContent->setMetaContent(serialize($f->getData()));
  186.                         }elseif($Config["a_type"] === "relation_product_multiple"){
  187.                             //getDataだと順番が初期値に置き換えられてしまう Postで取得
  188.                             $relation_items = !empty($_POST[$f->getParent()->getName()][$f->getName()]) ? $_POST[$f->getParent()->getName()][$f->getName()] : [];
  189.                             $ProductFieldContent->setMetaContent(serialize($relation_items));
  190.                         }else{
  191.                             $ProductFieldContent->setMetaContent($f->getData());
  192.                         }
  193.                        
  194.                         $this->entityManager->persist($ProductFieldContent);
  195.                         $this->entityManager->flush($ProductFieldContent);
  196.                         break;
  197.                     }
  198.                 }
  199.             }
  200.         }
  201.     }
  202. }