首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Silex - Symfony2 :用于文本表单的自动填充表单,而不是用于选择的表单

Silex - Symfony2 :用于文本表单的自动填充表单,而不是用于选择的表单
EN

Stack Overflow用户
提问于 2016-01-04 15:27:25
回答 3查看 399关注 0票数 0

首先,向大家致以2016年新年最美好的祝愿!

我正面临着一个我自己无法解决的问题。

我正在开发一个Silex (~1.3)应用程序。我在域类上编写了简单的CRUDs代码。我还创建了一些Type表单,以便能够修改我的基本域类。在这种情况下,我必须在一个State中管理Country的概念。每个类都是特定的类,State有一个Country属性。

在我的表单中,我声明了一些文本字段,以及一个能够选择国家的Choice字段(表单类在下面复制)。

我的问题是,当我试图用下面的控制器修改现有的State时,文本字段namecodeunloc都填充了来自数据库的数据,而不是选项countryhub (控制器类在下面复制)。

请注意,我不是使用Doctrine,而是一个自制的(相当基本的) DAO。

这是我的代码和一些信息:

  1. 视图是使用twig完成的,使用的是“标准”引导示例,可以在这里找到:表单定制,使用引导布局表格布局: {%扩展'layout.html.twig‘%} {%块标题} {%结束块} {%块内容%} {%块内容%} {%如果窗体和is_granted('IS_AUTHENTICATED_FULLY')和is_granted(’ROLE_ADMIN‘% } }{% form_theme窗体'bootstrap_3_layout.html.twig’% }} {form_start(窗体)}{{ form_errors(窗体)}{form_widget(表单) }}
  2. composer.json内容: {“要求”:{ "silex/silex":"~1.3“、”学说/dbal“:"2.5.*”、"symfony/security":"2.7.*“、”小枝/树枝“:"1.21.*”、“symfony/树枝-桥梁”:"2.7.*“、"symfony/form":"2.7.*”“符号/翻译”:"2.7.*“、"symfony/config":"2.7.*”、"jasongrimes/silex-simpleuser":"*“、”小枝/扩展“:"1.3.*”、“symfony/验证器”:"2.*“、"phpoffice/phpexcel":"1.*”“需要量-dev”:{ "phpunit/phpunit":"*","symfony/browser-kit":"*","symfony/css-selector":"*",“silex/web-分析器”:"*","symfony/monolog-bridge":"*“,"autoload":{“PSR-4”:{“Easytrip2 2”:"src"} }
  3. 表格代码:
  4. 控制器内容: 公共函数stateUpdateByIdAction( $id,Request $request,Application $app) { if ($app‘$request. $app _checker’-isGranted( 'IS_AUTHENTICATED_FULLY‘)和$app’$request. $app _checker‘>isGranted( 'ROLE_ADMIN’>){ $obj = $app‘dao.state’>findById($id );$form = $app‘form.Factory-create=’create‘>创建( new StateType ($app’dao.Country,$app 'dao.geopoint‘),$app’dao.geopoint‘> );$form->handleRequest ( $request );if ($form->isSubmitted () & $form->isValid ()) { if ($app‘dao.state’>保存( $obj )) { $app‘>会话’->getFlashBag ()->add (‘成功’,状态已连续更新。‘);返回$app ->重定向($app’url_生成器->生成( ' state‘> );{ $app 'session'->getFlashBag ()->add ( 'error',‘出了问题…’);}返回$app‘twig’->呈现( 'form.html.twig',数组( 'form‘=> $form->createView (),’=>‘编辑状态’);{ $app 'session'->getFlashBag ()->add ( 'error',‘Don’‘没有权限.’);返回$app ->重定向($app 'url_generator'->generate ( 'home‘);}}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-11 15:54:59

我设法找到了一个解决方案(可能不是最好的,但它有效)。

我的理解是:我们将对象作为choices,使用它作为值,然后使用闭包获取idslabels,而不是自己做工作,给表单提供“现成的”数据。

有更干净的方法吗?

代码语言:javascript
运行
复制
$obj = $this->countryDAO->findAll ();
$list = array ();
foreach ( $obj as $value ) {
    $list [$value->getId ()] = $value;
}
$builder->add ( 'country', 'choice', array (
    'choices' => $list,
    'choices_as_values' => true,
    'choice_label' => function ($value) {
        return $value->getName ();
    },
    'choice_value' => function ($value) {
    // you mightwant to check for null here, is your form concern
    // a attribute that can be null, as the closure appear to be called
    // on the attribute, and not only on the $obj contents;
        return $value->getId ();
    },
    'placeholder' => 'Select a country'
) );
票数 0
EN

Stack Overflow用户

发布于 2016-01-07 10:03:20

假设选择没有被来自DB的数据填充,因为country和hub id没有传输到ChoiceList。

代码语言:javascript
运行
复制
$choices = array();
foreach ($countries as $value) {
    $choices[$value->getId()] = $value->getName();
}
$builder->add('country', 'choice', array(
    'choices' => $choices
));
票数 0
EN

Stack Overflow用户

发布于 2016-01-11 16:00:23

将这一行添加到您的选择选项:'choices_as_values' => true,

激活新的选择类型API http://symfony.com/doc/current/reference/forms/types/choice.html#example-usage是非常必要的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34594451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档