2011-02-23 17 views
3

私は特定の選択ウィジェット(DoctrineChoice)を持つフォームを持っています。選択肢はサーバー内の特定の画像ファイルを参照していますが、expander = trueオプションを使用します(チェックボックス/ラジオボタンの場合)symfony 1.4選択ウィジェットの選択肢として画像を表示

各オプションの画像を表示してウィジェットを表示する方法はありますか?デフォルトでは、データベース内のオプションのIDのみを取得します。

ファイヤーバグを使用して、生成されたHTMLにそれぞれのIDのタグが付いていることに気付きました。また、これを特定のイメージで変更することができました。変更する必要があると思います各選択肢のラベルのテキスト。たとえ、ウィジェットの 'ラベル'オプションが選択全体のラベルを変更するだけなので、それはできません。

ありがとう!

答えて

2

多くの調査の後、私はいくつかの種類のソリューションを管理しましたが、もっと正確なものがありますか?

sfWidgetFormDoctrineChoiceを使用するのではなく、sfWidgetFormSelectRadioを使用しましたが(チェックボックスも可能ですが、他のウィジェットやウィジェットを選択できるかどうかわかりません)この特別なケースではSelectRadioで十分でした...)

以前のDoctrineChoiceウィジェットを記入するために使用していた前回のクエリの結果で、ウィジェットのchoicesオプションが満たされていました。それぞれの選択肢のキーと値:

$imgs = Doctrine_Core::getTable('ProjImages')->getImages(); 
$choices = array('' => ''); 
foreach ($imgs as $img): 
    $choices[$img->getId()] = $img->getId(); 
endforeach; 

次に、「フォーマットR:$選択肢に反映されている私のウィジェットには、画像を 『『私も選択しないためのオプションを必要とするので、バリで=> falseオプション』必要」ウィジェットにオプション

$this->widgetSchema['img'] = new sfWidgetFormSelectRadio(array(
        'choices' => $choices, 
        'formatter' => array($this, 'showAsImages') 
           )); 
$this->validatorSchema['img'] = new sfValidatorChoice(array(
        'choices' => $choices, 
        'required' => false 
        )); 

私が使用しました』配列を最初の( '' => '')として選択します。

最後に、私は、フォーマッタコールバックを書いた:

public function showAsImages($widget, $inputs) 
{ 
    $rows = array(); 
    foreach ($inputs as $input) 
    { 
    $domdoc = new DOMDocument(); 
    $domdoc->loadHTML($input['label']); 
    $node = $domdoc->getElementsByTagName('label')->item(0); 
    if ($node->nodeValue != "") 
    { 
     $img = Doctrine_Core::getTable('ProjImages')->find(array($node->nodeValue)); 
     $input['label'] = '<label '.$node->attributes->item(0)->name . 
         '="'.$node->attributes->item(0)->value.'">' . 
         '<img src="'.$img->getImg().'" alt="image" />' . 
         '</label>'; 
    } 
    $rows[] = $widget->renderContentTag('li', 
        $input['input']. 
        $widget->getOption('label_separator'). 
        $input['label']); 
    } 
    return $widget->renderContentTag('ul', 
         implode($widget->getOption('separator'), $rows), 
         array('class' => $widget->getOption('class'))); 
} 

Iは、(すべてのsfWidgetFormSelectRadioの元のデフォルトのフォーマッタのソースコードを使用し、それに基づいて、私は各入力要素の「ラベル」を改変しました残りのコードは、私が使ったソースコードとまったく同じです)。

各入力要素のラベルについては、DOMDocumentオブジェクトを使用して値(イメージのID)を取得し、次にDBクエリを作成してイメージを取得し、 'label'を< img> tag ...空の選択肢が見つかった場合は、デフォルトの 'label'を使用します...

それは...私はフォーマッタのコールバックがもう少し仕事を得ることができると思いますこの問題を解決するには、どのような提案やもっと良い解決策が歓迎されています...わかりますように、私はウィジェットの 'フォーマッタ'オプションに依存しています。 ..

読んでいただきありがとうございます!

関連する問題