好的,所以我有一个有两个选项的选择表
$builder->add('type', 'choice', array(
'label' => 'User type',
'choices' => array('1' => 'Customer', '2' => 'Supplier'),
'expanded' => true,
'multiple' => false,
'required' => false,
));
Run Code Online (Sandbox Code Playgroud)
我想使用twig在视图中拆分选项来得到这样的东西:
{{ form_widget(form.type/choice_1/) }}
some html stuf
{{ form_widget(form.type/choice_2/) }}
Run Code Online (Sandbox Code Playgroud)
任何sugestions?
我正在安装Symfony 1.4,我们需要重新设计以匹配新的公司品牌.新皮肤的要求之一是单选按钮具有以下语法 -
<label><input name="foo" type="radio" value="bar" id="foo_bar"><span></span></label>
Run Code Online (Sandbox Code Playgroud)
但是单选按钮的默认Symfony代码是 -
<input name="foo" type="radio" value="bar" id="foo_bar">
Run Code Online (Sandbox Code Playgroud)
我可以更改模板在哪里添加附加元素以包围输入标记?我通过代码搜索了高低,我似乎无法找到生成此代码的位置.
提前致谢!
我定义了这个实体:
namespace CategoryBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity
* @ORM\Table(name="category")
*/
class Category {
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*
*/
protected $id;
/**
*
* @ORM\Column(type="string", length=255, nullable=false)
*/
protected $name;
/**
*
* @ORM\Column(type="integer", nullable=true)
*/
protected $parent;
/**
*
* @ORM\Column(type="string", length=255, nullable=true)
*/
protected $description;
/**
*
* @ORM\Column(type="integer")
*/
protected $age_limit;
/**
* @Gedmo\Timestampable(on="create")
* @ORM\Column(name="created", type="datetime")
*/
protected $created;
/**
* @Gedmo\Timestampable(on="update")
* @ORM\Column(name="modified", type="datetime")
*/ …Run Code Online (Sandbox Code Playgroud) 如果未提交相应的表单输入,我会遇到 symfony2 表单的问题,该表单会通过 null 覆盖我的实体数据。
下面是一个例子:
表格类型:
$builder
->add('customerid', 'text')
->add('field1', 'text')
->add('field2', 'text')
...
Run Code Online (Sandbox Code Playgroud)
控制器 :
$customer = new Customer();
$customer->setId('the customerID');
$customerForm = $this->createForm(new CustomerType(), $customer);
if ($request->getMethod() == 'POST') {
$customerForm->bind($request);
...
}
Run Code Online (Sandbox Code Playgroud)
在视图中,我不呈现 customerid 文本字段。仅提交其他字段。
提交表单后,$customerForm->bind($request); 即使没有为其提交空值,也会通过 null 覆盖先前设置的 customerID。
如果未呈现输入字段,有没有办法不覆盖该值?
这里似乎是同样的问题:https : //github.com/symfony/symfony/issues/1341 提交了补丁,但我没有找到有关如何使用它的文档。
谢谢
有一个2.3的新功能有多个提交按钮,
但我发送我的表格与ajax
$.post("{{ path('order_ad_banner') }}",
$('#adOrderForm').serialize() + "&" + $.param({url: "{{ url }}"}),
function (data) {
$('#formWindow').html(data);
}
);
Run Code Online (Sandbox Code Playgroud)
这是我的按钮:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
....
->add('step2submit', 'submit', array('validation_groups' => array("order step 2")))
->add('step3submit', 'submit')
->add('step4submit', 'submit')
;
}
Run Code Online (Sandbox Code Playgroud)
如何使用带有ajax的'step2submit'按钮模拟提交?
编辑:找到解决方案 - >在发布之前向表单添加隐藏字段
var input = $("<input>").attr("type", "hidden").attr("name", 'adOrder[step2submit]').val("");
$('#adOrderForm').append(input);
$.post("{{ path('order_ad_banner') }}",
$('#adOrderForm').serialize() + "&" + $.param({url: "{{ url }}"}),
function (data) {
$('#formWindow').html(data);
}
);
Run Code Online (Sandbox Code Playgroud) 我有一个控制器发布表格.
public function myPostAction(Request $request)
{
$form = $this->createForm('my_form', $my_object);
$form->handleRequest($request);
#...
Run Code Online (Sandbox Code Playgroud)
我可以看到我的CSRF令牌作为参数发布
my_form [_token] => lH38HTm5P0Cv3TOc4-9xi2COx-cZ670mpJ_36gR8ccI
我只需要阅读它
$form->get('_token')
Run Code Online (Sandbox Code Playgroud)
这告诉我
儿童"_token"不存在.
我怎样才能得到这个令牌?
我有一个带有嵌入表单的父表单。在嵌入(子)表单中,我希望创建一个下拉字段,其中包含从数据库查询的另一个实体的选项。作为查询的一部分,我需要引用父实体,但不确定如何从子表单类访问该父对象。
例如,父级是$subscriber实体。就我而言,父表单实际上不显示与订阅者相关的任何属性,仅允许您添加或删除子实体表单。每个子表单必须具有如上所述的字段,但选择需要限制为订阅者已经与之建立关系的值。
但这就是我的问题所在。如何$subscriber从子窗体中使用的代码访问下面的变量?:
$builder->add('otherEntity', EntityType::class, array(
'class' => "AppBundle:YetAnotherEntity",
'label' => "Other Entity",
'query_builder' => $this->manager->getRepository("AppBundle:OtherEntity")->getOtherEntityBySubscriber($subscriber)
));
Run Code Online (Sandbox Code Playgroud)
它又在我的存储库中调用此函数:
public function getOtherEntityBySubscriber($subscriber)
{
return $this->getEntityManager()
->createQuery(
'SELECT o FROM AppBundle:OtherEntity o JOIN n.subscriberOtherEntity so WHERE o.subscriber = :subscriber'
)
->setParameter("subscriber", $subscriber)
->getResult();
}
Run Code Online (Sandbox Code Playgroud)
在 jbafford 的建议之后:我尝试了您的第一个选项,但我的问题是我的父表单调用的类型CollectionType::class不是我的自定义类型...因为我计划制作一个可以添加多个子项目的表单。我无法将任何自定义选项传递给CollectionType. 我是否需要扩展CollectionType以创建能够接受额外选项的自己的类型?
我的父表单如下所示:
$builder->add('child', CollectionType::class, array(
"entry_type" => ChildType::class,
"allow_add" => true,
"by_reference" => false,
"allow_delete" => true)
);
Run Code Online (Sandbox Code Playgroud)
如果我将订阅者添加为上面的选项,我会收到一个错误,基本上说它不是有效的选项。我尝试让我的 ChildType 扩展 CollectionType 但我不认为这是我需要做的,并收到一条错误消息:
表单的视图数据应该是类 AppBundle\Entity\Child …
我目前正在学习Symfony表格.而我遇到麻烦的代码并没有按照我想要的方式工作.我要做的是让用户向我的默认控制器提交数据,并且该数据是有效的,将其重定向到另一个方法,以便我可以执行诸如将数据提交到数据库之类的操作.
我遇到的问题是将数据传递给另一个命名路径,该数据是一个带有简单名称和日期字段的任务对象.
以下是我编写的一些代码,它只是一种基本形式,作为一种类结构.
TaskType.php
namespace AppBundle\Entity\Forms;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use AppBundle\Entity\Forms\Task;
use Symfony\Component\OptionsResolver\OptionsResolver;
class TaskType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('task', TextType::class)
->add('dueDate', DateType::class, array('label' => 'Register'))
->add('save', SubmitType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Task::class,
));
}
Run Code Online (Sandbox Code Playgroud)
DefaultController.php
...
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Forms\TaskType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
...
/**
* @Route("/", name="homepage")
*/
public …Run Code Online (Sandbox Code Playgroud) 我是symfony的新手,想要创建一个简单的联系表单,获取提交的值并将其作为电子邮件发送.我不想在数据库中保存任何内容.
我按照此页面上的文档:https://symfony.com/doc/current/form/without_class.html
我使用上面的代码创建了一个新页面/操作:
/**
* @Route("/contact", name="page_contact")
*/
public function contact(Request $request)
{
$defaultData = ['message' => 'Type your message here'];
$form = $this->createFormBuilder($defaultData)
->add('name', TextType::class)
->add('email', EmailType::class)
->add('message', TextareaType::class)
->add('send', SubmitType::class)
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// data is an array with "name", "email", and "message" keys
$data = $form->getData();
}
return $this->render('Shop/contact.html.twig', [
'form' => $form
]);
}
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误:
Symfony\Component\Form\Exception\InvalidArgumentException:
Could not load type "Doctrine\DBAL\Types\TextType": class does not implement "Symfony\Component\Form\FormTypeInterface".
at vendor/symfony/form/FormRegistry.php:89
at …Run Code Online (Sandbox Code Playgroud) 我正在使用 FosUserBundle 运行 Symfony 3.4。我定制了注册表以获得Roles包含的内容:
<?php
$form->add('roles', ChoiceType::class, array(
'choices' => array(
'user' => 'ROLE_USER',
'admin' => 'ROLE_ADMIN'
),
'label' => 'Role :',
'expanded' => true,
'multiple' => true
));
Run Code Online (Sandbox Code Playgroud)
然后现在可以通过 2 个新复选框在注册表中选择角色......但我想用<select>标签显示它。当我将expanded选项设置false为选择时,但如果我将multiple选项设置为 FALSE,则会出现错误:
数组到字符串的转换
有什么想法可以解决我的问题吗?
编辑:下面是堆栈跟踪:
Symfony\Component\Debug\Exception\ContextErrorException:
Notice: Array to string conversion
at vendor\symfony\symfony\src\Symfony\Component\Form\ChoiceList\ArrayChoiceList.php:73
at Symfony\Component\Form\ChoiceList\ArrayChoiceList->Symfony\Component\Form\ChoiceList\{closure}(array('ROLE_USER'))
at call_user_func(object(Closure), array('ROLE_USER'))
(vendor\symfony\symfony\src\Symfony\Component\Form\ChoiceList\ArrayChoiceList.php:158)
at Symfony\Component\Form\ChoiceList\ArrayChoiceList->getValuesForChoices(array(array('ROLE_USER')))
(vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer.php:32)
at Symfony\Component\Form\Extension\Core\DataTransformer\ChoiceToValueTransformer->transform(array('ROLE_USER'))
(vendor\symfony\symfony\src\Symfony\Component\Form\Form.php:1104)
at Symfony\Component\Form\Form->normToView(array('ROLE_USER'))
(vendor\symfony\symfony\src\Symfony\Component\Form\Form.php:350)
at Symfony\Component\Form\Form->setData(array('ROLE_USER'))
(vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper.php:49)
at Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper->mapDataToForms(object(User), object(RecursiveIteratorIterator))
(vendor\symfony\symfony\src\Symfony\Component\Form\Form.php:383)
at Symfony\Component\Form\Form->setData(object(User))
(vendor\friendsofsymfony\user-bundle\Controller\RegistrationController.php:70) …Run Code Online (Sandbox Code Playgroud) symfony-forms ×10
symfony ×9
php ×4
forms ×2
symfony-2.3 ×2
csrf ×1
form-submit ×1
jquery ×1
symfony-1.4 ×1
symfony-3.2 ×1
symfony-3.4 ×1
symfony1 ×1
symfony4 ×1
twig ×1