Zend Framework: загрузка файла с использованием Zend Form Element
В данный момент я работаю над формой в 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)
Если мне нужно разместить код с моего контроллера, пожалуйста, дайте мне знать
Заранее спасибо!
2 ответа
Прежде всего, а не расширение Zend_Validate_Abstract
, вы должны расширяться Zend_Form
с init()
Метод, в котором вы можете создать свои элементы формы:
<?php
class Application_Form_ContactMethodSelected extends Zend_Form
{
public function init()
{
}
}
Теперь, когда у вас есть актуальная форма для работы, вы можете добавить такие вещи, как элемент File upload:
<?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; ?>
Попробуй это:
//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);