0

dropdpwn にいくつかのオプションを入力しようとしています。入力フォームに名前のタイトルと国のリストを含むドロップダウンを作成しようとしています。

例えば:

「Mr」、「Mrs」、「Miss」が必要なタイトル

私は方法を試しました:

モデル

// Built a list of search options (unless you have this list somewhere else)
public function __construct($id = false, $table = null, $ds = null) {
$this->titles = array(
             0 => __('Mr', true),
             1 => __('Mrs', true),
            2 => __('Miss', true));
 parent::__construct($id, $table, $ds);
 }

コントローラ

public function add() {
    if ($this->request->is('post')) {
        $this->Member->create();
        if ($this->Member->save($this->request->data)) {
            $this->Session->setFlash(__('The member has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The member could not be saved. Please, try again.'));
        }
    }
}

意見

<?php echo $this->Form->input('title',array('class' => 'span10', 'options' => $titles   )); ?>

エラー Undefined variable: titles が表示されます

私もモデルで試してみました

public $validate = array(
    'member_no' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            //'message' => 'Your custom message here',
            //'allowEmpty' => false,
            //'required' => false,
            //'last' => false, // Stop validation after this rule
            //'on' => 'create', // Limit validation to 'create' or 'update' operations
        ),
    ),
    'title' => array(
        'titlesValid' => array(
            'rule' => array('multiple', array(
                'in'  => array('Mr', 'Mrs', 'Miss'),
                'min' => 1
            )),

私が欠けているものと、国などのより長いリストの最良の解決策は何ですか?それはフォーム上にのみあるため、タイトルと国のテーブルとリンク ID が必要だとは思いませんでしたか?

4

1 に答える 1

3

ドロップダウンのモデルの構成で変数を作成する必要があるのは本当に奇妙です。特に一度しか使用しない場合。

しかし、まず最初に。変数をビューに設定していないため、そのエラーが発生しています。コントローラーには、次のようなものが必要です。

public function add() {
    $this->set('titles', $your_titles_array);
    if ($this->request->is('post')) {

    //etc

ここで、ドロップダウン配列をそこから遠ざけてください。それを置くのにより良い場所が2つあります。この値をデータベース内のテーブルとして保持する必要があると言うつもりはありません。1 か所だけのもので、ハードコードしたい場合は、そのままで構いません。

1つのオプションは、次のように1つのモデルに入れることです

class YourModel extends AppModel {
    //all your other definitions

    public function getTitles() {
        return array(
         0 => __('Mr', true),
         1 => __('Mrs', true),
        2 => __('Miss', true));
    }
}

そしてコントローラーで

    public function add() {
    $this->set('titles', $this->YourModel->getTitles());
    if ($this->request->is('post')) {

    //etc

しかし、その機能を追加する適切なモデルがないと思います。どこに追加する予定でしたか?ユーザーモデルかな?たとえば、Post モデルのようにすることはできません。それでは意味がありません。モデルにその関数を配置できる論理的な場所がある場合は、考えてみてください。

それ以外の場合で、1 つの場所にある 1 つのフォームがその 1 回だけである場合は、ビューまたはコントローラーにハードコードしてみませんか?

より大きなリストについては、私が示したようなモデルでそれを行うことをお勧めします (しかし、私は主張しますが、それを持つことが論理的であるモデルに入れます)。ええと、私はテーブルを用意して値を参照していますが、必須ではありません (考えてみてください。実際にはそれほど多くの作業はありませんよね? より大きなリストの場合です)。

于 2013-05-30T14:34:53.823 に答える