2016-03-30 9 views
0

Ich habe ein Problem mit der Formularverwaltung in Silex.Optionen in Form in Silex injizieren

Ich habe ein Formular (RegionType), mit dem ich meine Domain (Entitäten) Informationen ausfüllen und ändern kann (Beispiel, Informationen über eine Region wie Name und Beschreibung). Dieses Formular erweitert AbstractType von Symfony.

Ich versuche, eine Option (validation_groups auf false) zu injizieren, um das Formular wiederzuverwenden, um Daten zu erhalten und diese Daten zu verwenden, um ein Suchformular in meiner DB zu erstellen.

Da das Formular für eine Suche und das Bearbeitungsformular dieselben Felder mit derselben Art von Daten verwenden, wollte ich meine Klassen nicht duplizieren.

Hier ist meine RegionType Form:

<?php 

namespace Easytrip2\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class RegionType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add ('name', 'text', array (
       'label' => 'Region code' 
     )); 
     $builder->add ('description', 'text', array (
       'label' => 'Region description' 
     )); 
    } 
    public function getName() { 
     return 'region'; 
    } 
    public static function getScriptsIdsArray() { 
     return array (
       array() 
     ); 
    } 
} 

ich es für meine Suche nur durch Duplizieren und das Hinzufügen der folgenden Verfahren verwenden:

im Typ
public function configureOptions(OptionsResolver $resolver) { 
    $resolver->setDefaults (array (
      'validation_groups' => false 
    )); 
} 

Mein Controller für die Bearbeitung der Form Version (Standard Create Update Sache):

public function regionUpdateByIdAction($id, Request $request, Application $app) { 
     if (/*check the user rights*/) { 
      //find the object being updated 
      $obj = $app ['dao.region']->findById ($id); 
      //create form and handle request 
      $form = $app ['form.factory']->create (new RegionType ($app), $obj); 
      $form->handleRequest ($request); 
      if ($form->isSubmitted() && $form->isValid()) { 
       if ($app ['dao.region']->save ($obj)) { 
        //warn user and redirect 
        $app ['session']->getFlashBag()->add ('success', 'The region was succesfully updated.'); 
        return $app->redirect ($app ['url_generator']->generate ('region')); 
       } else { 
        $app ['session']->getFlashBag()->add ('error', 'Something went wrong...'); 
       } 
      } 
      //generate the form view 
      return $app ['twig']->render ('form.html.twig', array (
        'form' => $form->createView(), 
        'title' => 'Edit region' 
      )); 
     } else { 
      $app ['session']->getFlashBag()->add ('error', 'Don\'t have the rights...'); 
      return $app->redirect ($app ['url_generator']->generate ('home')); 
     } 
    } 

Was? ich möchte ist, verwenden zu tun, die folgende Zeile

form = $app ['form.factory']->create (new RegionType ($app), $obj); 

und eine Option darin hinzufügen, so dass eine Option übergeben, wie

$form = $app ['form.factory']->create (new RegionType ($app), $obj, array (
        'validation_groups' => false 
      )); 

Wenn das Debuggen, ich finde, dass meine Wahl auf die Normalisierern wird nach unten und der validation_groups Normalizer ändert es von false zu einem leeren array, Zeile 962 von OptionsResolver.php, mit dem folgenden Stacktrace (kein Fehler auftritt, nur um den Call-Stack anzuzeigen).

