Zend Framework:使用Zend Form Element上传文件

Jor*_*itK 0 zend-framework file zend-form

此时我正在使用Zend Framework中的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);
}

}
Run Code Online (Sandbox Code Playgroud)

如何添加表单元素,我可以在其中选择文件并将其上传,以便存储(例如在/ application/tmp中)

如果我必须从控制器中下载代码,请告诉我

提前致谢!

And*_*rew 8

首先Zend_Validate_Abstract,您应该Zend_Form使用一种init()可以创建表单元素的方法来扩展,而不是扩展:

<?php

class Application_Form_ContactMethodSelected extends Zend_Form
{
    public function init()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

既然您有一个可以使用的实际表单,您可以添加文件上传元素之类的内容:

<?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));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您有一个包含某些元素的表单,您可以在控制器中使用它:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的视图脚本中,您可以显示您的表单:

<h1>My upload form</h1>
<?php echo $this->form; ?>
Run Code Online (Sandbox Code Playgroud)