2012-02-19 21 views
4

Zend Formには1つのファイル要素が含まれています。Zend_Form_Element_Fileは、必要でない場合に検証時にfalseを返します。

$this->addElement('file', 'image', array(
     'label'   => 'Upload Image:', 
     'destination' => APPLICATION_PATH . '/tmp/', 
     'validators' => array(
      array('count', true, array(
       'min' => 1, 
       'max' => 1, 
       'messages' => array(
        Zend_Validate_File_Count::TOO_FEW => 
         'You must upload an image file', 
        Zend_Validate_File_Count::TOO_MANY => 
         'You can only upload one image file'))), 
      array('extension', true, array(
       'extention' => 'jpg,png,gif', 
       'messages' => array(
        Zend_Validate_File_Extension::NOT_FOUND => 
         'The file has an invalid extention (jpg,png,gif only)', 
        Zend_Validate_File_Extension::FALSE_EXTENSION => 
         'The file has an invalid extention (jpg,png,gif only)'))), 
      array('imageSize', true, array(
       'minheight' => self::IMAGEHEIGHT, 
       'minwidth' => self::IMAGEWIDTH, 
       'maxheight' => self::IMAGEHEIGHT, 
       'maxwidth' => self::IMAGEWIDTH, 
       'messages' => array(
        Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG => 
         'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall', 
        Zend_Validate_File_ImageSize::HEIGHT_TOO_SMALL => 
         'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall', 
        Zend_Validate_File_ImageSize::WIDTH_TOO_BIG => 
         'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide', 
        Zend_Validate_File_ImageSize::WIDTH_TOO_SMALL => 
         'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide', 
        Zend_Validate_File_ImageSize::NOT_DETECTED => 
         'The image dimensions cannot be detected', 
        Zend_Validate_File_ImageSize::NOT_READABLE => 
         'The image dimensions cannot be read')))) 
    )); 

このファイル要素は、後のコードでは必須ではないように設定されています。添付ファイルなしでフォームを送信すると、フォームvalidtionはfalseを返します。また、getErrors()メソッドでフォームエラーを検索しても、エラーは報告されません。添付ファイルでフォームを送信すると、すべて正常に動作します。

私はいつかgoogleingされていますが、答えが見つかりません。私は誰かがなぜこれが起こっているのかについていくつかの光を当てることができることを願っています。私はZF 1.11.11を使用しています。

ありがとうございます。要求されるようにここではギャリー

EDIT

は、いくつかのより多くのコードサンプルです。

これらは、フォームの検証に使用する方法です。検証バグの回避策として使用したコードをマークしました。

public function formValid(Array $params) 
{ 
    if (is_null($this->_form)) 
     throw new Zend_Exception('You must first initialize the form'); 

    $formValid = $this->_validateForm($this->_form, $params); 

    // Workaround for bug in validating file elements 
    if (!$formValid) { 
     if (!$this->_form->getMessages()) { 
      $formValid = true; 
      $this->_validValues = $this->_form->getValidValues($params); 
     } 
    } 

    if ($formValid) { 
     if ($this->_form instanceof Admin_Form_AddDirectSite || 
      $this->_form instanceof Admin_Form_EditDirectSite) { 
       if (isset($this->_validValues['replaceImage'])) { 
        return $this->_form->getElement('image')->receive(); 
       } else { 
        return true; 
       } 
      } elseif ($this->_form instanceof Admin_Form_PromoteDirectSite) { 
       $today = new Zend_Date(); 
       $expires = new zend_date($this->_validValues['DirectSitesHighlighted']['toDate']); 
       if ($expires->isEarlier($today)) { 
        $this->_form->getSubForm('DirectSitesHighlighted') 
           ->getElement('toDate') 
           ->addError('The date must be in the future'); 
        return false; 
       } else { 
        return true; 
       } 
      } else { 
       return true; 
      } 
    } else { 
     return false; 
    } 
} 

