首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Symfony2和Selectize.js:在实体字段类型中持久化新项的最清晰的方法?

Symfony2和Selectize.js:在实体字段类型中持久化新项的最清晰的方法?
EN

Stack Overflow用户
提问于 2015-04-23 08:17:45
回答 3查看 1.4K关注 0票数 12

BandType,中,我有一个添加实体Tag的Symfony2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
->add('tags', 'entity', [
     'label' => 'Tags',
     'class' => 'DbBundle:Tag',
     'property' => 'title',
     'multiple'  =>  true,
])

这将生成多个select元素,其中我可以从数据库(Doctrine)中选择现有标记。但是,我需要添加动态的新标记,这些标记还不存在。

在客户端,我使用jQuery插件Selectize.js,它允许我添加新的标记来选择框。但是在提交表单之后,新的标记不会保存

因此,我的问题是-从复选框(实体字段类型)中持久化新项的最清晰的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-24 01:45:24

对实体使用数据变压器。在reverseTransform方法中,如果找不到新添加的带,只需在那里创建它,而不是抛出一个TransformationFailedException。

票数 11
EN

Stack Overflow用户

发布于 2016-01-29 06:14:44

一个可能的解决方案是使用FormEvents。下面是示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace AppBundle\Form;

use AppBundle\Entity\Tag;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\OptionsResolver\OptionsResolver;

class PostType extends AbstractType
{
    /**
     * @var ObjectManager
     */
    private $manager;

    /**
     * Constructor
     *
     * @param ObjectManager $manager
     */
    public function __construct(ObjectManager $manager)
    {
        $this->manager = $manager;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('content')
            ->add('tags')
        ;
        $builder->get('tags')->addEventListener(
            FormEvents::PRE_SUBMIT,
            function (FormEvent $event) {
                $choiceList = $event->getForm()->getConfig()->getAttribute('choice_list');
                $array = is_null($event->getData()) ? [] : $event->getData();
                $choices = $choiceList->getChoicesForValues($array);

                if (count($choices) !== count($array)) {
                    $values = $choiceList->getValuesForChoices($choices);
                    $diff = array_merge(array_diff($values, $array), array_diff($array, $values));

                    foreach ($diff as $value) {
                        $new = new Tag($value);
                        $this->manager->persist($new);
                        $this->manager->flush();
                        $values[] = $new->getId();
                    }

                    $event->setData($values);
                }
            }
        );
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Post'
        ));
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-01-28 17:50:20

正如在另一个答案中所描述的,您将希望为您的实体使用一个数据变压器,如果您找不到用户所要求的实体,则返回一个新实体。

有很多种方法可以解决这个问题。这是一种方法,从刚刚使用selectize.js的应用程序中得到简化,但是这些概念适用于您的前端的anyUI。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SubjectTransformer implements DataTransformerInterface
{
    protected $em;

    public function __construct($em)
    {
        $this->em = $em;
    }

    //public function transform($val) { ... }

    public function reverseTransform($str)
    {
        $repo = $this->em->getRepository('AppBundle:Subject');

        $subject = $repo->findOneByName($str);
        if($subject)
            return $subject;

        //Didn't find it, so it must be new 
        $subject = new Subject;
        $subject->setName($str);
        $this->em->persist($subject);

        return $subject;
    }
}

具体来说,这个用于DataTransformer字段的entry_typeCollectionType

  • 在其构造函数中接受实体管理器。
  • reverseTransform中,使用EM从数据库中检索值
  • 如果找不到一个,则创建一个新实体,并将其持久化。
  • 显式不刷新实体,以防窗体处理器/控制器希望在实际提交新实体之前对其执行额外的验证。

其他可能的变体包括不调用em->persist;调用em->flush;或者(可能在理想情况下)传递服务来管理搜索/创建,而不是直接使用实体管理器。(这样的服务可能实现几乎重复的检测、糟糕的语言过滤,只允许某些用户创建新的标记,等等)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29829105

