- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑 - 重新定义问题并包含额外的特定代码
在我的 Symfony2 项目中,我有一个实体 (Configurations),其中包含与另一个实体 (ConfigurationsFeatures) 的 OneToMany 关系。我正在尝试构建一个表单,允许用户更改 Configurations 实体中的值,并选择要保留到 ConfigurationsFeatures 实体的值。该表单有两种使用场景:
1) 创建一个新配置 -> 渲染一个空白表单,其中包含 Configurations 中值的字段以及 ConfigurationsFeatures 中潜在值的复选框集合;潜在值的来源实际上是第三个实体,CoreCodes。验证后,表单的配置值将保留到配置实体,选定的复选框将保留到配置功能。</p>
2) 更新现有配置 -> 使用字段中显示的现有配置值呈现表单,并呈现所有可能的 ConfigurationsFeatures 值的复选框集合,但已选择现有值。
我已经为场景 #1 构建了表单类型和 Controller 操作,并对其进行了测试,一切正常。但是,我似乎无法解决表单复选框部分中的“已选择现有值”的问题。我意识到,当我当前设置 Controller 时,我基本上是在比较苹果和橙子,因为 $entity->getFeatures() 返回 ConfigurationsFeatures 实体的 ArrayCollection,并且表单中没有任何内容可以映射,因为表单使用CoreCodes 实体的集合。
那么我该如何弥补这个差距呢?
<小时/>Entity\Configurations(存储单独的配置)
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Lynux\AssetBundle\Entity\Core\Configurations
* ... ORM declarations ...
*/
class Configurations
{
// ... plain old properties, nothing fancy here...
/**
* @ORM\OneToMany(targetEntity="Lynux\AssetBundle\Entity\Core\ConfigurationsFeatures", mappedBy="configurationFk")
*/
private $features;
public function __construct()
{
$this->features = new ArrayCollection();
}
// getters and setters
/**
* Set features
*/
public function setFeatures(ArrayCollection $features)
{
$this->features = $features;
}
/**
* Get features
*/
public function getFeatures()
{
return $this->features;
}
}
<小时/>
Entity\ConfigurationsFeatures(存储每个配置的选定功能)
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* Lynux\AssetBundle\Entity\Core\ConfigurationsFeatures
* ... ORM declarations ...
*/
class ConfigurationsFeatures
{
/**
* @var Codes
*
* @ORM\ManyToOne(targetEntity="Lynux\AssetBundle\Entity\Core\Codes")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="feature_fk", referencedColumnName="id")
* })
*/
private $featureFk;
/**
* @var Configurations
*
* @ORM\ManyToOne(targetEntity="Lynux\AssetBundle\Entity\Core\Configurations", inversedBy="features")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="configuration_fk", referencedColumnName="id")
* })
*/
private $configurationFk;
/**
* Set featureFk
*
* @param Lynux\AssetBundle\Entity\Core\Codes $featureFk
* @return ConfigurationsFeatures
*/
public function setFeatureFk(\Lynux\AssetBundle\Entity\Core\Codes $featureFk = null)
{
$this->featureFk = $featureFk;
return $this;
}
/**
* Get featureFk
*
* @return Lynux\AssetBundle\Entity\Core\Codes
*/
public function getFeatureFk()
{
return $this->featureFk;
}
/**
* Set configurationFk
*
* @param Lynux\AssetBundle\Entity\Core\Configurations $configurationFk
* @return ConfigurationsFeatures
*/
public function setConfigurationFk(\Lynux\AssetBundle\Entity\Core\Configurations $configurationFk = null)
{
$this->configurationFk = $configurationFk;
return $this;
}
/**
* Get configurationFk
*
* @return Lynux\AssetBundle\Entity\Core\Configurations
*/
public function getConfigurationFk()
{
return $this->configurationFk;
}
}
<小时/>
Entity\CoreCodes(ConfigurationsFeatures->featureFk 的潜在值来源)
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Lynux\AssetBundle\Entity\Core\Codes
*
* @ORM\Table(name="core_codes")
*/
class Codes
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer", nullable=false, unique=true)
* @ORM\Id
* @Assert\NotBlank(message="ID cannot be blank!")
* @Assert\Regex(pattern="/^\d+$/", match=true, message="ID must be an integer!")
* @Assert\MinLength(limit=8, message="ID must be 8 digits in length!")
* @Assert\MaxLength(limit=8, message="ID must be 8 digits in length!")
*/
private $id;
// ... various properties, not applicable to question ...
/**
* Set id
*
* @param integer $id
* @return Codes
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
// ... getters and setters for other properties ...
}
<小时/>
类型\表单配置
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class FormConfigurations extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$features = $this->features;
// ... builders for other properties ...
$builder->add(
'features',
'entity',
array(
'class' => 'LynuxAssetBundle:Core\Codes',
'property_path' => false,
'query_builder' => function(EntityRepository $er) use ($features)
{
return $er->createQueryBuilder('u')
->where('u.submodule = :submodule')
->setParameter('submodule', 'feature');
},
'expanded' => true,
'multiple' => true,
'property' => 'title',));
}
public function getName()
{
return 'FormConfigurations';
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'data_class' => 'Lynux\AssetBundle\Entity\Core\Configurations',));
}
}
<小时/>
Controller\ConfigurationsController::createAction()
public function createAction(Request $request)
{
$config = $request->getSession()->get('configuration');
$manage = $this->getDoctrine()->getEntityManager();
$entity = new Configurations();
$form = $this->createForm(new FormConfigurations($features), $entity);
$failed = null;
$features = $manage
->getRepository('LynuxAssetBundle:Core\Codes')
->findBySubmodule('feature');
if ('POST' == $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
$status = $manage
->getRepository('LynuxAssetBundle:Core\Codes')
->findOneById(10103022);
$entity->setToken($entity->getName());
$entity->setStatusFk($status);
$entity->setCreateAccountFk($this->getUser());
$features = $form->get('features')->getData();
foreach($features as $feature) {
$addFeature = new ConfigurationsFeatures();
$addFeature->setConfigurationFk($entity);
$addFeature->setFeatureFk($feature);
$manage->persist($addFeature);
}
$manage->persist($entity);
$manage->flush();
return $this->redirect($this->generateUrl(
'CoreConfigurationsConfirm',
array(
'code' => 'create',
'token' => $entity->getToken(),)));
} else {
$failed = true;
}
}
<小时/>
Controller\ConfigurationsController::updateAction()
public function updateAction(Request $request, $token)
{
$manage = $this->getDoctrine()->getEntityManager();
$entity = $manage
->getRepository('LynuxAssetBundle:Core\Configurations')
->findOneByToken($token);
$form = $this->createForm(new FormConfigurations($features), $entity);
if ('POST' == $request->getMethod()) {
$form->bind($request);
if ($form->isValid()) {
$currentFeatures = $manage
->getRepository('LynuxAssetBundle:Core\ConfigurationsFeatures')
->findByConfigurationFk($entity);
foreach($currentFeatures as $currentFeature) {
$manage->remove($currentFeature);
}
$features = $form->get('features')->getData();
foreach($features as $feature) {
$addFeature = new ConfigurationsFeatures();
$addFeature->setConfigurationFk($entity);
$addFeature->setFeatureFk($feature);
$manage->persist($addFeature);
}
$manage->flush();
}
}
最佳答案
啊,耐心和坚持...我突然想到,在持久化到数据库时,我正在将 CoreCodes 集合转换为 ConfigurationsFeatures 集合。同样,在显示表单时从 ConfigurationsFeatures 转换为 CoreCodes 也是有意义的。
// ConfigurationsController::updateAction()
$formFeatures = new ArrayCollection();
$currentFeatures = $entity->getFeatures();
foreach($currentFeatures as $feature) {
$formFeatures->add($feature->getFeatureFk());
}
if ('POST' != $request->getMethod()) { // first time the form is loaded
$form->get('features')->setData($formFeatures);
}
关于symfony - 基于 ArrayCollection() 填充 Symfony2 中的复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12923142/
我扩展了 ArrayCollection 类以添加推送方法 package com.cargo.collections { import mx.collections.ArrayCollect
我使用 Symfony2 制作了一个 Web 应用程序,其中用户与实体 Mission 具有数组关联 ManytoMany。用户可以通过表单上传实体$product,表单传递的数据之一是与用户关联的任
我用 Symfony2 制作了一个 Web 应用程序,其中一个 User 有一个数组关联 ManytoMany 与实体 Mission。用户可以通过表单上传实体 $product,表单传递的数据之一是
我在使用 tagsinput 的表单上使用标签: 此插件以单个文本字段结束,其中包含以逗号分隔的标签(例如:tag1,tag2,...) 这些标签目前在非映射表单字段上进行管理: $build
我正在寻找一种为 ODM ArrayCollection 关联数组键的方法。 实体具有以下映射: /** * $fields * * The entities fields * * @ODM
我正试图在我的包中实现一些可重用的翻译。这些是我的代码的相关部分: TranslatorKeys.php: ... /** * @var \ArrayCollection * * @ORM\On
好的,我有一个 User 实体如下 urls = new \Doctrine\Common\Collections\ArrayCollection(); } public functi
我想在 Flex 中迭代 ArrayCollection,同时可以添加和删除项目。 因为我没有找到一种方法来使用像 Java 中那样的“经典”迭代器来完成这项工作。我试过游标。但它并没有真正按照我想要
如果我有一个 ArrayCollection 类型的变量,如何检查集合中是否存在特定名称的键(包括嵌套)。如果确实如此,我如何获取和更改该值? 最佳答案 我猜你正在谈论 Doctrines Array
如果我有一个 ArrayCollection 类型的变量,如何检查集合中是否存在特定名称的键(包括嵌套)。如果确实如此,我如何获取和更改该值? 最佳答案 我猜你正在谈论 Doctrines Array
在对我的数据提供者(数组集合)应用数字排序后,我无法通过 tilelist 重新排序项目。我需要从 arrayCollection 中删除排序吗?如果是这样,是否只是设置 collection.sor
我想创建一个表单来编辑我的用户。与 ManyToMany 关联的用户和角色。在 UserUsers 实体中,我有一个 $roles 变量,它是 ArrayCollection: public func
通常您可以使用以下方法检查变量是否是类的实例: $foo instanceof bar 但是对于 ArrayObjects(属于 Symfony 2),这似乎不起作用 get_class($foo)
即使对象被正确更新,数据似乎也没有持久化,我不明白为什么。 这是我的实体: Article.php /** * @var AttributeInArticle * * @ORM\OneToMan
public function getInvoiceItemsByType($type) { return $this->invoiceItems->filter(function ($inv
考虑以下问题: 我在 Article 和 Author 之间有一个多对一 关联。 class Author{ /** * ... *@var ArrayCollection_of_Ar
我正在尝试按特定字段对 ArrayCollection 进行排序。 ArrayCollection 是一个类(class)数组。在 Course 实体中有一个名为 isLive 的方法,它返回一个 b
我有一些这样的 XML 结构: var struct:XML = ; 我知道我可以通过“id”访问子节点,方式如下: var stuff:Object = struct.(hasO
我正在使用 JMS 序列化程序。当 JsonSerializer 与 Doctrine ArrayCollection 类型一起工作时,它给了我不正确的数组格式。指定的结果应遵循格式 [ {}, {}
在设置了 filterFunction 的 ArrayCollection 上调用 getItemIndex 时遇到了一些问题。 我做了类似 myAC.removeItemAt(myAC.getIte
我是一名优秀的程序员,十分优秀!