标签: symfony-forms

更新/编辑上下文中的sfValidatorDoctrineUnique

我在两个单独的上下文中使用表单类:既创建新记录又编辑该记录.我按如下方式设置了一个后验证器,以检查URL字段是否唯一.

$this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
   new sfValidatorDoctrineUnique(array('model' => 'Page', 'column' => array('url')), array('invalid' => 'This URL already exists.'))
)));
Run Code Online (Sandbox Code Playgroud)

当我创建新记录时,验证器工作得很好.但是,在编辑现有记录时,它会抛出错误,因为它将自身检测为重复.换句话说,如果我编辑记录但不对URL进行任何更改,则会引发重复错误.

这一定是一个常见问题,所以我想知道Symfony处理这个问题的方法是什么?基本上我希望它在保存时忽略自身(不存在重复),但仍然运行后验证器以确保不存在真正的重复.

doctrine symfony1 symfony-1.4 symfony-forms

7
推荐指数
2
解决办法
3049
查看次数

在Symfony2中创建组合的客户端和服务器端验证

我认为在symfony2 FormValidator组件上创建客户端表单验证非常有用.

执行此操作的最佳方法是将验证约束传递给表单视图.有了这些信息,就可以制作一个模板,将表单字段呈现为:

<div>
    <label for="form_email">E-Mail</label>
    <input 
        id="form_email" type="text" name="form[email]" value=""
        data-validation-constraints='{"NotBlank":{},"MinLength":{"limit":6}}'
    />
</div>
Run Code Online (Sandbox Code Playgroud)

然后,JavaScript部分将查找<input>具有该data-validation-constraints属性的所有元素并为它们创建正确的验证.

要将验证约束传递给表单视图,我认为最好的方法是创建表单类型扩展.这就是我的问题:这是正确的方法吗?这怎么可能?

在片刻,我的表单类型扩展如下所示:

use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormBuilder;

class FieldTypeExtension extends \Symfony\Component\Form\AbstractTypeExtension{

    public function getExtendedType(){
        return 'field';
    }

    public function buildView(FormView $view, FormInterface $form)
    {
        // at this point i didn't find a way to get the 
        // validation constraints out of the $form
        // the `getAllValidationConstraints` here is just an example
        $view->set('validation_constraints', $form->getAllValidationConstraints());
    }

}
Run Code Online (Sandbox Code Playgroud)

如何从FormInterface对象中获取应用于一个表单字段的所有验证约束?

php validation symfony-forms symfony

7
推荐指数
1
解决办法
3716
查看次数

Symfony管理生成器 - 用于保存和返回列表的按钮

如何在视图中添加保存和返回列表按钮以创建新记录?一般来说,我想要更多的按钮,所以我正在寻找一个通用的答案.

编辑:默认生成器为我提供了两个按钮:

  1. 保存
  2. 保存并添加

我想要一个按钮saves and takes me back to the list.而且我还想要一个带有自定义动作的自定义按钮.

让我解释一下实际情况:

我有一个列表操作create,将我带到一个具有一些输入字段的表单.现在我想使用这些字段的数据制作图像.我想在表单的右侧将此图像显示为预览.为此我需要一个预览按钮,这样无论何时按下,它都会将数据提交给自己进行预览和进一步修改.

我希望现在更清楚了.

php symfony1 symfony-1.4 admin-generator symfony-forms

7
推荐指数
1
解决办法
3917
查看次数

如何验证Symfony 2中至少一个元素(或N个元素)的选择?

我的表单作为字段users(实体类型).如何添加验证以便至少应选择一个用户?实际上我正在添加一个事件监听器,但我不知道这是否是一个合法的解决方案:

public function buildForm(\Symfony\Component\Form\FormBuilder $builder,
    array $options)
{
    $builder
        ->add('title', 'text', array(
            'label' => 'Titolo'
        ))
        ->add('content',  'textarea', array(
            'label' => 'Contenuto'
        ))
        ->add('sender_text',  'text', array(
            'label' => 'Mittente testuale',
        ))
        ->add('users', 'entity', array(
            'label'    => 'Destinatari',
            'class'    => 'DL\FidelityBundle\Entity\User',
            'property' => 'select_label',
            'multiple' => true
        ));
    ;

    // Valida il numero di utenti selezionati
    $builder->addEventListener(\Symfony\Component\Form\FormEvents::POST_BIND,
        function($event) {
            $form = $event->getForm();
            $data = $event->getData();

            if(!$data->users->isEmpty()) return;

            $msg = 'Occorre specificare almeno un utente destinatario';
            $form->get('users')->addError(new FormError($msg)); …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony doctrine-orm

7
推荐指数
3
解决办法
5883
查看次数

创建表单时使用条件语句

我想在Symfony中创建表单时使用条件语句.

我在一般情况下使用选择小部件.如果用户选择" 其他 " 选项,我想显示一个额外的文本框小部件.我想这可以在javascript中完成,但是我怎样才能将来自2个小部件的数据保存到我的实体中的同一个属性中?

到目前为止我有这个:

  $builder->add('menu', 'choice', array(
        'choices'   => array('Option 1' => 'Option 1', 'Other' => 'Other'),
        'required'  => false,
    ));
  //How to add text box if choice == Other ????
Run Code Online (Sandbox Code Playgroud)

我曾计划使用DataTransfomer,但是在2个小部件上?

symfony-forms symfony-2.1

7
推荐指数
1
解决办法
4786
查看次数

是否有更智能的方法来禁用Symfony2.1中的Doctrine2过滤器?

我正在使用Gedmo Doctrine Extensions,例如SoftDeletable,并且在各个点我需要禁用此过滤器,以便用户可以与软删除的实体或实体的软删除关系进行交互.

这包括但不限于一次在控制器中并且再次在SonataAdmin的特定区域中.

到目前为止,我发现的解决方案是在em上调用getFilters()并禁用softdeleteable,这很好.

然而,两个奏鸣曲管理类和控制器似乎都经历了多次执行,这导致致命的尝试禁用已经禁用的过滤器,所以我必须这样做:

    if (array_key_exists('softdeleteable', $this->em->getFilters()->getEnabledFilters())) {
        $this->em->getFilters()->disable('softdeleteable');
    }
Run Code Online (Sandbox Code Playgroud)

至少可以说这看起来很糟糕.

但是,还有其他问题,例如命令的范围.我还没有发现任何前端问题,但在管理员中,多次执行,其中一个是构建导航(我认为)意味着过滤器始终被禁用,并且只能直接在em上执行此操作在我看来,只要我不想在后端某处禁用该功能,它就会导致一大堆问题.

有没有更好的方法呢?

symfony-forms symfony doctrine-orm symfony-2.1

7
推荐指数
1
解决办法
4025
查看次数

Symfony 2 - 重新排列表单字段

在我们的Symfony2项目中,我们有一个非常复杂的结构,用于嵌入表单的表单....现在我们需要以特定的顺序带来表单的输出.

这就是问题所在:我们使用form_widget(form),现在我们正在寻找对象中的解决方案(例如通过注释)或formbuilder将特定字段移动到表单的末尾.在symfony 1.4中,它是widget-movefield()函数,我猜...

谢谢...

symfony-forms symfony symfony-2.1

7
推荐指数
3
解决办法
8339
查看次数

验证不在表单中但在实体中的字段

我有一个用户注册表单,表单中只有用户名字段.在我的表单中,我希望只允许用户输入用户名.Nicename与注册时的用户名相同.

此表单绑定到User实体,即在我的表单类型类中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Some\Bundle\Entity\User',
    ));
}
Run Code Online (Sandbox Code Playgroud)

实体User,具有为username和nicename设置的NotBlank约束.

namespace Some\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Constraints;

//...

class User
{
    //...

    /**
     * @var string $username
     *
     * @ORM\Column(name="user_login", type="string", length=60, unique=true)
     * @Constraints\NotBlank()
     */
    private $username;

    /**
     * @var string $nicename
     *
     * @ORM\Column(name="user_nicename", type="string", length=64)
     * @Constraints\NotBlank()
     */
    private $nicename;

    //...
Run Code Online (Sandbox Code Playgroud)

但是,如果我构建一个只有用户名而不是nicename的表单,则在验证时即$form->isValid()无法验证.

为了绕过这个,我想出了以下内容:

namespace Some\Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Some\Bundle\Form\Type\RegisterType;
//...

class UserController extends Controller
{
   //...
public function …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony

7
推荐指数
1
解决办法
2763
查看次数

从Twig中的表单访问映射的实体

我有一个映射到表单的实体,但我不希望所有字段都可编辑,但仍希望显示该值.

例如,这是我的表单类型:

class GameHasPlayerType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('inTeam', new TeamPositioningCheckboxType())
            ->add('positionX', new TeamPositioningNumberType(), array(
                'attr' => array(
                    'class' => 'in-table'
                )
            ))
            ->add('positionY', new TeamPositioningNumberType(), array(
                'attr' => array(
                    'class' => 'in-table'
                )
            ))
            ->add('exchanged', new TeamPositioningCheckboxType())
        ;
    }
}
Run Code Online (Sandbox Code Playgroud)

此类型具有自定义表单模板:

{% block team_positioning_widget %}
    {% spaceless %}
        <td>
            {{ form_widget(form.inTeam) }}
        </td>
        <td>
            {{ form.player.firstName }} {# Player is not in …
Run Code Online (Sandbox Code Playgroud)

symfony-forms twig symfony-2.4

7
推荐指数
1
解决办法
5838
查看次数

如何设置请求symfony的内容?

我手动生成表单的请求内容,并希望设置如下数据:

form[1][]=2&form[2][]=3&form[3][]=5&form[4][]=8&form[apply]=
Run Code Online (Sandbox Code Playgroud)

Symfony Request对象有一个getContent()方法,但没有setContent().

如何设置内容?

request symfony-forms symfony

7
推荐指数
2
解决办法
3512
查看次数