C:/path/to/app/Easytrip2/vendor/symfony/options-resolver/OptionsResolver.php.Symfony\Component\OptionsResolver\OptionsResolver->offsetGet(): lineno 944 
C:/path/to/app/Easytrip2/vendor/symfony/options-resolver/OptionsResolver.php.Symfony\Component\OptionsResolver\OptionsResolver->resolve(): lineno 791 
C:/path/to/app/Easytrip2/vendor/symfony/form/ResolvedFormType.php.Symfony\Component\Form\ResolvedFormType->createBuilder(): lineno 104 
C:/path/to/app/Easytrip2/vendor/symfony/form/Extension/DataCollector/Proxy/ResolvedTypeDataCollectorProxy.php.Symfony\Component\Form\Extension\DataCollector\Proxy\ResolvedTypeDataCollectorProxy->createBuilder(): lineno 83 
C:/path/to/app/Easytrip2/vendor/symfony/form/FormFactory.php.Symfony\Component\Form\FormFactory->createNamedBuilder(): lineno 87  
C:/path/to/app/Easytrip2/vendor/symfony/form/FormFactory.php.Symfony\Component\Form\FormFactory->createBuilder(): lineno 67 
C:/path/to/app/Easytrip2/vendor/symfony/form/FormFactory.php.Symfony\Component\Form\FormFactory->create(): lineno 39  
C:/path/to/app/Easytrip2/src/Controller/RegionController.php.Easytrip2\Controller\RegionController->regionSearchAction(): lineno 39 
C:/path/to/app/Easytrip2/vendor/symfony/http-kernel/HttpKernel.php.call_user_func_array:{D:\users\F001780\Desktop\soft\wamp\www\Easytrip2\vendor\symfony\http-kernel\HttpKernel.php:139}(): lineno 139 
C:/path/to/app/Easytrip2/vendor/symfony/http-kernel/HttpKernel.php.Symfony\Component\HttpKernel\HttpKernel->handleRaw(): lineno 139 
C:/path/to/app/Easytrip2/vendor/symfony/http-kernel/HttpKernel.php.Symfony\Component\HttpKernel\HttpKernel->handle(): lineno 62 
C:/path/to/app/Easytrip2/vendor/silex/silex/src/Silex/Application.php.Silex\Application->handle(): lineno 586 
C:/path/to/app/Easytrip2/vendor/silex/silex/src/Silex/Application.php.Silex\Application->run(): lineno 563 
C:/path/to/app/Easytrip2/web/index.php.{main}(): lineno 10 

Kann jemand dieses Verhalten erklären? Ich bin in den mecanics leicht hier verloren ...

ich meine composer.json Einstellungen vergessen:

{ 
    "require": { 
     "silex/silex": "~1.3", 
     "doctrine/dbal": "2.5.*", 
     "symfony/security": "2.7.*", 
     "twig/twig": "1.21.*", 
     "symfony/twig-bridge": "2.7.*", 
     "symfony/form": "2.7.*", 
     "symfony/translation": "2.7.*", 
     "symfony/config": "2.7.*", 
     "jasongrimes/silex-simpleuser": "*", 
     "twig/extensions": "1.3.*", 
     "symfony/validator": "2.*", 
     "phpoffice/phpexcel": "1.*", 
     "symfony/monolog-bridge": "*", 
     "box/spout": "*" 
    }, 
    "require-dev": { 
     "phpunit/phpunit": "*", 
     "symfony/browser-kit": "*", 
     "symfony/css-selector": "*", 
     "silex/web-profiler": "*" 
    }, 
    "autoload":{ 
     "psr-4":{"Easytrip2\\": "src"} 
    }, 
    "autoload-dev":{ 
     "psr-4":{"Easytrip2\\": "tests"} 
    } 
} 
+0

Normalizer für validation_groups ändert 'false' in leeres Array. Sie können sehen, wie es in 'Symfony \ Component \ Form \ Extension \ Validator \ Type \ BaseValidatorExtension' funktioniert –

+0

Sie können' validation_groups' auf null setzen, es ist der Standardwert –

+0

Beide von euch haben Recht, und ich brauchte Zeit, um das zu erkennen leeres Array wird als falsch ausgewertet. Aber dann kann ich nicht verstehen, was dieses Verhalten ändert und warum die Validierung stattfindet ... –

Antwort

0

Ok, ich hier einen Fehler gemacht ... Dank Max P., fand ich es.

Mit dieser Konfiguration führt der Server keine Validierung durch. Zusätzlich zu validation_groups auf false gesetzt (um die Servervalidierung zu deaktivieren), muss ich die Option require ebenfalls auf false setzen, um sicherzustellen, dass kein erforderliches Tag an den Browser gesendet wird.

So ersetzt:

$form = $app ['form.factory']->create (new RegionType ($app), $obj, array (
       'validation_groups' => false 
     )); 

von:

$form = $app ['form.factory']->create (new RegionType ($app), $obj, array (
       'validation_groups' => false, 
       'required' => false 
     )); 

tut funktioniert sowohl auf Browser und Server-Seite.

Danke!