symfony-forms 相关问题

Symfony表单组件是一个独立的库,可以在Symfony项目之外使用。

CustomInput 的值在 POST 请求中不可见

我正在尝试在 Symfony 中构建一个基于 Web 组件的自定义表单类型。为了简单起见,我构建了一个自定义输入组件。 当我在 HTML 表单中使用该组件时,该组件似乎可以工作 - de...

回答 1 投票 0

在Symfony中,创建自定义表单类型时,为什么使用getParent而不是继承?

在Symfony中创建自定义字段时,有一个我们定义的方法getParent 我们通过从 AbstractType 类扩展来定义我们的类,然后使用 getParent 方法返回父类型。而不是

回答 2 投票 0

Symfony2 表单实体样式每个选项都不同(折叠)

解决方案: EntityType 中有一个 choice_attr 选项,该选项是在 Symfony 2.7 中引入的。这使得这个问题变得非常过时。 ->add('访客', EntityType::class, [ '班级' =>

回答 1 投票 0

在 Symfony2/Twig 中从 2 位国家代码获取翻译后的国家名称?

我正在使用 Symfony2 国家/地区字段类型,它运行良好并且国家/地区名称已翻译。我将两位数的国家/地区代码存储在我的实体的国家/地区列中。 我怎样才能显示完整的,

回答 8 投票 0

symfony 表单生成器更新选项字段

添加选项字段后是否可以更新它? $builder ->add('考试', '实体', 数组( 'class' => 'TelegrammeExamenBundle:ExamExamen', '财产' => '我...

回答 2 投票 0

防止刷新映射数据

我想知道是否有可能排除某些表单字段持久/刷新到数据库(但保持“映射”=> true)。 我想达到用户添加一行的效果(Devi...

回答 1 投票 0

属性路径中给出的预期参数类型为“string”、“null”

实际上,当我尝试通过发送空字段来编辑表单时,会出现上述错误, 我的 UserType 类如下所示: UserType 类扩展 AbstractType { 公共函数 buildForm(

回答 3 投票 0

Symfony 2 表单验证:验证消息中缺少属性名称

我不明白为什么某些约束在验证后不会在错误消息中插入属性名称。我有这个实体类: 我不明白为什么某些约束在验证后不会在错误消息中插入属性名称。我有这个实体类: <?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); }

回答 1 投票 0

Symfony Form - 带选择的问题(测验)

我正在尝试创建用于测验的 Symfony 表单,其中每个问题都有问题和选择(请参阅实体代码)。我有 RequestQuestion 实体,其中包含描述、isActive、选择。选择...

回答 1 投票 0

如何修复ArrayCollection中的空数组?

输出 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; });

回答 1 投票 0

在SF4.4中使用setData批量设置Symfony表单字段值

在我的 Symfony 4.4 应用程序中,我的控制器中有以下代码。我正在尝试根据以前提交的内容或从数据库中提取的数据来预先填充表单。重要的是,

回答 1 投票 0

handleRequest() 与 PATCH 方法

为了避免使用多个 FormType 文件,我使用 PATCH 方法提交表单。 但是 symfony handleRequest() 没有提交,因为表单配置和 r 之间的方法存在差异...

回答 2 投票 0

““App\Entity\Brand”类中的“isEnabled”方法需要 0 个参数,但应该只接受 1 个”

我正在尝试使用学说在数据库中保存一个简单的表格。我创建的实体 - 让其命名为 Brand - 使用 php bin/console make:entity 有一个布尔属性: #[ORM\Entity(repositoryClass:

回答 1 投票 0

使用 AJAX 和 PreSubmit 事件处理动态下拉菜单

我正在开发一个 Symfony 项目,我需要根据用户选择动态填充两个下拉列表。该过程涉及选择一个“品牌”,然后更新“型号和q...

回答 1 投票 0

独立使用 symfony 2.0.x 表单组件

如何独立使用 2.0.* 版本的 symfony-form 组件? 文档中的示例展示了如何创建表单,但它们使用了 symfony 生态系统的其他部分,例如控件...

回答 2 投票 0

如何构建自定义symfony2表单?

我有三个实体,fos_user、命令和首选项。用户可以向自己发送一封电子邮件,其中包含每个实体的特定字段,这些字段不能为空。因此,当用户决定选择...

回答 1 投票 0

如何在OneToMany关系中创建动态Drop?

教区: ID 教区名称 1 DJ 2 千斤顶 一对多 教区: ID 教区_id 教区名称 1 1 圣裘德 2 1 圣马可 3 2 圣彼得 4 2 圣托马斯 我想做一个下拉动态: 当用户 cl...

回答 1 投票 0

Symfony 表单未更改字段返回验证类型错误

尝试更新实体并提交值未更改的字段会导致类型错误。我做错了什么? 实体: 命名空间应用\实体; 使用 Symfony\Component\Validator\

回答 2 投票 0

为entityType添加更多选项

我正在开发基于 Symfony 4 和 Select2 库的应用程序。 在我的 src/Form/PostType.php 文件中,我声明了字段标记,用户应该能够在其中设置预先声明的标记之一或添加新标记(按类型 ta...

回答 1 投票 0

PHP bin/console 学说:数据库:创建

使用 PHP 7.1.33,我正在为我的项目创建一个新数据库,这个问题出现在我身上 php bin/console 学说:数据库:创建 在 AbstractPostgreSQLDriver.php 第 79 行:   发生异常...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.