protected function _validateForm(Zend_Form $form, Array $params) 
{ 
    if ($form->isValid($params)) { 
     $this->_validValues = $form->getValidValues($params); 
     return true; 
    } else { 
     $this->_validValues = null; 
     return false; 
    } 
} 

これらはフォームを初期化するために使用する関数です.1つの抽象クラスを共有する2つのフォームクラスがあります。

public function initAddForm() 
{ 
    $this->_form = new Admin_Form_AddDirectSite(); 
    return $this; 
} 

public function initEditForm() 
{ 
    $this->_form = new Admin_Form_EditDirectSite(); 
    return $this; 
} 

これらは3つのフォームクラスです。

class Admin_Form_AddDirectSite extends Admin_Form_DirectSites_Abstract 
{ 
    public function init() 
    { 
     parent::init(); 

     $this->setAction('/admin/direct-sites/add'); 

     $this->setDecorators(array(
      array('ViewScript', array('viewScript' => 'forms/addDirectSites.phtml')) 
     )); 

     $this->getElement('image')->setRequired(true); 

     $this->addElement('hidden', 'replaceImage', array(
      'required'  => true, 
      'label'   => 'Replace Image:', 
      'value'   => 1, 
      'filters'  => array('Int'), 
     )); 
    } 
} 

class Admin_Form_EditDirectSite extends Admin_Form_DirectSites_Abstract 
{ 
    public function init() 
    { 
     parent::init(); 

     $this->setAction('/admin/direct-sites/edit'); 

     $this->setDecorators(array(
      array('ViewScript', array('viewScript' => 'forms/editDirectSites.phtml')) 
     )); 

     $this->getElement('image')->setRequired(false); 

     $this->addElement('checkbox', 'replaceImage', array(
      'required'  => false, 
      'label'   => 'Replace Image:', 
      'checked'  => false, 
      'attribs'  => array(
       'title'   => 'Click to replace the image file' 
      ), 
      'filters'  => array('Int'), 
      'validators' => array(
       array('Int', true, array(
        'messages' => array(
         Zend_Validate_Int::NOT_INT => 
          'You must check to replace the image file')))) 
     )); 

     $this->addElement('hidden', 'directSiteId', array(
      'required' => false, 
      'vslue'  => null 
     )); 
    } 
} 

abstract class Admin_Form_DirectSites_Abstract extends Freedom_Zend_Form 
{ 
    /** 
    * Domain prefix http://www. 
    * @var integer 
    */ 
    const HTTPWWW = 1; 

    /** 
    * Domain prefix http:// 
    * @var integer 
    */ 
    const HTTP = 2; 

    /** 
    * The image width in pixels 
    * @var integer 
    */ 
    const IMAGEWIDTH = 100; 

    /** 
    * The image height in pixels 
    * @var integer 
    */ 
    const IMAGEHEIGHT = 100; 

