2011-10-23 7 views
0

挨拶フェローコーダー。Zend_Form_Element_Radioを無効にする方法はありますが、依然としてその値はPOSTリクエストに含まれていますか?

私のアプリケーションでは、Zend_FormsにいくつかのZend_Form_Elementsがあります。ユーザーの役割に基づいて、これらの要素の一部を読み取り専用/無効の状態に変更したいと考えています。しかし、フォームを提出することは依然として重要です。 POSTは各要素の値を送信する必要があります。 したがって、readonly属性の設定は正常に動作しますが、無効にはなりません。 HTMLフォーム要素を無効にすると、その値はPOST要求に渡されません。

問題は、すべてのタイプのフォーム要素でreadonly属性を設定できないことです。ラジオボタンには影響しません。

/** 
* 
* changes the Zend_Form_Element to a 'readonly' like state 
* 
* @param String $name (zend-) name of the element 
*/ 
public function readonlyElement($name){ 
    $elem = $this->getForm()->getElement($name); 
    /* @var $elem Zend_Form_Element */ 

    $attribs = $elem->getAttribs(); 

    if(is_a($elem, 'Zend_Form_Element_Radio')){ 
     // !! this does NOT work !! 
     $attribs['disabled'] = true; 
     $value = $elem->getValue(); 
     $hidden = new Zend_Form_Element_Hidden($name);   
     $hidden->setValue($value); 
     $this->getForm()->addElement($hidden); 
    } 
    else { 
     $attribs['readonly'] = true; 
    }   

    $style = $attribs['style']; 


    $attribs['style'] = $style; 
    $elem->setAttribs($attribs); 
} 

ラジオボタンを無効にして、同じ値と同じ名前の非表示フィールドを追加しようとしました。 Zend_Form_Elementの名前は一意でなければならないので、これはうまくいきませんでした。私も$ elem-> setName()で遊んで、既存の要素の名前を別のものに変更しました。これまでのところ、私は成功していませんでした。私の問題を解決する方法はありますか?

おかげで、明確にするために

アンドレアス

: これは私がコントローラに自分のフォームを使用する方法である:

$form = new Some_Form(); 
//attach filters, validators, remove unneeded elements based on active user 
$this->modifyForm($form); 
if ($this->getRequest->save){ 
    if $form->isValid(($this->getRequest->params){ 
    //... Check and save 
    } 
} 
else{ 
    $form->populate($model->toArray()); 
} 

「無効」のフィールドが最初に投入されますが、フォーム検証の場合POSTデータが送信されなかったために空になります。無効なフィールドと同じ名前の隠しフィールドを追加すると、純粋なPHP/HTMLでこの問題が解決されます。

答えて

0

モデル内の値を常に検証してください! あなたのフォーム - 値だけに頼らないでください!これは、最新のブラウザを備えた誰でも、読み取り専用入力の値を変更するためのケーキです。

はSO基本的には、フォームが送信するものに依存している必要がありますどのような状況で、あなたのモデル

switch ($user->getRight()) { 
    case 'admin': 
    $myCustomField = $this->_getParam('value'); 
    break; 
    case 'normaluser': 
    $myCustomField = in_array($this->_getParam('value'), array(
     'values', 'user', 'is', 
     'allowed', 'to', 'set')) ? $this->_getParam('value') : $defaultValue; 
    break; 
} 

$model->setField($myCustomField); 

の内側に、このような何かを行います。明らかに_getParam('value')を使用している場合、送信されたID(あなたがラジオ要素を選択しているものと思われます)がデータベース(Db_RecordExists)に存在するかどうかを確認する何らかのバリデーターチェックが必要です

+1

私はあなたに同意しませんフォームフィールドにバリデーターとフィルターを設定し、$ form-> getValidValues()を使用して安全な投稿データを取得します。 –

+1

あなたの答えをありがとう。私は最終的な検証のために私のフォーム値に頼っていません。しかし私は私のコントローラで$ form-> isValid($ this-> getRequest-> getPost())を使ってフォームを検証します。エラーの場合、エラーが表示され、古い「POSTed」値がすべて表示されます。 (フォームを再生成する必要はありません)したがって、ラジオボタンの値が送信されない場合、それらは単にチェックが外されます。 – ACNB

+0

@Kees Schepers私は、値が変更されないようにするために、フォームのreadonly属性に依存しないとSamが言っていたと思います。 – ACNB