【问题标题】:Pulling choices array from the database using sfWidgetFormSelectCheckbox使用 sfWidgetFormSelectCheckbox 从数据库中提取选择数组
【发布时间】:2012-09-13 19:52:39
【问题描述】:

我在 symfony 中设置了 3 个表:

一个翻书表、一个技能表和一个关系表,用于将每个技能 ID 与每个翻书 ID 连接起来。

当我构建模型时,symfony 正确构建了所有内容,并且默认为技能提供了一个下拉菜单,其中包含技能表中的所有技能作为选项。您可以选择一个选项,它会创建适当的关系。

我需要成为多选复选框而不是单选下拉菜单的技能,因此我使用了sfWidgetFormSelectCheckbox 小部件。

文档说使用“选择”来填充多个选择,如下所示:

$this->widgetSchema['skill_id'] = new sfWidgetFormSelectCheckbox(
  array('choices' => "choice1", "choice2", choice3"), 
  array('class' => 'text size-500'));

我不知道如何从选项数组中的技能表中加载选项。我知道它们在某处,因为它们最初包含在默认小部件中。如何将它们拉出到单个复选框输入元素,其中值与技能 ID 匹配。

一些代码怎么样?

架构:

Flipbook:
  tableName: flipbook
  inheritance:
    extends: SvaGeneric
    type: concrete
  columns:
    title: { type: string(255) }
    career_associations: { type: clob }
    skills: { type: string(255) }
    skills_associations: { type: clob }
    program: { type: string(255) }
    program_associations: { type: clob }
    draft_id: { type: integer(10) }

FlipbookSkills:
  tableName: flipbook_skills
  columns:
    title: { type: string(255) }
  relations:
    Flipbook:
      foreignAlias: flipbook_skills
      alias: skills
      local: title
      onDelete: SET NULL   

FlipbookSkillRelations:
  tableName: flipbook_skill_relations
  actAs:
    SoftDelete: ~
  options:
  columns:
    flipbook_id: { type: integer(10), notnull: false }
    skill_id: { type: integer(10), notnull: false }
  relations:
    Flipbook:
      foreignAlias: flipbook_skills_flipbook
      alias: flipbook
      local: flipbook_id
      onDelete: CASCADE
    FlipbookSkills:
      foreignAlias: flipbook_skills_skills
      alias: flipbookskills
      local: skill_id
      onDelete: CASCADE

FlipbookSkillsRelationsForm.class.php:

$this->widgetSchema['flipbook_id'] = new sfWidgetFormInputText(array(), array('class' => 'text size-500'));

$this->widgetSchema['skill_id'] = new sfWidgetFormSelectCheckbox(array('choices' => "**WHAT GOES HERE??**"), array('class' => 'text size-500'));


$useFields = array(
  'flipbook_id',
  'skill_id',
);

$this->useFields($useFields);

如果我应该提供进一步的代码或解释,请告诉我。

更新

这是模型中生成的 FlipbookSkillsTable.class:

<?php

/**
 * FlipbookSkillsTable
 * 
 * This class has been auto-generated by the Doctrine ORM Framework
 */
class FlipbookSkillsTable extends Doctrine_Table
{
    /**
     * Returns an instance of this class.
     *
     * @return object FlipbookSkillsTable
     */
    public static function getInstance()
    {
        return Doctrine_Core::getTable('FlipbookSkills');
    }

    public function retrieveForFilter()
    {
      $res = $this->createQuery('s')
        ->select('s.id, s.name')
        ->orderBy('s.name ASC')
        ->execute(array(), Doctrine_Core::HYDRATE_NONE);

      // if you want an empty line
      $rets = array('' => '');
      foreach ($res as $ret)
      {
        $rets[$ret[0]] = $ret[1];
      }

      return $rets;
    }

    public function getAllFlipbookSkills() {
        $allSkills = Doctrine_Query::create()
            ->from('FlipbookSkills')
            ->orderBy('title ASC')
            ->execute();
    return $allSkills;
    }
}

如果没有收到“未定义方法”错误,我似乎无法从此文件中调用任何函数。我猜这会是架构错误?

更新 2

这是正常工作的:

$this->widgetSchema['skill_id'] = new sfWidgetFormSelectCheckbox(array('choices' => Doctrine::getTable('FlipbookSkills')->getFlipbookskills()), array('class' => 'text size-500'));

【问题讨论】:

    标签: php widget doctrine symfony-1.4


    【解决方案1】:

    我通常是这样做的:

    添加一个自定义方法来检索SkillTable.class.php 中的技能数组,类似于:

      /**
       * Retrieve array for display the select list for filter
       *
       * @return array
       */
      public function getFlipbookskills()
      {
        $res = $this->createQuery('s')
          ->select('s.id, s.name')
          ->orderBy('s.name ASC')
          ->execute(array(), Doctrine_Core::HYDRATE_NONE);
    
        // if you want an empty line
        $rets = array('' => '');
        foreach ($res as $ret)
        {
          $rets[$ret[0]] = $ret[1];
        }
    
        return $rets;
      }
    

    然后在你的表单中,这样称呼它:

    $this->widgetSchema['skill_id'] = new sfWidgetFormSelectCheckbox(
      array('choices' => Doctrine::getTable('FlipbookSkills')->getFlipbookskills()), 
      array('class' => 'text size-500')
    );
    

    【讨论】:

    • 我收到这个致命错误:致命错误:调用未定义的方法 FlipbookSkills::getInstance()。我认为这将是一个 schema.yml 错误,但对我来说看起来不错。有什么想法吗?
    • 试试 Doctrine_Core::getTable('FlipbookSkills')
    • 是的,明白了。好吧,这正是我所拥有的:$this->widgetSchema['skill_id'] = new sfWidgetFormSelectCheckbox(array('choices' => Doctrine::getTable('FlipbookSkills')->getFlipbookskills()), array ('class' => '文本大小-500'));
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多