    /** 
    * Initialize the form 
    * @see Zend_Form::init() 
    */ 
    public function init() 
    { 
     $domainPrefix = array(
      self::HTTPWWW => 'http://www.', 
      self::HTTP  => 'http;//' 
     ); 

     $genres = Model_Doctrine_GenresTable::getInstance()->getAllKeyPairs(); 

     $artworkMediums = Model_Doctrine_ArtworkMediumsTable::getInstance()->getAllKeyPairs(); 

     $this->setName('directSitesForm') // setup registration form 
      ->setAttrib('id', 'directSitesForm') 
      ->setMethod('post') 
      ->setAttrib('class', 'directSitesForm') 
      ->setEnctype(Zend_Form::ENCTYPE_MULTIPART); 

     $this->addElementPrefixPath('Freedom_Zend', 'Freedom/Zend'); // add element prefix path 
     $this->addPrefixPath('Freedom_Zend_Form', 'Freedom/Zend/Form'); // add form prefix path 

     $directSitesDescription = new Zend_Form_SubForm(); 
     $directSitesTitle = new Zend_Form_SubForm(); 

     $this->addElement('text', 'domainName', array(
      'required' => true, 
      'label'  => 'Domain Name:', 
      'attribs' => array(
       'title'  => 'Please enter the url of the site', 
       'size'  => 20, 
       'maxlength' => 255 
      ), 
      'filters'  => array('StringTrim', 'StripTags', 'StripNewlines'), 
      'validators' => array(
       array('NotEmpty', true, array(
         'messages' => array(
          Zend_Validate_NotEmpty::IS_EMPTY => 
           "You must specify the domain name"))), 
       array('StringLength', true, array(
         'min' => 5, 
         'max' => 255, 
         'messages' => array(
          Zend_Validate_StringLength::INVALID => 
           'Your URL must be between 5 and 255 characters in length', 
          Zend_Validate_StringLength::TOO_LONG => 
           'Your URL must not contain more than 255 characters', 
          Zend_Validate_StringLength::TOO_SHORT => 
           'Your URL must contain more than 5 characters')))) 
     )); 

     $this->addElement('radio', 'websitePrefix', array(
      'required' => true, 
      'label'  => 'Domain Prefix:', 
      'attribs' => array(
       'title'  => 'Please select the URL prefix for the domain name' 
      ), 
      'multiOptions' => $domainPrefix, 
      'value'  => self::HTTPWWW, 
      'filters' => array('int'), 
      'validators' => array(
       array('NotEmpty', true, array(
        'messages' => array(
         Zend_Validate_NotEmpty::IS_EMPTY => 
          "You must select your agency's website URL", 
         Zend_Validate_NotEmpty::INVALID => 
          "You must select your agency's website URL"))), 
       array('InArray', true, array(
        'haystack' => array_keys($domainPrefix), 
        'messages' => array(
         Zend_Validate_InArray::NOT_IN_ARRAY => 
          "You must select your agency's website URL")))) 
     )); 

     $directSitesTitle->addElement('text', 'title', array(
      'required' => true, 
      'label'  => 'Title:', 
      'attribs' => array(
       'title'  => 'Please enter the name of the site', 
       'size'  => 20, 
       'maxlength' => 255 
      ), 
      'filters'  => array('StringTrim', 'StripTags', 'StripNewlines'), 
      'validators' => array(
       array('NotEmpty', true, array(
         'messages' => array(
          Zend_Validate_NotEmpty::IS_EMPTY => 
           "You must specify the sites title"))), 
       array('StringLength', true, array(
         'min' => 5, 
         'max' => 100, 
         'messages' => array(
          Zend_Validate_StringLength::INVALID => 
           'Your title must be between 5 and 100 characters in length', 
          Zend_Validate_StringLength::TOO_LONG => 
           'Your title must not contain more than 100 characters', 
          Zend_Validate_StringLength::TOO_SHORT => 
           'Your title must contain more than 5 characters')))) 
     )); 

     $directSitesDescription->addElement('text', 'description', array(
      'required' => true, 
      'label'  => 'Description:', 
      'attribs' => array(
       'title'  => 'Please enter the description of the site', 
       'size'  => 50, 
       'maxlength' => 100 
      ), 
      'filters'  => array('StringTrim', 'StripTags', 'StripNewlines'), 
      'validators' => array(
       array('NotEmpty', true, array(
         'messages' => array(
          Zend_Validate_NotEmpty::IS_EMPTY => 
           "You must specify the sites description"))), 
       array('StringLength', true, array(
         'min' => 5, 
         'max' => 100, 
         'messages' => array(
          Zend_Validate_StringLength::INVALID => 
           'Your sites description must be between 5 and 100 characters in length', 
          Zend_Validate_StringLength::TOO_LONG => 
           'Your sites description must not contain more than 100 characters', 
          Zend_Validate_StringLength::TOO_SHORT => 
           'Your sites description must contain more than 5 characters')))) 
     )); 

     $this->addElement('file', 'image', array(
      'label'   => 'Upload Image:', 
      'destination' => APPLICATION_PATH . '/tmp/', 
      'validators' => array(
       array('count', true, array(
        'min' => 0, 
        'max' => 1, 
        'messages' => array(
         Zend_Validate_File_Count::TOO_FEW => 
          'You must upload an image file', 
         Zend_Validate_File_Count::TOO_MANY => 
          'You can only upload one image file'))), 
       array('extension', true, array(
        'extention' => 'jpg,png,gif', 
        'messages' => array(
         Zend_Validate_File_Extension::NOT_FOUND => 
          'The file has an invalid extention (jpg,png,gif only)', 
         Zend_Validate_File_Extension::FALSE_EXTENSION => 
          'The file has an invalid extention (jpg,png,gif only)'))), 
       array('imageSize', true, array(
        'minheight' => self::IMAGEHEIGHT, 
        'minwidth' => self::IMAGEWIDTH, 
        'maxheight' => self::IMAGEHEIGHT, 
        'maxwidth' => self::IMAGEWIDTH, 
        'messages' => array(
         Zend_Validate_File_ImageSize::HEIGHT_TOO_BIG => 
          'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall', 
         Zend_Validate_File_ImageSize::HEIGHT_TOO_SMALL => 
          'The image must be exactly ' . self::IMAGEHEIGHT . ' pixels tall', 
         Zend_Validate_File_ImageSize::WIDTH_TOO_BIG => 
          'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide', 
         Zend_Validate_File_ImageSize::WIDTH_TOO_SMALL => 
          'The image must be exactly ' . self::IMAGEWIDTH . ' pixels wide', 
         Zend_Validate_File_ImageSize::NOT_DETECTED => 
          'The image dimensions cannot be detected', 
         Zend_Validate_File_ImageSize::NOT_READABLE => 
          'The image dimensions cannot be read')))) 
     )); 

     $this->addElement('multiCheckbox', 'Genres', array(
      'required' => false, 
      'label'  => 'Genres:', 
      'attribs' => array(
       'title'  => 'Please select the sites genres' 
      ), 
      'multiOptions' => $genres, 
      'filters' => array('int'), 
      'validators' => array(
       array('NotEmpty', true, array(
        'messages' => array(
         Zend_Validate_NotEmpty::IS_EMPTY => 
          "You must select the sites genres", 
         Zend_Validate_NotEmpty::INVALID => 
          "You must select the sites genres"))), 
       array('InArray', true, array(
        'haystack' => array_keys($genres), 
        'messages' => array(
         Zend_Validate_InArray::NOT_IN_ARRAY => 
          "You must select the sites genres")))) 
     )); 

     $this->addElement('multiCheckbox', 'ArtworkMediums', array(
      'required' => false, 
      'label'  => 'Artwork Mediums:', 
      'attribs' => array(
       'title'  => 'Please select the sites artwork mediums' 
      ), 
      'multiOptions' => $artworkMediums, 
      'filters' => array('int'), 
      'validators' => array(
       array('NotEmpty', true, array(
        'messages' => array(
         Zend_Validate_NotEmpty::IS_EMPTY => 
          "You must select the sites artwork mediums", 
         Zend_Validate_NotEmpty::INVALID => 
          "You must select the sites artwork mediums"))), 
       array('InArray', true, array(
        'haystack' => array_keys($artworkMediums), 
        'messages' => array(
         Zend_Validate_InArray::NOT_IN_ARRAY => 
          "You must select the sites artwork mediums")))) 
     )); 

     $this->addElement('submit', 'save', array(
      'label' => 'Save', 
      'attribs' => array(
       'title' => 'Save') 
     )); 

     $this->addSubForm($directSitesDescription, 'DirectSitesDescription') 
      ->addSubForm($directSitesTitle, 'DirectSitesTitle'); 
    } 
} 
+1

