Symfony 生成器形式、学说和 M:N 关系 [英] Symfony Generator Forms, Doctrine, and M:N Relationships

查看:15
本文介绍了Symfony 生成器形式、学说和 M:N 关系的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个基本的 M:N 设置,其中包含三个表:候选、位置和候选位置.

I have a basic M:N setup with three tables: candidate, position, and candidate_position.

这是来自 MySQL Workbench 的 ERD 的屏幕截图

Here's a screenshot of the ERD from MySQL Workbench

现在,让我们继续讨论表单.在 symfony 生成器的默认世界中,这三个表都有一个单独的 CRUD 接口.但是,我不想为 candidate_position 提供 CRUD 接口.

Now, moving on from that let's talk about forms. In the default world of symfony generator, you'd have a separate CRUD interface for all three of these tables. However, I don't want to have a CRUD interface for candidate_position.

我想要的是,候选界面的创建和编辑操作包含一个多选字段(选择列表、复选框数组等),它将创建候选位置记录作为候选操作的一部分.

What I want, is for the create and edit actions of the Candidate interface to contain a multi-choice field (select list, checkbox array, whatever) that would create the CandidatePosition records as part of the Candidate actions.

进入代码

config/doctrine/schema.yml (注意:不是整个schema.yml,只是这里讨论的表)

---
detect_relations: true
options:
  type: InnoDB

candidate:
  columns:
    id:
      type: integer(4)
      primary: true
      unsigned: true
      notnull: true
      autoincrement: true
    first_name:
      type: string(45)
      notnull: true
    last_name:
      type: string(45)
      notnull: true
    created_at:
      type: integer(4)
      unsigned: true
  relations:
    Positions:
      class: Position
      refClass: CandidatePosition
      local: candidate_id
      foreign: position_id

position:
  columns:
    id:
      type: integer(4)
      primary: true
      unsigned: true
      notnull: true
      autoincrement: true
    name:
      type: string(45)
  relations:
    Candidates:
      class: Candidate
      refClass: CandidatePosition
      local: position_id
      foreign: candidate_id


candidatePosition:
  tableName: candidate_position
  columns:
    candidate_id:
      type: integer(4)
      primary: true
      unsigned: true
      notnull: true
    position_id:
      type: integer(4)
      primary: true
      unsigned: true
      notnull: true
  indexes:
    fk_candidate_position_candidate1:
      fields: [candidate_id]
    fk_candidate_position_position1:
      fields: [position_id]

apps/backend/modules/candidate/config/generator.yml

generator:
  class: sfDoctrineGenerator
  param:
    model_class:           Candidate
    theme:                 admin
    non_verbose_templates: true
    with_show:             false
    singular:              ~
    plural:                ~
    route_prefix:          candidate
    with_doctrine_route:   true
    actions_base_class:    sfActions

    config:
      actions: ~
      fields:  
        first_name: { label: First Name }
        last_name:  { label: Last Name }
        created_at: { label: Created On }
        candidate_positions:  {label: Positions}
      list:    
        sort:  [last_name, asc]
      filter:  ~
      form:    
        display:
          "User": [first_name, last_name]
          "Applying For": [candidate_positions]
        fields :
          hide:  [created_at]
      edit:    ~
      new:     ~

lib/form/doctrine/candidateForm.class.php

class candidateForm extends BasecandidateForm
{
  public function configure()
  {
    unset( $this['created_at'] );

    $this->widgetSchema['candidate_positions'] = new sfWidgetFormDoctrineChoice(
      array( 'multiple' => true, 'model' => 'Position', 'renderer_class' => 'sfWidgetFormSelectCheckbox' )
    );

    $this->validatorSchema['candidate_positions'] = new sfValidatorDoctrineChoice(
      array( 'multiple' => true, 'model' => 'Position', 'min' => 1 )
    );
  }
}

这一切都有效,除了实际保存数据时.这就是我卡住的地方.

This all works, except when it comes to actually saving the data. This is the point where I get stuck.

我显然需要做一些事情来创建/编辑/删除 CandidatePosition 记录,但我不确定从哪里开始工作.在 candidateActions 中?覆盖 Basecandidate::save()?

I clearly need to do something to create/edit/delete the CandidatePosition records, but I'm not sure where to start working. In candidateActions? Override Basecandidate::save()?

如果您可能需要查看任何其他数据,请告诉我.

Let me know if there's any other data you might need to see.

  • PHP 5.2.x
  • symfony 1.4.3

推荐答案

大约 10 个月前,我在连接表中的 M:N 关系和元数据方面遇到了类似的问题.

About 10 month ago I had similar trouble with M:N relationships and meta-data in the join table.

我发现 melikedev 的那些博客条目非常有用!这与您的用例并不完全相同,但它可能会给您一些提示:

I found those blog entries of melikedev very useful! This is not exactly the same as your use case, but it might give you some hints:

http:///melikedev.com/2009/12/09/symfony-w-doctrine-saving-many-to-many-mm-relationships/

http://melikedev.com/2009/12/06/symfony-sfformextraplugin-select-double-list-maintain-order/

http://melikedev.com/2010/04/06/symfony-saving-metadata-during-form-save-sort-ids/

这篇关于Symfony 生成器形式、学说和 M:N 关系的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