【问题标题】:Zend Framework: Upload file by using Zend Form ElementZend 框架:使用 Zend 表单元素上传文件
【发布时间】:2011-09-22 01:29:29
【问题描述】:

目前我正在 Zend Framework 中处理表单。 它必须成为公司可以填写候选人详细信息的表格。

我对 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);
}

}

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

如果我必须从我的控制器中放置代码,也请告诉我

提前致谢!

【问题讨论】:

  • 我很困惑,你问了一个表单元素并向我们展示了你关于验证类的代码?

标签: file zend-framework zend-form


【解决方案1】:

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

<?php

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

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

<?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; ?>

【讨论】:

    【解决方案2】:

    试试这个:

    //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);
    

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      相关资源
      最近更新 更多