私は一つだけの形であなたと同じ問題を抱えています。この投稿は少し古いので、あなたは解決策を見つけましたか? –

答えて

1

私が見ることができるすべては、あなたがすべての回で1つのファイルの最小値を必要としているように見える、あなたの'count'バリが少しグラグラに見えるということです。エラーメッセージが表示されない理由はわかりません。
は、以下

array('count', true, array(
       'min' => 1, 
       'max' => 1, 
       'messages' => array(
        Zend_Validate_File_Count::TOO_FEW => 
         'You must upload an image file', 
        Zend_Validate_File_Count::TOO_MANY => 
         'You can only upload one image file'))), 

'min' => 0がZend_Validate_File_CountコンストラクタのAPIで設定してみてくださいZF 1.11 API

__constructで全体のAPIが表示される場合があります(整数|配列| \のZend_Config $オプション):無効を設定バリオプション

最小はファイル数を制限し、max = nullで使用すると最大ファイル数は です。 'min'と 'max'キーを持つ配列も受け入れます。 $ optionsは整数で、最大ファイル数として使用されます。配列 は次のキーを受け入れます: 'min':最小ファイル数 'max':最大 filecountパラメータ名前型説明 $ options整数|配列| \ Zend_Config要素が必要とされていない場合でも

+0

