0

symfony で 3 つのテーブルをセットアップしました。

各スキル ID を各フリップブック ID に接続するフリップブック テーブル、スキル テーブル、およびリレーション テーブル。

私がモデルを構築したとき、symfony はすべてを正しく構築し、デフォルトで、スキル テーブルのすべてのスキルをオプションとして持つスキルのドロップダウン メニューを提供しました。オプションを選択すると、適切な関係が作成されます。

単一選択のドロップダウン メニューではなく、複数選択のチェックボックスにするスキルが必要なので、sfWidgetFormSelectCheckboxウィジェットを使用しています。

ドキュメントには、次のように「選択肢」を使用して複数の選択肢を入力するように記載されています。

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

選択肢配列のスキル テーブルから選択肢を読み込む方法がわかりません。それらはデフォルトのウィジェットに最初に含まれているため、どこかにあることはわかっています。値が skill_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'));
4

1 に答える 1

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')
);
于 2012-09-14T09:43:52.973 に答える