我正在尝试在首页上插入自定义奏鸣曲表单字段类型,而不是在 SonataAdmin 中,如下所示:
$form = $this->createFormBuilder($content)
->add('titleEs', 'text', array('required' => true, 'label' => 'label.title.spanish', 'attr' => array('class' => 'col-xs-12 form-control input-lg')))
->add('contentEs', 'ckeditor', array('required' => true,'label' => 'label.content.spanish', 'attr' => array('class' => 'col-xs-12')))
->add('titleEn', 'text', array('required' => true,'label' => 'label.title.english', 'attr' => array('class' => 'col-xs-12 form-control input-lg')))
->add('contentEn', 'ckeditor', array('required' => true, 'label' => 'label.content.english', 'attr' => array('class' => 'col-xs-12')))
->add('header', 'sonata_type_model', array('required' => true,'label' => 'label.content.headerImage'), array('link_parameters' => array('context' => 'content/front', 'size' => 'big')))
//->add('coverImage', 'sonata_type_model_list', array('required' => true,'label' …Run Code Online (Sandbox Code Playgroud) 我有一个带有 ChoiceType 字段的 Symfony3 表单。它使用带有 AJAX 数据源的 Select2。这一点工作正常。然而,当表单被提交时,Symfony 验证开始并抱怨:
This value is not valid
Run Code Online (Sandbox Code Playgroud)
我想这是因为通过 AJAX 选择的选择不存在于表单类型的“选择”键中。
我对 Symfony 比较陌生。有人可以指出我正确的方向以禁用现场验证吗?
我有一个集合类型:
->add('tipi', CollectionType::class, array(
'entry_type' => TipiType::class,
'allow_add' => true,
'prototype' => true,
'mapped' => false,
'entry_options' => array(
'required' => true,
'label' => false,
)
))
Run Code Online (Sandbox Code Playgroud)
扩展此表单类型:
->add('tipi', EntityType::class, array(
'label' => 'Tipo',
'class' => 'AppBundle:Tipi',
'attr' => array('class' => 'form-control'),
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('t')
->innerJoin('t.requests', 'r')
;
},
));
Run Code Online (Sandbox Code Playgroud)
在第一种表单类型中,我有一个从控制器发送的选项,如下所示:
$idRequest = $request->get('id');
$form = $this->createForm(RequestsType::class, $requests, array(
'id_request' => $idRequest
));
Run Code Online (Sandbox Code Playgroud)
在第一个中我可以使用它,但在子 FormType 中则不能。我会在集合类型中传递这个变量。我怎样才能做到这一点?
$form = $this->createForm(new YourForm($options), $class);
Run Code Online (Sandbox Code Playgroud) 使用底层实体中定义的常量数组填充 Symfony 表单 choiceType 并添加基于相同常量创建断言的最佳方法是什么。\n选项名称应存储在数据库中。
\n\n我正在使用 Symfony 2.8,这就是我所做的。它运作良好,但我认为必须有一种更简单的方法来处理所有新的表单功能。
\n\n谢谢,汉内斯
\n\n实体
\n\n\n\nclass User implements UserInterface, \\Serializable\n{\n const OCCUPATION_SCHOOL_HIGHER_DEGREE = \'Sch\xc3\xbclerin/Sch\xc3\xbcler an Gymnasium\';\n const OCCUPATION_SCHOOL_LOWER_DEGREE = \'Sch\xc3\xbclerin/Sch\xc3\xbcler an Haupt-/Real- und anderen Schulen\';\n const OCCUPATION_WORK_TRAINING = \'Berufsausbildung\';\n const OCCUPATION_UNIVERSITY = \'Studium an einer Hochschule\';\n const OCCUPATION_WORK_FULLTIME = \'Vollzeiterwerbst\xc3\xa4tigkeit\';\n const OCCUPATION_WORK_PARTTIME = \'Teilzeiterwerbst\xc3\xa4tigkeit\';\n const OCCUPATION_NATIONAL_SERVICE = \'Wehrdienst/Zivildienst/FSJ/F\xc3\x96J\';\n const OCCUPATION_UNEMPLOYED = \'keine Besch\xc3\xa4ftigung\';\n const OCCUPATION_OTHERS = \'sonstiges\';\n\n...\n/**\n * @ORM\\Column(type="string", length=255, nullable=true)\n * @Assert\\NotBlank(message = "Pflichtfeld.")\n * @Assert\\Choice(\n * choices = {\n …Run Code Online (Sandbox Code Playgroud) 鉴于以下表单类型,我如何在提交之前呈现我的第二个字段?我试过了,$form->remove但我总是会收到这个错误:
Warning: Illegal offset type in isset or empty
Run Code Online (Sandbox Code Playgroud)
不太确定如何解决这个问题。
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('survey', EntityType::class, [
'class' => SurveyManager::class,
'attr' => [
'class' => 'field-change',
],
])
->add('submit', SubmitType::class, [
])
->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$modifier = $data['survey'];
$form->add('headquarter', EntityType::class, [
'class' => HeadQuarterManager::class,
'query_builder' => function (HeadQuarterManagerRepository $er) use ($modifier) {
return $er->getHeadquarter($modifier);
}, …Run Code Online (Sandbox Code Playgroud) 我想在网站的每个子页面上显示相同的表单。在每个控制器的每个动作中将其传递给 Twig 是没有意义的。我不想创建某种将表单传递给 Twig 的 BaseController。
我觉得通过一些配置或服务注入应该可以,但我找不到合适的方法。
我已经将表单作为服务app_bundle.user.form.type.locale,但是在哪里注入它以及如何将参数传递给表单。
编辑:
action表单的属性始终是当前地址,因此它看起来像这样<select action="">
我使用 Symfony 表单来过滤一组数据。比如说,有一个“用户”下拉列表过滤日志记录表(每个记录可以与用户链接,但也可以不链接)。
换句话说,LogRecord <- many-to-one nullable -> User
问题是我希望它支持下拉列表中的 2 个选项:所有用户(禁用此字段的过滤)和“无用户”,它应该过滤字段 = NULL 的记录。但我不知道如何学习表单来区分这些情况,而不破坏表单验证过程。有任何想法吗?
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->setMethod('GET');
$builder
->add('user', EntityType::class, array(
'class' => 'AppBundle:User',
'choice_label' => 'name',
'placeholder' => 'All',
'query_builder' => function (UserRepository $repo) {
return $repo->findForOptionsQueryBuilder();
},
'label' => 'User',
'required' => false,
));
}
Run Code Online (Sandbox Code Playgroud)
当前下拉列表:
所需的下拉菜单:
我在两个实体之间有一个 ManyToOne 关系Parent,Child因此在FormType我使用的关系中CollectionType,如下所述:
class ParentType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('childs', CollectionType::class, array(
'entry_type' => ChildType::class,
));
}
}
Run Code Online (Sandbox Code Playgroud)
在 ChildType 类中,我想使用 EventListener 获取嵌入对象:
class ChildType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('lastName');
$builder->addEventListener(
FormEvents::POST_SET_DATA,//---after setting data
function (FormEvent $event) {
die(var_dump($event->getData()));//---this gives me null
}
);
}
}
Run Code Online (Sandbox Code Playgroud)
尽管我已将完整对象传递给控制器中的表单,但我得到的结果为 null: …
我有一个Company有很多Employees 的。在我的表单中,我希望用户能够动态添加员工(足够简单)。EmployeeType(an AbstractType) 是复合词,包含名字和姓氏。在提交表单时,Symfony 似乎没有将表单中的数据传递到“新”员工的构造函数中。我收到一个错误
ArgumentCountError:函数 Employee::__construct() 的参数太少...传入了 0 个...并且预期正好有 3 个
显示和编辑现有的员工作品,因此我确信我的关系等都是正确的。
缩写代码:
class Company
{
protected $employees;
public function __construct()
{
$this->employees = new ArrayCollection();
}
public function addEmployee(Employee $employee)
{
if ($this->employees->contains($employee)) {
return;
}
$this->employees->add($employee);
}
public function removeEmployee(Employee $employee)
{
if (!$this->employees->contains($employee)) {
return;
}
$this->employees->removeElement($employee);
}
}
Run Code Online (Sandbox Code Playgroud)
class Employee
{
// ... firstName and lastName properties...
public function __construct(Company $company, $firstName, $lastName)
{
$this->company = …Run Code Online (Sandbox Code Playgroud) 在我的 Symfony 4 应用程序中,我有一个包含日期类型字段的实体。默认情况下,Symfony 将其呈现为一组月、日、年的选择框。我已将其更改为文本小部件,以便我可以使用 jQuery UI 日期选择器。
但我在尝试提交表格时遇到了问题。
这是我的实体上的字段:
/**
* @ORM\Column(type="date")
*/
private $start_date;
Run Code Online (Sandbox Code Playgroud)
这是我显示该字段的方式:
$builder->add('start_date', DateType::class, [
'widget' => 'single_text',
// prevents rendering it as type="date", to avoid HTML5 date pickers
'html5' => false,
// adds a class that can be selected in JavaScript
'attr' => ['class' => 'js-datepicker'],
])
Run Code Online (Sandbox Code Playgroud)
在我的页面上使用 jquery 和 jqueryui,这允许显示日期选择器。
以下是我目前正在尝试从日期转换为字符串的方法,反之亦然。目前,我只是尝试使用硬编码日期,一旦我知道我在做什么,我当然会更改它。
$builder->get('start_date')
->addModelTransformer(new CallbackTransformer(
function ( $dateAsString ) {
return new \DateTime('2019-01-01');
},
function ( $dateAsDate ) {
return '2019-01-01';
}
));
Run Code Online (Sandbox Code Playgroud)
提交表单会产生此错误:预期参数类型为“DateTimeInterface”,给定“string”。 …
symfony ×10
symfony-forms ×10
php ×4
doctrine-orm ×1
form-fields ×1
forms ×1
select2 ×1
sonata ×1
sonata-admin ×1
validation ×1