Ver Fonte

ExtraDataWithParentTrait. JSONValidator. Traducciones

Guillermo Espinoza há 8 anos atrás
pai
commit
276f8b1aea

+ 10 - 5
Entity/Traits/ExtraDataTrait.php

@@ -3,17 +3,22 @@
 namespace ExtraDataBundle\Entity\Traits;
 
 use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Validator\Constraints as Assert;
 
 trait ExtraDataTrait
 {
-    
+
     /**
      * @var string $extraData
      *
-     * @ORM\Column(type="json_array", nullable=true)
+     * @ORM\Column(type="text", nullable=true)
+     * 
+     * @Assert\Callback(
+     *  callback={"ExtraDataBundle\Validator\JSONValidator", "validate"}, 
+     *  payload={"field"="extraData"}
+     * )
      */
     private $extraData;
-    
 
     /**
      * @return string
@@ -31,8 +36,8 @@ trait ExtraDataTrait
     public function setExtraData($extraData = null)
     {
         $this->extraData = $extraData;
-        
+
         return $this;
     }
-    
+
 }

+ 42 - 0
Entity/Traits/ExtraDataWithParentTrait.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace ExtraDataBundle\Entity\Traits;
+
+trait ExtraDataWithParentTrait
+{
+    
+    use ExtraDataTrait;
+
+    /**
+     * @param string $extraData
+     * 
+     * @return $this
+     */
+    public function setExtraData($extraData = null)
+    {
+        $this->extraData = $this->extraDataDiff($extraData);
+        
+        return $this;
+    }
+    
+    /**
+     * @param string $extraData
+     * 
+     * @return string
+     */
+    public function extraDataDiff($extraData = null)
+    {
+        $parentExtraData = array();
+        if (!is_null($this->parent)) {
+            $parentExtraData = json_decode($this->parent->getExtraData(), true);
+        }
+        
+        $extraDataArray = json_decode($extraData, true);
+        if (json_last_error() === JSON_ERROR_NONE) {
+            return json_encode(array_diff($extraDataArray, $parentExtraData));
+        }
+        
+        return $extraData;
+    }
+    
+}

+ 51 - 0
EventListener/SonataAdminConfigureListener.php

@@ -0,0 +1,51 @@
+<?php
+
+namespace ExtraDataBundle\EventListener;
+
+use Sonata\AdminBundle\Event\ConfigureEvent;
+use Symfony\Component\Form\Extension\Core\Type\TextareaType;
+use Symfony\Component\Translation\TranslatorInterface;
+
+class SonataAdminConfigureListener
+{
+
+    /**
+     * @var TranslatorInterface
+     */
+    private $translator;
+
+    
+    /**
+     * @param TranslatorInterface $translator
+     */
+    public function __construct(TranslatorInterface $translator)
+    {
+        $this->translator = $translator;
+    }
+
+    /**
+     * @param ConfigureEvent $event
+     */
+    public function addOptions(ConfigureEvent $event)
+    {
+        if ($event->getMapper()->has('extraData')) {
+            $formMapper = $event->getMapper();
+            $formMapper->add('extraData', TextareaType::class, array(
+                'help' => $this->translator->trans('help.json_format', array(), 'ExtraDataBundle'),
+            ));
+        }
+    }
+
+    /**
+     * @param ConfigureEvent $event
+     */
+    public function addTemplate(ConfigureEvent $event)
+    {
+        if ($event->getMapper()->has('extraData')) {
+            $extraData = $event->getMapper()->get('extraData');
+            $extraData->setTemplate('ExtraDataBundle:CRUD:extra_data_field.html.twig');
+            $extraData->setOption('data', $event->getType());
+        }
+    }
+
+}

+ 32 - 1
README.md

@@ -2,6 +2,7 @@
 
 - [Installation](#installation)
 - [Traits](#traits)
+- [Validator](#validators)
 
 ## Installation
 
@@ -60,4 +61,34 @@ Luego ejecutar
 
 ```bash
 $ bin/console doctrine:schema:update --force
-```
+```
+
+- Entity\Traits\ExtraDataWithParentTrait: Idem a ExtraDataTrait, el campo extraData se calcula como la diferencia del padre y lo que se ingresa.
+
+
+## Validators
+
+
+- ExtraDataBundle\Validator\JSONValidator: Assert Callback que valida que un campo tenga formato json valido
+
+```php
+
+use Symfony\Component\Validator\Constraints as Assert;
+
+...
+
+/**
+     * @var string $extraData
+     *
+     * @ORM\Column(type="text", nullable=true)
+     * 
+     * @Assert\Callback(
+     *  callback={"ExtraDataBundle\Validator\JSONValidator", "validate"}, 
+     *  payload={"field"="extraData"}
+     * )
+     */
+    private $extraData;
+
+```
+
+

+ 7 - 0
Resources/config/services.yml

@@ -1 +1,8 @@
 services:
+    extra_data.sonata_admin_configure.listener:
+       class: ExtraDataBundle\EventListener\SonataAdminConfigureListener
+       arguments: ["@translator"]
+       tags:
+           - { name: kernel.event_listener, event: sonata.admin.event.configure.form, method: addOptions }
+           - { name: kernel.event_listener, event: sonata.admin.event.configure.show, method: addTemplate }
+           - { name: kernel.event_listener, event: sonata.admin.event.configure.list, method: addTemplate }

+ 2 - 0
Resources/translations/ExtraDataBundle.es.yml

@@ -0,0 +1,2 @@
+help:
+    json_format: Formato JSON

+ 2 - 0
Resources/translations/validators.es.yml

@@ -0,0 +1,2 @@
+error:
+    json_format_invalid: El campo no tiene el formato JSON

+ 7 - 0
Resources/views/CRUD/extra_data_field.html.twig

@@ -0,0 +1,7 @@
+{% extends "SonataAdminBundle:CRUD:base_#{field_description.options.data}_field.html.twig" %}
+
+{% block field %}
+<pre>
+{{ value }}
+</pre>
+{% endblock %}

+ 27 - 0
Validator/JSONValidator.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace ExtraDataBundle\Validator;
+
+use Symfony\Component\Validator\Context\ExecutionContextInterface;
+
+class JSONValidator
+{
+
+    /**
+     * @param string $value
+     * @param ExecutionContextInterface $context
+     * @param array $payload
+     */
+    public static function validate($value, ExecutionContextInterface $context, $payload)
+    {
+        if (isset($payload['field'])) {
+            json_decode($value);
+            if (json_last_error() !== JSON_ERROR_NONE) {
+                $context->buildViolation('error.json_format_invalid')
+                        ->atPath($payload['field'])
+                        ->addViolation();
+            }
+        }
+    }
+
+}