我有以下两个_forms:
用户表格
<%= simple_form_for(@user, :url => @target) do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.input :email, :label => "User Email" %>
<%= f.input :password, :label => "User Password" %>
<%= f.input :first_name %>
<%= f.input :last_name %>
<%= f.button :submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
租户形式
<%= simple_form_for(@tenant, :url => @target) …Run Code Online (Sandbox Code Playgroud) 我正在使用symfony中的实体字段渲染表单.
当我选择常规实体字段时,它运行良好.
$builder
->add('parent','entity',array(
'class' => 'AppBundle:FoodAnalytics\Recipe',
'attr' => array(
'class' => 'hidden'
)
))
Run Code Online (Sandbox Code Playgroud)
当我选择 - > add('parent','hidden')时会抛出以下错误:
表单的视图数据应该是标量,数组或\ ArrayAccess的实例,但是类AppBundle\Entity\FoodAnalytics\Recipe的实例.您可以通过将"data_class"选项设置为"AppBundle\Entity\FoodAnalytics\Recipe"或添加视图转换器来将类AppBundle\Entity\FoodAnalytics\Recipe的实例转换为标量,数组或实例来避免此错误ArrayAccess接口.500内部服务器错误 - LogicException
我们不能有隐藏的实体字段吗?为什么不?我是否有义务将另一个隐藏字段用于检索实体ID?
编辑:
基本上,我正在尝试做的是在显示它之前水合表单,但阻止用户更改其中一个字段(这里的父级).这是因为我需要将Id作为参数传递,我不能在表单操作URL中执行此操作.
所以我在我的Rails应用程序中有一个表单,它使用自定义FormBuilder为我提供一些自定义字段标记
<% form_for :staff_member, @staff_member, :builder => MyFormBuilder do |f| %>
[...]
<%= render :partial => "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %>
[...]
<% end %>
Run Code Online (Sandbox Code Playgroud)
现在,这部分是在一个由AJAX回调替换的形式的区域中.我最终在控制器中响应AJAX请求做的是:
render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member}
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样做,那么表单就会中断,因为我在form_for中使用的FormBuilder对象不再可用.有没有办法让我在用于AJAX回调的部分内部使用我的自定义FormBuilder对象?
这个问题与另一个问题类似.目前的解决方案用于设置CSS类是将其添加到以FormBuilder呼叫的第三个参数:: Add()方法:
->add('title', null, array('attr' => array('class'=>'span2')))
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不适用于设置CSS ID.当我做
->add('title', null, array('attr' => array('id'=>'title-field')))
Run Code Online (Sandbox Code Playgroud)
......这被忽略了.ID仍然像namespace_formtype_field.
如果有的话,我该如何设置CSS ID?
由于我使用symfony版本2.7(安装项目后立即出现404页面错误)的问题,我开始使用Symfony 3.0版.在一些小问题之后,我发现"app/console"被"bin/console"取代.所以我现在正在开发一个新项目,我已经构建了一个名为1的实体的新bundle
Codeit/RestaurantBundle && CodeitRestaurantBundle:Reserveren
格式是注释,实体有一个名为"naam"的id和1字段(字符串,255).我更新了模式,我生成了Codeit的实体,在成功完成之后,我生成了一个带有写操作的crud.格式再次是注释,前缀是/ reserveren.
因此,如果我访问页面web/reserveren,我将获得我的实体的显示页面.不幸的是,如果我尝试添加新条目,我收到以下错误:
给出的类型为"string","Codeit\RestaurantBundle\Form\ReserverenType"的预期参数
我的Bundle/Form/ReserverenType.php
<?php
namespace Codeit\RestaurantBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ReserverenType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('naam')
;
}
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Codeit\RestaurantBundle\Entity\Reserveren'
));
}
}
Run Code Online (Sandbox Code Playgroud)
我的实体代码
<?php
namespace Codeit\RestaurantBundle\Entity;
use Doctrine\ORM\Mapping …Run Code Online (Sandbox Code Playgroud) 在" 使用Rails的敏捷Web开发 "(第三版)第537-541页中,它具有"自定义表单构建器"代码,如下所示:
class TaggedBuilder < ActionView::Helpers::FormBuilder
# <p> # <label for="product_description">Description</label><br/> # <%= form.text_area 'description' %> #</p>
def self.create_tagged_field(method_name)
define_method(method_name) do |label, *args|
@template.content_tag("p" , @template.content_tag("label" , label.to_s.humanize,
:for => "#{@object_name}_#{label}") + "<br/>" + super)
end
end
field_helpers.each do |name|
create_tagged_field(name)
end
end
Run Code Online (Sandbox Code Playgroud)
此代码不适用于Ruby 1.9.1.它返回错误如下:
implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly. (ActionView::TemplateError)
我的问题是:我应该在代码中更改什么来解决这个问题?
我在angular2中创建了以下表单:
import {Component, ElementRef, ViewChild, AfterViewInit} from "angular2/core";
import {Observable} from "rxjs/Rx";
import {ControlGroup, Control, Validators, FormBuilder} from "angular2/common";
@Component({
selector: "ping-pong",
template: `
<form
name="someform" [ngFormModel]="form">
<div class="form-group">
<input
id="foobar" #foobar="ngForm" <-- without ="ngForm" everything works fine
type="text" ngControl="foobar"
value=""
class="form-control"
/>
</div>
</form>
`,
styles: [`
form {
width: 300px;
}
`]
})
export class ChangepswdFormComponent implements AfterViewInit {
@ViewChild("foobar") foobar: ElementRef;
private form: ControlGroup;
public constructor(formBuilder: FormBuilder) {
this.form = formBuilder.group({
foobar: [""]
});
}
public ngAfterViewInit(): …Run Code Online (Sandbox Code Playgroud) 好的,我正在尝试检查用户是否具有特定角色,我这样做了
但是,当我这样做时:
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('nombre',null,array('label' => 'Usuario'))
->add('email')
->add('password', 'repeated', array(
'type' => 'password',
'invalid_message' => 'Los campos deben coincidir',
'first_name' => 'password',
'second_name' => 'confirmar password',
'options' => array('required' => false)
))
->add('cliente', 'entity', array(
'class' => 'ClientesBundle:Cliente',
'empty_value' => 'Company',
'required' => false,
'empty_data' => null)
**)**
$user = $this->securityContext->getToken()->getUser();
**if ($user->getRol() == 'ROLE_SUPER_ADMIN'){**
->add('rol')
**}**
;
}
Run Code Online (Sandbox Code Playgroud)
尝试过这个:
**if ($this->securityContext->getToken()->getUser()->getRol() === 'ROLE_SUPER_ADMIN'){**
->add('rol')
**}**
Run Code Online (Sandbox Code Playgroud)
粗体线条(带有**的线条)有一条小红线表示错误,如果......我怎么解决这个问题呢?
是否有正确的方法来自定义表单,具体取决于请求它的用户的角色?
我的场景非常简单:如果用户没有被ROLE_ADMIN授予,我需要隐藏一些字段.我试图避免在Twig上显示字段,但是
{% if is_granted('ROLE_ADMIN') %}
{{form_row(form.field)}}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
不起作用,因为表单生成器绕过此检查.
Symfony版本:2.8.2
编辑
感谢@Rooneyl 建议,我找到了解决方案:
首先,您需要将"角色"键添加到options参数.因此,在configureOptions()$options['role']中始终是ROLE_USER.
/**
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyBundle\Entity\Ticket',
'role' => 'ROLE_USER'
));
}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中你必须传递getRoles()数组:
$user_roles = $this->getUser()->getRoles();
$form = $this->createForm('MyBundle\Form\TicketType', $ticket, array('role' => $user_roles));
Run Code Online (Sandbox Code Playgroud) 我有以下表格:
const enum Fields {
FirstName = 'firstName',
LastName = 'lastName'
}
interface FormType {
[Fields.FirstName]: FormControl<string | null>;
[Fields.LastName]: FormControl<string | null>;
}
public form!: FormGroup<FormType>;
this.form = new FormGroup({
[Fields.FirstName]: new FormControl(null, { validators: Validators.required }),
[Fields.LastName]: new FormControl(null, { validators: Validators.required }),
});
Run Code Online (Sandbox Code Playgroud)
使用 theenum是我为了避免输入错误而养成的习惯。
当我这样做时this.form.getRawValue().firstName, 的类型firstName被正确定义为string | null。但是,我更喜欢使用FormBuilder来构建我的表单,但我找不到使用 来翻译上面表单的方法FormBuilder。我试过这个:
this.form = this._fb.group<FormType>({
[Fields.FirstName]: ['', Validators.required],
[Fields.LastName]: ['', Validators.required],
});
Run Code Online (Sandbox Code Playgroud)
我当然可以使用一个FormGroup没有任何类型的简单的,但它会达不到目的:p
然而,这甚至不能作为 的推断类型 …
formbuilder ×10
symfony ×5
angular ×2
php ×2
ajax ×1
angular14 ×1
entity ×1
forms ×1
html ×1
partial ×1
role ×1
ruby ×1
ruby-1.9 ×1
simple-form ×1
symfony-2.8 ×1
typescript ×1