2

一部のフィールドに小数を含めることができる Zend フォームを変更する必要があります。現在、ポイントを使用して小数のみを入力できます。34.75)

ユーザーができるようにしたいのは、コンマまたはポイントの両方で小数を書くことです。フィールドには、34.75とのような数値を含めることができます34,75(この場合、両方とも同じ値になります)。サーバー上の構成を変更したくないので、コードでこれを行う必要があります。

現在、一部のフィールドの値は他のフィールドの関数で計算されます。そのため、コンマを入力すると、計算がめちゃくちゃになります。これは JavaScript で行われ、これらの計算を修正する必要がありますが、今のところ、フォームを取得するときに php コードでこの問題を修正したいと考えています。

Zend の Web サイトで解決策を見つけようとしましたが、他の場所で既に読んだことのある例が見つかりませんでした。コードでわかるように、フィルターまたはバリデーターのいずれかをzend_form_element_text. str_replace要素が であるため、使用できませんzend_form_element_text

参照用にこの他の質問を見つけました。

結果のコードは次のとおりです。

$tabBilanFrais = array( 'txtFraisSecretariat' => array( 'nom' => 'Frais secrétariat', 'disabled' => true, "class"=>"calcul"),
                            'txtFraisRegion' => array( 'nom' => 'Frais région', 'disabled' => false),
                            'txtFraisSalle' => array( 'nom' => 'Salle', 'disabled' => false, "class"=>"calcul"),
                            'txtFraisPause' => array( 'nom' => 'Pauses', 'disabled' => false, "class"=>"calcul"),
                            'txtDivers' => array( 'nom' => 'Divers', 'disabled' => false, "class"=>"calcul"),
                            'txtTotalRegion' => array( 'nom' => 'Total région', 'disabled' => true, "class"=>"total"),
                            'txtIndemnisationAdherent' => array( 'nom' => 'Comm. ADH', 'disabled' => true, "class"=>"calcul"),
                            'txtIndemnisationPAP' => array( 'nom' => 'Comm. PAP', 'disabled' => true, "class"=>"calcul"),
                            'txtIndemnisationForNext' => array( 'nom' => 'Comm. ForNext', 'disabled' => true, "class"=>"calcul"),
                            'txtIndemnisationPROStages' => array( 'nom' => 'Comm. PROStages', 'disabled' => true, "class"=>"calcul"),
                            'txtRecettes' => array( 'nom' => 'Recettes', 'disabled' => true, "class"=>"totalMontant"),
                            'txtDepenses' => array( 'nom' => 'Dépenses', 'disabled' => true, "class"=>"totalMontant"),
                            'txtRecettesH' => array( 'nom' => 'Recettes', 'disabled' => false, "class"=>"hiddenTxt"),
                            'txtDepensesH' => array( 'nom' => 'Dépenses', 'disabled' => false, "class"=>"hiddenTxt")
                    );


$tabFormulaire = array() ;

foreach($tabBilanFrais as $id => $tabElement)
{
    if($tabElement['nom'] == 'Frais region' )
        $element = new Zend_Form_Element_Hidden($id, array("label" => $tabElement['nom'], "required" => false, 'decorators' => array("ViewHelper", "Errors", "Label"))) ;
    else{
        $element = new Zend_Form_Element_Text($id, array("label" => $tabElement['nom'], "required" => false, 'decorators' => array("ViewHelper", "Errors", "Label"))) ;
        //$element->addFilter('pregReplace', array('match' => '/,/', 'replace' => '.'));
        $element->addFilter('LocalizedToNormalized');
        $element->addValidator('float', true, array('locale' => 'fr_FR'));
        if(isset($tabElement['class']) && $tabElement['class']){
            $element->setAttrib('class', $tabElement['class']);
        }
    }

    if( $tabElement['disabled'])
        $element->setAttrib('disabled', 'disabled');



    $tabFormulaire[] = $element ;
}

動作していpregReplaceません。バリデーターは(comma becomes a .). 数値が浮動小数点数でないというエラー メッセージが表示されます。

4

3 に答える 3

2

いつでも独自のバリデータを作成できます。フロートの場合、私はあなたのような同じ問題に直面しました:

class Yourlib_Validate_Float extends Zend_Validate_Abstract
{
    const INVALID   = 'floatInvalid';
    const NOT_FLOAT = 'notFloat';

    /**
     * @var array
     */
    protected $_messageTemplates = array(
        self::INVALID   => "Invalid type given. String, integer or float expected",
        self::NOT_FLOAT => "'%value%' does not appear to be a float",
    );

    public function isValid($value)
    {
        $this->_setValue($value);

        $value = str_replace(',', '.', $value);

        if (!is_string($value) && !is_int($value) && !is_numeric($value)) {
            $this->_error(self::INVALID);
            return false;
        }

        if (is_numeric($value)) {
            return true;
        }

        $this->_error(self::NOT_FLOAT);
        return false;
    }
}

バリデーターを追加するには:

$element->addValidator(new Yourlib_Validate_Float());

好きな名前に変更Yourlibしてください。そして、次のように「名前空間」を application.ini に登録する必要があります。

autoloadernamespaces.Yourlib = "Yourlib_"

厳密に言えば、このバリデーターはnumericバリデーターです。でのチェックにより、int や float などのすべての数値を受け入れますis_numeric。自由に変更してください。

于 2013-07-15T15:26:42.367 に答える
0

さて、コードの変更された部分は次のとおりです。

foreach($tabBilanFrais as $id => $tabElement)
        {
            if($tabElement['nom'] == 'Frais region' )
                $element = new Zend_Form_Element_Hidden($id, array("label" => $tabElement['nom'], "required" => false, 'decorators' => array("ViewHelper", "Errors", "Label"))) ;
            else{
                $element = new Zend_Form_Element_Text($id, array("label" => $tabElement['nom'], "required" => false, 'decorators' => array("ViewHelper", "Errors", "Label"))) ;
                $element->addFilter('pregReplace', array('match' => '/,/', 'replace' => '.'));
                $element->addFilter('LocalizedToNormalized');
                $element->addValidator(new Anper_Validate_Float(), true, array('locale' => 'fr_FR'));
                if(isset($tabElement['class']) && $tabElement['class']){
                    $element->setAttrib('class', $tabElement['class']);
                }
            }

            if( $tabElement['disabled'])
                $element->setAttrib('disabled', 'disabled');



            $tabFormulaire[] = $element ;
        }

しかし、要素が $tabFormulaire に追加される前に、$element のフィールドの値のコンマをポイントに置き換える必要があります。現在、フォームを検証して更新された値を表示すると、コンマを含む数字が切り捨てられます (124,5 は 124 になります)。pregreplace が機能していないようです。

編集: pregReplace は必要ないようです。カスタム バリデータの isValid 関数で 2 つのエコーを使用しました。1 つは str_replace の前、もう 1 つは後です。フィールドの 1 つにカンマで値を書き込むと、両方のエコーでポイント付きの数値が表示されます。LocalizedToNormalized フィルターの結果だと思います。私が理解していないのは、値が保存されて表示されると、私が行った調査にもかかわらず、カンマのある値が切り捨てられる理由です。

Edit2: たとえば 124 8 と書き、pregReplace を使用して空白がないようにすると、8 は保存されません。pregReplace が機能しているにもかかわらず (以前のエコーで試しました)。

于 2013-07-16T07:05:20.687 に答える