复制
相关文章
MySQL和Java中的货币字段类型选择
在互联网应用中,处理货币是一项常见的任务。为了确保准确性和精度,我们需要选择适当的字段类型来存储货币数据。本文将讨论在MySQL和Java中记录货币时应选择的字段类型,并提供相应的代码示例。
疯狂的KK
2023/08/09
6780
MySQL和Java中的货币字段类型选择
Spark中的持久化
Spark 中一个很重要的能力是将数据持久化(或称为缓存),在多个操作间都可以访问这些持久化的数据。当持久化一个 RDD 时,每个节点的其它分区都可以使用 RDD 在内存中进行计算,在该数据上的其他 action 操作将直接使用内存中的数据。这样会让以后的 action 操作计算速度加快(通常运行速度会加速 10 倍)。缓存是迭代算法和快速的交互式使用的重要工具。
俺也想起舞
2019/11/27
7590
Redis 中的持久化
所谓持久化,其实就是一种机制,它能够 将内存中的数据库状态保存到磁盘 中,从而防止服务器宕机导致内存数据丢失。Redis 的 数据都是存在内存中 的,一旦出现宕机等情况,所有数据将会丢失,而持久化机制则是为了应对这一突发故障而提出的机制。
村雨遥
2022/10/28
3530
在mysql中如何修改字段类型_MySQL怎么修改字段类型?「建议收藏」
在MySQL中,可以通过alter table语句来修改表中一个字段的数据类型。下面本篇文章就来带大家了解一下alter table语句,介绍如何修改字段类型,希望对大家有所帮助。
全栈程序员站长
2022/09/05
28.1K0
简单的方法使用注解可以执行更清晰和类型安全的代码
可以看出:使用接口(基于注解),不但可以执行更清晰和类型安全的代码,而且还不用担心易错的字符串字面值以及强制类型转换。 其实可以结合使用,接口中:简单的方法使用注解,复杂的方法使用xml配置。毕竟,对于简单语句来说,注解使代码显得更加简洁,然而 Java 注解对于稍微复杂的语句就会力不从心并且会显得更加混乱 要求:
用户7705674
2021/10/08
6160
在 localStorage 中持久化 React 状态
我们将创建一个日历应用,就像谷歌日历。这个应用可以让我们在月份、周和日之间进行切换。
Jimmy_is_jimmy
2023/04/22
3.1K0
在 localStorage 中持久化 React 状态
SAP 新总账中 CodingBlock客户化自定义新字段方法
CodingBlock客户化自定义新字段 1、Coding Block新字段 财务会计(新)-财务会计基本设置(新)-分类帐-字段-客户字段-编辑编码块(OXK3); 添加字段如图; 该步骤比较耗时,完成后,可查看客户化字段已经创建; 2、安装新字段到新总账汇总表FAGLFLEXT中 财务会计(新)-财务会计基本设置(新)-分类帐-字段-客户字段-包括总计表中的字段(FAGL_GINS); 输入表FAGLFLEXT,修改进入,将自定义字段加入,保存并激活; 该步骤耗时,完成后退出,在初始界面激活汇总表; 使用SE16,检查表FAGLFLEXT和BSEG,发现字段ZZFI已经加入了; 新增补的字段需要更改其记账码和字段状态组的字段状态(可使用事务码:FBKP),才能正常显示和输入,系统默认的状态是为“隐藏”。注意维护的语言,否则可能看不到字段名; 3、为Coding Block新字段定义凭证输入的子屏幕 为了使新增补的字段能在凭证输入时比较方便的输入,使新增的字段能出现在事务OXK3的屏幕中:发票/贷项发票快速输入、总账快速输入、科目分配和预制凭证等; 财务会计(新)-财务会计基本设置(新)-分类帐-字段-客户字段-编辑编码块(OXK3); 选择菜单“环境”,“预备快速输入”进入新的屏幕; 执行完成后,即可在FB50,F-02的屏幕中看到新增字段; 可以通过维护自定义屏幕变式和自定义子屏幕来设置字段出现的位置,路径如下: 财务会计(新)-总账会计核算(新)-业务交易-总账会计过帐-满意-在Enjoy事务中包括客户字段; 财务会计(新)-财务会计基本设置(新)-分类帐-字段-为编码块定义子屏幕(OXK1); 4、为Coding Block新字段维护数据表内容 使用事务SE11创建客户自定义的数据表ZZFI_BB; 点创建后进入表格创建界面,维护参数 创建字段如下; 维护技术设置; 保存后激活;然后可以使用事务SE16直接维护数据表ZZFI_BB的内容; 但对于一般的最终用户来说不会被分配访问数据表的操作权限,因此需要开发人员编写一段ABAP程序以使最终用户能简单方便的维护数据表内容; 5、定义Coding Block新字段的搜索帮助 为了在数据输入时方面的选择输入其数据值(F4),需要为新增补的字段创建搜索帮助;使用事务SE11创建搜索帮助; 点击创建,选择“基本索引帮助”,进入创建搜索帮助界面; 保存并激活; 6、分配搜索帮助给Coding Block新字段 使用事务SE11将创建号的搜索帮助分配给新增补字段; 保存并激活; 7、分配数据检查表给Coding Block新字段 使用事务SE11修改结构CI_COBL; 点修改进入,选中所需要维护的组件ZZFI,点 ,进入搜索帮助及检查视图; 点击按钮选择“外来码”,系统弹出对话框“外来关键词不存在,创建带值表ZZFI_BB的建议作为检查表格?”,选择“是”,接受系统建议; 选择“复制”复制外来码关键字检查表ZZFI_BB;此时可以看到ZZFI_BB已经填入到CheckTable中了; 保存并激活;此时可以使用FB50,F-02试试效果; 8、把方案和客户字段分配到分类帐 财务会计(新)-财务会计基本设置(新)-分类帐-分类帐-把方案和客户字段分配到分类帐 将客户字段ZZFI添加到分类帐OL中,这样表FAGLFLEXT中,就能对字段ZZFI产生一条汇总记录;经过这样设置,可以查询查询针对ZZFI的期初、发生、期末的数据了;
matinal
2020/11/27
1.5K1
Spark RDD中的持久化
持久化在早期被称作缓存(cache),但缓存一般指将内容放在内存中。虽然持久化操作在绝大部分情况下都是将RDD缓存在内存中,但一般都会在内存不够时用磁盘顶上去(比操作系统默认的磁盘交换性能高很多)。当然,也可以选择不使用内存,而是仅仅保存到磁盘中。所以,现在Spark使用持久化(persistence)这一更广泛的名称。 如果一个RDD不止一次被用到,那么就可以持久化它,这样可以大幅提升程序的性能,甚至达10倍以上。默认情况下,RDD只使用一次,用完即扔,再次使用时需要重新计算得到,而持久化操作避免了这里的
天策
2018/06/22
7460
spark中的rdd的持久化
rdd的全称为Resilient Distributed Datasets(弹性分布式数据集) rdd的操作有两种transfrom和action。 transfrom并不引发真正的rdd计算,action才会引发真正的rdd计算。 rdd的持久化是便于rdd计算的重复使用。 在rdd参与第一次计算后,设置rdd的存储级别可以保持rdd计算后的值在内存中。(1)另外,只有未曾设置存储级别的rdd才能设置存储级别,设置了存储级别的rdd不能修改其存储级别。(2)(1)的举例如下:rdd1要经过trans
Albert陈凯
2018/04/08
1.1K0
ActiveMQ 中的消息持久化 原
为了避免意外宕机以后丢失信息,需要做到重启后可以恢复消息队列,消息系统一般都会采用持久化机制。
wuweixiang
2018/08/14
7960
ActiveMQ 中的消息持久化
                                                                            原
