Symfony表单组件是一个独立的库,可以在Symfony项目之外使用。
添加选项字段后是否可以更新它? $builder ->add('考试', '实体', 数组( 'class' => 'TelegrammeExamenBundle:ExamExamen', '财产' => '我...
我想知道是否有可能排除某些表单字段持久/刷新到数据库(但保持“映射”=> true)。 我想达到用户添加一行的效果(Devi...
属性路径中给出的预期参数类型为“string”、“null”
实际上,当我尝试通过发送空字段来编辑表单时,会出现上述错误, 我的 UserType 类如下所示: UserType 类扩展 AbstractType { 公共函数 buildForm(
我不明白为什么某些约束在验证后不会在错误消息中插入属性名称。我有这个实体类: 我不明白为什么某些约束在验证后不会在错误消息中插入属性名称。我有这个实体类: <?php namespace AC\OperaBundle\Entity; use Doctrine\ORM\Mapping as ORM; use AC\UserBundle\Entity\Utente; use Symfony\Component\Validator\Constraints as Assert; /** * Class Episodio * @package AC\OperaBundle\Entity * @ORM\Entity(repositoryClass="AC\OperaBundle\Repository\EpisodioRepository") * * @ORM\Table( * name="ac_Episodio", * uniqueConstraints={@ORM\UniqueConstraint(name="unique_idx", columns={"opera", "numero_episodio", "extra"})}, * indexes={ @ORM\Index(name="opera_idx", columns={"opera"}), * @ORM\Index(name="numero_episodio_idx", columns={"numero_episodio"}), * @ORM\Index(name="extra_idx", columns={"extra"}), * @ORM\Index(name="attivo_idx", columns={"attivo"}) }) */ class Episodio { /** * @var int * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @var Opera * * @ORM\ManyToOne(targetEntity="AC\OperaBundle\Entity\Opera", inversedBy="episodi") * @ORM\JoinColumn(name="opera", referencedColumnName="id", nullable=false) */ protected $opera; /** * @var string * * @ORM\Column(name="numero_episodio", type="string", length=5, nullable=false) */ protected $numero_episodio; /** * @var string * * @ORM\Column(name="extra", type="string", length=30, nullable=false) */ protected $extra; /** * @var string * * @ORM\Column(name="titolo_italiano", type="string", length=150, nullable=false) * @Assert\NotBlank() */ protected $titolo_italiano; /** * @var string * * @ORM\Column(name="titolo_originale", type="string", length=150, nullable=false) * @Assert\NotBlank() */ protected $titolo_originale; /** * @var \DateTime * * @ORM\Column(name="data_ita", type="date", nullable=true) * @Assert\Date() */ protected $data_ita; /** * @var \DateTime * * @ORM\Column(name="data_jap", type="date", nullable=true) * @Assert\Date() */ protected $data_jap; /** * @var int * * @ORM\Column(name="durata", type="smallint", nullable=false, options={"default" = 0}) */ protected $durata; /** * @var string * * @ORM\Column(name="trama", type="text", nullable=false) */ protected $trama; /** * @var int * * @ORM\Column(name="ordine", type="smallint", nullable=false, options={"default" = 0}) */ protected $ordine; /** * @var int * * @ORM\Column(name="promosso", type="integer", nullable=false, options={"default" = 0}) */ protected $promosso; /** * @var int * * @ORM\Column(name="rimandato", type="integer", nullable=false, options={"default" = 0}) */ protected $rimandato; /** * @var int * * @ORM\Column(name="bocciato", type="integer", nullable=false, options={"default" = 0}) */ protected $bocciato; /** * @var boolean * * @ORM\Column(name="fansub", type="boolean", nullable=false) */ protected $fansub; /** * @var boolean * * @ORM\Column(name="attivo", type="boolean", nullable=false) */ protected $attivo; /** * @var \DateTime * * @ORM\Column(name="data_aggiornamento", type="date") */ protected $data_aggiornamento; /** * @var Utente * * @ORM\ManyToOne(targetEntity="AC\UserBundle\Entity\Utente") * @ORM\JoinColumn(name="utente_aggiornamento", referencedColumnName="id", nullable=true) */ protected $utente_aggiornamento; /** * @param boolean $attivo */ public function setAttivo($attivo) { $this->attivo = $attivo; } /** * @return boolean */ public function getAttivo() { return $this->attivo; } /** * @param int $bocciato */ public function setBocciato($bocciato) { $this->bocciato = $bocciato; } /** * @return int */ public function getBocciato() { return $this->bocciato; } /** * @param \DateTime $data_aggiornamento */ public function setDataAggiornamento($data_aggiornamento) { $this->data_aggiornamento = $data_aggiornamento; } /** * @return \DateTime */ public function getDataAggiornamento() { return $this->data_aggiornamento; } /** * @param \DateTime $data_ita */ public function setDataIta($data_ita) { $this->data_ita = $data_ita; } /** * @return \DateTime */ public function getDataIta() { return $this->data_ita; } /** * @param \DateTime $data_jap */ public function setDataJap($data_jap) { $this->data_jap = $data_jap; } /** * @return \DateTime */ public function getDataJap() { return $this->data_jap; } /** * @param int $durata */ public function setDurata($durata) { $this->durata = $durata; } /** * @return int */ public function getDurata() { return $this->durata; } /** * @param string $extra */ public function setExtra($extra) { $this->extra = $extra; } /** * @return string */ public function getExtra() { return $this->extra; } /** * @param boolean $fansub */ public function setFansub($fansub) { $this->fansub = $fansub; } /** * @return boolean */ public function getFansub() { return $this->fansub; } /** * @param int $id */ public function setId($id) { $this->id = $id; } /** * @return int */ public function getId() { return $this->id; } /** * @param string $numero_episodio */ public function setNumeroEpisodio($numero_episodio) { $this->numero_episodio = $numero_episodio; } /** * @return string */ public function getNumeroEpisodio() { return $this->numero_episodio; } /** * @param \AC\OperaBundle\Entity\Opera $opera */ public function setOpera($opera) { $this->opera = $opera; } /** * @return \AC\OperaBundle\Entity\Opera */ public function getOpera() { return $this->opera; } /** * @param int $ordine */ public function setOrdine($ordine) { $this->ordine = $ordine; } /** * @return int */ public function getOrdine() { return $this->ordine; } /** * @param int $promosso */ public function setPromosso($promosso) { $this->promosso = $promosso; } /** * @return int */ public function getPromosso() { return $this->promosso; } /** * @param int $rimandato */ public function setRimandato($rimandato) { $this->rimandato = $rimandato; } /** * @return int */ public function getRimandato() { return $this->rimandato; } /** * @param string $titolo_italiano */ public function setTitoloItaliano($titolo_italiano) { $this->titolo_italiano = $titolo_italiano; } /** * @return string */ public function getTitoloItaliano() { return $this->titolo_italiano; } /** * @param string $titolo_originale */ public function setTitoloOriginale($titolo_originale) { $this->titolo_originale = $titolo_originale; } /** * @return string */ public function getTitoloOriginale() { return $this->titolo_originale; } /** * @param string $trama */ public function setTrama($trama) { $this->trama = $trama; } /** * @return string */ public function getTrama() { return $this->trama; } /** * @param \AC\UserBundle\Entity\Utente $utente_aggiornamento */ public function setUtenteAggiornamento($utente_aggiornamento) { $this->utente_aggiornamento = $utente_aggiornamento; } /** * @return \AC\UserBundle\Entity\Utente */ public function getUtenteAggiornamento() { return $this->utente_aggiornamento; } } 在控制器中,在 $form->isValid() 方法中执行 classi 调用以检查验证。如果出现错误,我会致电 $form->getErrorsAsString(),结果如下: ERROR: This value should not be blank. ERROR: This value should not be blank. numeroEpisodio: No errors titoloItaliano: No errors titoloOriginale: No errors dataIta: ERROR: This value is not valid. dataJap: ERROR: This value is not valid. durata: No errors trama: No errors extra: No errors fansub: No errors 使用@Assert\NotBlank()的属性不要将属性名称放入错误消息中!因此,我有前两个错误行与 e generic: ERROR: This value should not be blank. ERROR: This value should not be blank. 我不知道验证失败的属性是谁。我查看了 Symfony 组件的源代码,发现非空白约束: /** * @author Bernhard Schussek <[email protected]> * * @api */ class NotBlankValidator extends ConstraintValidator { /** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { if (!$constraint instanceof NotBlank) { throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\NotBlank'); } if (false === $value || (empty($value) && '0' != $value)) { $this->context->addViolation($constraint->message); } } } 对于数据约束: /** * @author Bernhard Schussek <[email protected]> * * @api */ class DateValidator extends ConstraintValidator { const PATTERN = '/^(\d{4})-(\d{2})-(\d{2})$/'; /** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { if (!$constraint instanceof Date) { throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\Date'); } if (null === $value || '' === $value || $value instanceof \DateTime) { return; } if (!is_scalar($value) && !(is_object($value) && method_exists($value, '__toString'))) { throw new UnexpectedTypeException($value, 'string'); } $value = (string) $value; if (!preg_match(static::PATTERN, $value, $matches) || !checkdate($matches[2], $matches[3], $matches[1])) { $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); } } } 重要的区别是 $this->context->addViolation($constraint->message); VS $this->context->addViolation($constraint->message, array('{{ value }}' => $value)); 为什么? 这是控制器的核心部分 if ($request->getMethod() == 'POST') { try { $form->handleRequest($request); if ($form->isValid()) { /* @var $item Episodio */ $item = $form->getData(); $em->persist($item); $em->flush(); $msg = new Message(true, Message::OK_MESSAGE); } else { $msg = new Message(false, Message::KO_MESSAGE); $errors = Utility::getErrorMessages($form); $msg->setData($errors); } } catch (\Exception $ex) { $msg = new Message(false, $ex->getMessage()); } return new Response($this->get('jms_serializer')->serialize($msg, 'json')); } 这是从表单获取错误的实用程序类 class Utility { static function getErrorMessages(\Symfony\Component\Form\Form $form) { $errors = array(); foreach ($form->getErrors() as $key => $error) { $template = $error->getMessageTemplate(); $parameters = $error->getMessageParameters(); foreach($parameters as $var => $value){ $template = str_replace($var, $value, $template); } $errors[$key] = $template; } //if ($form->hasChildren()) { foreach ($form->all() as $child) { if (!$child->isValid()) { $errors[$child->getName()] = Utility::getErrorMessages($child); } } //} return $errors; } } 表格类 class EpisodioForm extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('numeroEpisodio', 'text'); $builder->add('titoloItaliano', 'text',array()); $builder->add('titoloOriginale', 'text'); $builder->add('dataIta', 'date', array('widget' => 'single_text', 'format' => 'dd/MM/yyyy')); $builder->add('dataJap', 'date', array('widget' => 'single_text', 'format' => 'dd/MM/yyyy')); $builder->add('durata', 'text'); $builder->add('trama', 'textarea'); $builder->add('extra', 'text'); $builder->add('fansub', 'checkbox'); } /** * Returns the name of this type. * * @return string The name of this type */ public function getName() { return "episodio_form"; } } 框架版本是Symfony 2.4 为什么$this->context->addViolation($constraint->message); VS $this->context->addViolation($constraint->message, array('{{ value }}' => $value));? 这是因为日期约束验证器在错误消息中显示了验证失败的值,例如 45.04.2014 is not a valid date. 而 NotBlank 约束验证器则不需要,因为导致错误的值始终为空。 将属性名称放入错误消息中 这可以实现: 将实体中约束的注释更改为: class Episodio { /** * @Assert\NotBlank(message="'titolo_italiano' should not be blank.") */ protected $titolo_italiano; /** * @Assert\NotBlank(message="'titolo_originale' should not be blank.") */ protected $titolo_originale; } 为了便于阅读,我省略了实体中的列定义和其他字段。 或者通过定义自定义验证器将属性名称传递给错误消息: 约束: class MyCustomNotBlank extends NotBlank { public $message = "'{{ propertyName }}' should not be blank."; } 验证者: use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator; class MyCustomNotBlankValidator extends ConstraintValidator { public function validate($value, Constraint $constraint) { if (!$value) { $this->context->addViolation( $constraint->message, array('{{ propertyName}}' => $this->context->getPropertyPath()) ); } } } 这向您展示了如何定义自定义验证约束: http://symfony.com/doc/current/cookbook/validation/custom_constraint.html 获取带有属性名称和错误消息的键值数组 Afaik,Symfony2 的表单组件中没有函数可以做到这一点,所以必须实现它。 请参阅https://stackoverflow.com/a/13763053/277106。您可以将该函数添加到服务中以实现可重用性。在您的 (AJAX) 控制器中您可以执行以下操作: public function someAction(Request $request) { $errors = array(); $form = $this->createForm(new MyType); if (!$form->bindRequest($request)->isValid()) { $errors = $this->myFormService->getErrorMessages($form); } else { // save the entity } return JsonResponse($errors); }
我正在尝试创建用于测验的 Symfony 表单,其中每个问题都有问题和选择(请参阅实体代码)。我有 RequestQuestion 实体,其中包含描述、isActive、选择。选择...
输出 App\Entity\TourPackage {#313 ▼ -id: null -tour_category: "culture_tour" -价格:"3400" -tour_overview: """ 旅游套餐图片1 输出 App\Entity\TourPackage {#313 ▼ -id: null -tour_category: “文化旅游”-价格:“3400”-旅游概述:“”“ <div>tourPackageImage1</div> """ -images: Doctrine\Common\Collections \ ArrayCollection {#314 ▼ -elements: array:2 [▼ 0 => App\Entity \ Images {#630 ▼ -id: null -image_name: null -tourPackage: App\Entity \ TourPackage {#313} } 1 => App\Entity \ Images {#438 ▼ -id: null -image_name: "random_image.jpg" -tourPackage: App\Entity \ TourPackage {#313} } ] } -itinerary: Doctrine\Common\Collections \ ArrayCollection {#315 ▶} } 旅游套餐类型 ->add('images',CollectionType::class,[ 'entry_type' => ImageType::class, 'allow_add' => true, 'allow_delete' => true, 'prototype' => true, 'label' => false, 'by_reference' => false, ]) 图像类型 $builder ->add('tour_image_1', FileType::class,[ 'mapped' => false, 'required' => false ]) ->add('tour_image_2', FileType::class,[ 'mapped' => false, 'required' => false ]) ->add('tour_image_3', FileType::class,[ 'mapped' => false, 'required' => false ]) ; 控制器 $tourPackageImage1 = $request->files->get('tour_package')['images']['__name__']['tour_image_1']; $tourPackageImage2 = $request->files->get('tour_package')['images']['__name__']['tour_image_2']; $tourPackageImage3 = $request->files->get('tour_package')['images']['__name__']['tour_image_3']; $tour_images = [$tourPackageImage1, $tourPackageImage2, $tourPackageImage3]; $images = new Images(); $images->setImageName($uploadImage->uploadImage($tourPackageImage1)); $tourPackage->addImage($images); dd($tourPackage); 当 dd($tourPackage) 时,第一个数组为空。我什至试图让条件不起作用。如何解决这个问题? 0 => App\Entity \ Images {#630 ▼ -id: null -image_name: null -tourPackage: App\Entity \ TourPackage {#313} } 1 => App\Entity \ Images {#438 ▼ -id: null -image_name: "random_image.jpg" -tourPackage: App\Entity \ TourPackage {#313} } 如果上传 3 张图片,则第 1 张为空,在空数组后添加 3 张图片。如何删除空数组? 我建议: $tourPackageValid = array_filter($tourPackage, function ($item){ return $item->getImageName() !== null; });
在SF4.4中使用setData批量设置Symfony表单字段值
在我的 Symfony 4.4 应用程序中,我的控制器中有以下代码。我正在尝试根据以前提交的内容或从数据库中提取的数据来预先填充表单。重要的是,
为了避免使用多个 FormType 文件,我使用 PATCH 方法提交表单。 但是 symfony handleRequest() 没有提交,因为表单配置和 r 之间的方法存在差异...
““App\Entity\Brand”类中的“isEnabled”方法需要 0 个参数,但应该只接受 1 个”
我正在尝试使用学说在数据库中保存一个简单的表格。我创建的实体 - 让其命名为 Brand - 使用 php bin/console make:entity 有一个布尔属性: #[ORM\Entity(repositoryClass:
使用 AJAX 和 PreSubmit 事件处理动态下拉菜单
我正在开发一个 Symfony 项目,我需要根据用户选择动态填充两个下拉列表。该过程涉及选择一个“品牌”,然后更新“型号和q...
如何独立使用 2.0.* 版本的 symfony-form 组件? 文档中的示例展示了如何创建表单,但它们使用了 symfony 生态系统的其他部分,例如控件...
我有三个实体,fos_user、命令和首选项。用户可以向自己发送一封电子邮件,其中包含每个实体的特定字段,这些字段不能为空。因此,当用户决定选择...
教区: ID 教区名称 1 DJ 2 千斤顶 一对多 教区: ID 教区_id 教区名称 1 1 圣裘德 2 1 圣马可 3 2 圣彼得 4 2 圣托马斯 我想做一个下拉动态: 当用户 cl...
尝试更新实体并提交值未更改的字段会导致类型错误。我做错了什么? 实体: 命名空间应用\实体; 使用 Symfony\Component\Validator\
我正在开发基于 Symfony 4 和 Select2 库的应用程序。 在我的 src/Form/PostType.php 文件中,我声明了字段标记,用户应该能够在其中设置预先声明的标记之一或添加新标记(按类型 ta...
使用 PHP 7.1.33,我正在为我的项目创建一个新数据库,这个问题出现在我身上 php bin/console 学说:数据库:创建 在 AbstractPostgreSQLDriver.php 第 79 行: 发生异常...
我正在开发一个 symfony 6.4 项目,其中我有一个包含 2 个字段的 ProductType 表单,这两个字段都是 EntityType。仅在创建项目时,我需要能够设置禁止
我有具有多对多关系的帖子和标签实体。在帖子创建和编辑表单中,有一个文本框,我可以在其中输入与该帖子相关的用逗号分隔的标签。例如,当我输入
Symfony2.7 字段使用验证组和 UniqueEntity 验证两次
字段验证两次,导致 2 次数据库调用和 2 次相同的错误消息。 我有 Subscriber 类,主要的 User,Registration 类和 RegistrationType,其中嵌入 SubscriberType 作为教程...
如何从 twig Symfony 5.2 覆盖 form_errors() ?
如何覆盖 Symfony 5.2 中的表单字段验证错误模板? 我在树枝中有这样的形式 {{ form_start(registrationForm) }} 名称: {{ 形式...