2011-07-18 81 views
0

此時我正在Zend Framework中使用Form。 它必須成爲一個公司可以填寫候選人詳細信息的表格。Zend Framework:使用Zend Form元素上傳文件

我對Zend很新,所以這就是爲什麼我發佈我的問題。

這是形式的樣子(一些字段中刪除,使代碼更短)

<?php 

class Application_Form_Validate_ContactMethodSelected extends Zend_Validate_Abstract { 
const INVALID = 'invalid'; 

protected $_messageTemplates = array(
    self::INVALID => 'Ten minste 1 vorm van contact invullen, telefoon, mobiel of e-mail' 
); 

public function isValid($value, $context = array()) 
{ 
// You need to use your element names, consider making these dynamic 
$checkFields = array('telefoon','mobiel','mail'); 
// Check if all are empty 
foreach ($checkFields as $field) { 
if (isset($context[$field]) && !empty($context[$field])) { 

    if (!empty($value)) { 
     // This is the element with content... validate as true 
     return true; 
    } 
    // we are going to return false and no error 
    // to break validation chain on other empty values 
    // This is a quick hack, don't have time to invest in this 
    return false; 
    } 
} 

// All were empty, set your own error message 
$this->_error(self::INVALID); 
return false; 
} 

} 


class Application_Form_Nieuwkandidaat extends Zend_Form { 

public function init() { 
    $this->setMethod('post'); 

    $DB = Zend_Db_Table::getDefaultAdapter(); 

    $id = $this->createElement('hidden', 'id'); 
    $voornaam = $this->createElement('text', 'voornaam'); 
    $voornaam->setLabel('Voornaam:') 
      ->setAttrib('size', 50)->addValidator('StringLength', false, array(2, 30)) 
      ->setRequired(true); 
    $telefoon = $this->createElement('text', 'telefoon'); 
    $telefoon->setLabel('Telefoon:') 
      ->setAttrib('size', 50)->setAllowEmpty(false) 
      ->addValidator(new Application_Form_Validate_ContactMethodSelected(), true) 
      ->addValidator('StringLength', false, array(10, 10)); 
    $mobiel = $this->createElement('text', 'mobiel'); 
    $mobiel->setLabel('Mobiel:') 
      ->setAttrib('size', 50)->setAllowEmpty(false) 
      ->addValidator(new Application_Form_Validate_ContactMethodSelected(), true) 
      ->addValidator('StringLength', false, array(10, 10)); 
    $mail = $this->createElement('text', 'mail'); 
    $mail->setLabel('E-mail:') 
      ->setAttrib('size', 50)->setAllowEmpty(false) 
      ->addValidator(new Application_Form_Validate_ContactMethodSelected(), true) 
      ->addValidator('StringLength', false, array(6, 40))->addValidator('EmailAddress', true); 
    $register = $this->createElement('submit', 'register'); 
    $register->setLabel("Verstuur") 
      ->setIgnore(true); 
    $reset = $this->createElement('reset', 'reset'); 
    $reset->setLabel("Reset") 
      ->setIgnore(true); 
    $this->addElements(array(
     $voornaam, 
     $mobiel, 
     $telefoon, 
     $mail, 
     $id, 
    )); 

    $this->addDisplayGroup(array(
     'voornaam', 
     'mobiel', 
     'telefoon', 
     'mail', 
     'telefoon' 
      ), 'contacts', array('legend' => 'Contact Informatie')); 

    $contacts = $this->getDisplayGroup('contacts'); 
    $contacts->setDecorators(array(
     'FormElements', 
     'Fieldset', 
     array('HtmlTag', array('tag' => 'div', 'style' => 'width:50%;;float:left;')) 
    )); 

    $this->setDecorators(array(
     'FormElements', 
     array('HtmlTag', array('tag' => 'div', 'style' => 'width:98%')), 
     'Form' 
    )); 

    $this->addElement($register); 
} 

} 

我如何添加一個表單元素,我可以選擇一個文件並上傳它,所以它會被存儲(比方說,例如在/應用/ TMP)

如果非要將代碼從我的控制器的地方,請讓我知道提前以及

謝謝!

+0

我很困惑,你問一個表單元素並向我們展示你的關於驗證類的代碼? –

+0

-1我沒有收到回覆。 – JellyBelly

回答

4

試試這個:

//Element Attachment 
$this->addElement('file', 'attachment', array('label' => 'Attachment')); 
$this->attachment->setDestination(APPLICATION_PATH . "/tmp/"); 
$this->attachment->addValidator('NotExists', false); 

$attachment = $this->createElement('file', 'attachment', array('label' => 'Attachment')) 
->attachment->setDestination(APPLICATION_PATH . "/tmp/") 
->addValidator('NotExists', false); 
+0

當我將此添加到我的代碼時,我收到一個錯誤 – JorritK

+0

我添加其他方法! – JellyBelly

8

首先,而不是擴展Zend_Validate_Abstract,你應該延長Zend_Forminit()方法,你可以創建你的表單元素:

<?php 

class Application_Form_ContactMethodSelected extends Zend_Form 
{ 
    public function init() 
    { 
    } 
} 

現在你有一個行爲UAL形式一起工作,你可以像你的文件上傳元素添加的東西:

<?php 

class Application_Form_ContactMethodSelected extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setAttrib('enctype', 'multipart/form-data'); 

     $file = new Zend_Form_Element_File('file'); 
     $file->setLabel('File') 
      ->setDestination(APPLICATION_PATH . '/tmp') 
      ->setRequired(true); 

     $submit = new Zend_Form_Element_Submit('submit'); 
     $submit->setLabel('Upload'); 

     $this->addElements(array($file, $submit)); 
    } 
} 

現在你有一些元素形式,你可以在你的控制器使用方法:

<?php 

class IndexController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    { 
     $form = new Application_Form_ContactMethodSelected(); 

     if ($this->_request->isPost()) { 
      $formData = $this->_request->getPost(); 
      if ($form->isValid($formData)) { 

       // success - do something with the uploaded file 
       $uploadedData = $form->getValues(); 
       $fullFilePath = $form->file->getFileName(); 

       Zend_Debug::dump($uploadedData, '$uploadedData'); 
       Zend_Debug::dump($fullFilePath, '$fullFilePath'); 

       echo "done"; 
       exit; 

      } else { 
       $form->populate($formData); 
      } 
     } 

     $this->view->form = $form; 
    } 
} 

而且在你的視圖腳本,你可以顯示你的表單:

<h1>My upload form</h1> 
<?php echo $this->form; ?>