Electron中数据持久化的选择
Electron是一个基于Chromium的桌面应用程序框架,它可以让开发人员在不需要熟练掌握Web开发技术的情况下,快速地开发出高质量的桌面应用程序。在Electron中,开发人员可以使用各种各样的数据存储方式,包括文件系统、数据库等。其中,数据库是一种非常常见的数据存储方式,它可以方便地存储和管理各种数据,包括文本、图片、音频、视频等。
ianzhi
2023/10/19
1K0
mysql的mediumtext类型字段在java如何获取
PO:重点是autoResultMap = true和@TableField(typeHandler = FastjsonTypeHandler.class)
全栈程序员站长
2022/08/30
3.9K0
mysql的mediumtext类型字段在java如何获取
Kubernetes中的存储卷和持久卷的原理和使用方法
在Kubernetes集群中,如果多个Pod需要访问相同的持久化存储,可以通过使用存储卷(Volume)和持久卷(Persistent Volume)来配置和管理这些存储卷。
一凡sir
2023/09/06
4770
Kubernetes中的存储卷和持久卷的原理和使用方法
Swift 中的抽象类型和方法
在面向对象的编程中,抽象类型提供了一个基础实现,其他类型可以从中继承,以获得某种共享的、共同的功能。抽象类型与普通类型的区别在于,它们永远不会被当作原样使用(事实上,一些编程语言甚至阻止抽象类型被直接实例化),因为它们的唯一目的是作为一组相关类型的共同父类。
韦弦zhy
2022/03/30
8170
Swift 中的抽象类型和方法
在面向对象的编程中,抽象类型提供了一个基础实现,其他类型可以从中继承,以获得某种共享的、共同的功能。抽象类型与普通类型的区别在于,它们永远不会被当作原样使用(事实上,一些编程语言甚至阻止抽象类型被直接实例化),因为它们的唯一目的是作为一组相关类型的共同父类。
Swift社区
2022/05/19
7670
点击加载更多

相似问题

在symfony2中持久化多个实体

50

持久化新的JPA实体和分离

12

在表单symfony2中持久化相关实体

10

持久化新实体onFlush

11

非持久化字段更改上的持久化实体

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文