我在两个单独的上下文中使用表单类:既创建新记录又编辑该记录.我按如下方式设置了一个后验证器,以检查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处理这个问题的方法是什么?基本上我希望它在保存时忽略自身(不存在重复),但仍然运行后验证器以确保不存在真正的重复.
我认为在symfony2 Form和Validator组件上创建客户端表单验证非常有用.
执行此操作的最佳方法是将验证约束传递给表单视图.有了这些信息,就可以制作一个模板,将表单字段呈现为:
<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对象中获取应用于一个表单字段的所有验证约束?
如何在视图中添加保存和返回列表按钮以创建新记录?一般来说,我想要更多的按钮,所以我正在寻找一个通用的答案.
编辑:默认生成器为我提供了两个按钮:
- 保存
- 保存并添加
我想要一个按钮saves and takes me back to the list.而且我还想要一个带有自定义动作的自定义按钮.
让我解释一下实际情况:
我有一个列表操作create,将我带到一个具有一些输入字段的表单.现在我想使用这些字段的数据制作图像.我想在表单的右侧将此图像显示为预览.为此我需要一个预览按钮,这样无论何时按下,它都会将数据提交给自己进行预览和进一步修改.
我希望现在更清楚了.
我的表单作为字段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中创建表单时使用条件语句.
我在一般情况下使用选择小部件.如果用户选择" 其他 " 选项,我想显示一个额外的文本框小部件.我想这可以在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个小部件上?
我正在使用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上执行此操作在我看来,只要我不想在后端某处禁用该功能,它就会导致一大堆问题.
有没有更好的方法呢?
在我们的Symfony2项目中,我们有一个非常复杂的结构,用于嵌入表单的表单....现在我们需要以特定的顺序带来表单的输出.
这就是问题所在:我们使用form_widget(form),现在我们正在寻找对象中的解决方案(例如通过注释)或formbuilder将特定字段移动到表单的末尾.在symfony 1.4中,它是widget-movefield()函数,我猜...
谢谢...
我有一个用户注册表单,表单中只有用户名字段.在我的表单中,我希望只允许用户输入用户名.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) 我有一个映射到表单的实体,但我不希望所有字段都可编辑,但仍希望显示该值.
例如,这是我的表单类型:
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) 我手动生成表单的请求内容,并希望设置如下数据:
form[1][]=2&form[2][]=3&form[3][]=5&form[4][]=8&form[apply]=
Run Code Online (Sandbox Code Playgroud)
Symfony Request对象有一个getContent()方法,但没有setContent().
如何设置内容?
symfony-forms ×10
symfony ×6
symfony-2.1 ×3
doctrine-orm ×2
php ×2
symfony-1.4 ×2
symfony1 ×2
doctrine ×1
request ×1
symfony-2.4 ×1
twig ×1
validation ×1