2016-03-30 8 views
0

私はSilexのフォーム管理に関する問題に直面しています。Silexのフォームにオプションを挿入する

ドメイン(エンティティ)情報(例:Regionの名前と説明のような情報)を入力して変更できるフォーム(RegionType)があります。このフォームはSymfonyからAbstractTypeまで拡張されています。

フォームを再利用してデータを取得し、このデータを使用してmy DBの検索フォームを作成できるようにするには、オプション(validation_groupsをfalseにする)を注入しようとしています。

検索フォームと編集フォームで同じ種類のデータを持つ同じフィールドが使用されるため、クラスを複製したくありませんでした。ここで

は私RegionType形式です:

<?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() 
     ); 
    } 
} 

私はちょうどそれを複製し、次のメソッドを追加することによって、私の検索のためにそれを使用することができます。

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

タイプでフォームを編集するための私のコントローラバージョン(標準アップデート作成):

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')); 
     } 
    } 

私がやりたいデバッグするとき、私は私のオプションは、正規化に降りていることを見つける

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

のように、

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

次の行を使用して、オプションを通過させることでオプションを追加することです validation_groupsノーマライザでは、 falseから array、の962行を次のstacktrace(呼び出しスタックを表示するだけでエラーは発生しません)に変更します。

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 

誰でもこの現象を説明できますか?私が見つけた、...

{ 
    "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

validation_groupsのノーマライザは空の配列に 'false'を変更します。あなたは 'Symfony \ Component \ Form \ Extension \ Validension \ Type \ BaseValidatorExtension'でどのようにwokrksを見ることができます –

+0

' validation_groups'をヌルにすることができます。デフォルト値は –

+0

です。空の配列はfalseと評価されます。しかし、私はこの振る舞いを変え、検証が行われる理由を理解することはできません。 –

答えて

0

[OK]を、私はここでミスを犯した最大P.へ 感謝を:私は少し私は私のcomposer.jsonの設定を忘れてしまった... mecanicsにここに

を失いましたよそれ。

実際にこの構成では、サーバーは検証を行いません。 validation_groupsに加えて(サーバー検証を無効にする)falseに設定すると、ブラウザに必要なタグが送信されないように、requireオプションもfalseに設定する必要があります。

ので交換:

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

によって:

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

は、ブラウザとサーバ側の両方の作品を行います。

ありがとうございます!

関連する問題