1

私のSymfonyモデルには、ブール値であるがNULLも受け入れるフィールドがあるため、事実上トライステート値です。

このためのウィジェットを作成するにはどうすればよいですか? Symfony は sfWidgetFormCheckbox を自動生成しますが、NULL に設定することはできません。

sfWidgetFormChoice を試してみましたが、値を機能させるには値を文字列として指定する必要がありました。

$this->setWidget('wt', new sfWidgetFormChoice(array(
    'choices' => array(true => 'true', false => 'false', null => 'null')
)));

値を保存するために機能しますが、「false」値を保存するたびに、選択が「null」に戻ります。「false」、「0」、「」などの組み合わせをいくつか試しましたが、3 つのケースすべてで何も機能しませんでした。

何か案は?

4

1 に答える 1

4

ドキュメントからの例:

class sfWidgetFormTrilean extends sfWidgetForm
{
  public function configure($options = array(), $attributes = array())
  {

    $this->addOption('choices', array(
      0 => 'No',
      1 => 'Yes',
      'null' => 'Null'
    ));
  }

  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    $value = $value === null ? 'null' : $value;

    $options = array();
    foreach ($this->getOption('choices') as $key => $option)
    {
      $attributes = array('value' => self::escapeOnce($key));
      if ($key == $value)
      {
        $attributes['selected'] = 'selected';
      }

      $options[] = $this->renderContentTag(
        'option',
        self::escapeOnce($option),
        $attributes
      );
    }

    return $this->renderContentTag(
      'select',
      "\n".implode("\n", $options)."\n",
      array_merge(array('name' => $name), $attributes
    ));
  }
}
于 2012-12-03T20:16:01.910 に答える