こんにちはRockyFord、あなたのお返事ありがとうございます。あなたの提案に応じてminを0に設定しようとしましたが、運がないと、検証はエラーなしで失敗します。 – Garry

0

RockyFordが正しいアダプタのオプションは、あなたは0

Countバリのmin値を設定する必要があり、値が空でないときにそのバリデータがまだ処理されています。ファイル要素はカウントバリデーターと少し違って動作します。 0より大きいminを指定した場合、依然として多くのファイルをアップロードする必要があります。

必須フラグをオフにする次のコードを試してください。さらに、少なくとも0個のファイルを要求するようにCountバリデーターを設定します。

$form->getElement('image') 
    ->setRequired(false) 
    ->getValidator('count') 
    ->setMin(0); 

私はこれをテストして動作しました。 minを0に設定しなかった場合、フォームは検証に失敗しますが、エラーメッセージYou must upload an image fileが表示されます。おそらくあなたのデコレータはFile要素でエラーを表示していませんか?

+0

こんにちはdrew010、あなたの答えに感謝します。私が上で触れたように、私はRockyFordの提案に従ってminをゼロに設定しましたが、ファイルをアップロードしないと、検証エラーが表示されます。 zend formのgetMessages()メソッドは空の配列を返し、エラーは内部的には報告されません。 – Garry

+0

その場合は、使用するフォームとコントローラのより完全なコードを投稿できますか?ビュー内でフォーム要素を個別にレンダリングしていますか?もしそうなら、あなたは要素を残しましたか? minを0に設定するとうまくいくはずです。 isValidを複数の場所で呼び出しているのですか、それとも単独で要素を検証したのでしょうか、あるいはフォームや要素で 'markAsError'や' addError'を呼び出すのでしょうか? – drew010

+0

上記のコードサンプルをいくつか追加して、フォームと一緒に使用する検証方法を示しました。 1つの抽象クラスを共有する2つのフォームがあります.1つはファイル要素で必須trueに設定されているため、Admin_Form_AddDirectSiteの検証が失敗することが予想されます。また、ファイル要素からすべてのバリデータを削除しても、検証は失敗します。 – Garry

1

ダブルチェックが

enctype='multipart/form-data' 

がHTMLフォーム要素に含まれていることを確認します。私は同じ問題で2時間を過ごしました。それは私の問題だった。

+0

こんにちはリズ、あなたの答えに感謝します。私のフォームのenctypeは正しいです(multipart/form-data) – Garry

1

ZF 1.11 Aはるかに簡単な解決策は、フォームを送信すると要素を削除することです:

$upload = new Zend_File_Transfer(); 
    $files = $upload->getFileInfo(); 

     if(empty($files)) 
     { 
      $form->removeElement('image_name'); 
     } 
     else 
     { 
      $form->image_name->receive(); 
     } 

     if($form->isValid($_POST)) 
     { 
     $formData = $form->getValues(); 
     } 
関連する問題