Загрузка файлов с Zend_Form_Element_File

Роб Ален опубликовал новую заметку в своем блоге — File uploads with Zend_Form_Element_File. Пост хоть и не большой, но для новичков полезный. Предлагаю мой перевод этой заметки. Рекомендую обратить особое внимание на первый абзац заключения.

Теперь, когда выпущен Zend Framework 1.7, я решил, что стоит взглянуть на встроенный элемент загрузки файлов — Zend_Form_Element_File, и посмотреть как можно его использовать. Предлагаю пример на базе простейшей формы.

Я решил использовать тот же набор элементов формы, что и ранее с целью демонстрации упрощения разработки.

Итак, приступим:

Форма

Мы расширим Zend_Form и сохраним полученный класс forms_UploadForm в каталоге application/forms:

<?php

class forms_UploadForm extends Zend_Form
{
    public function __construct($options = null)
    {
        parent::__construct($options);
        $this->setName('upload');
        $this->setAttrib('enctype', 'multipart/form-data');

        $description = new Zend_Form_Element_Text('description');
        $description->setLabel('Description')
                  ->setRequired(true)
                  ->addValidator('NotEmpty');

        $file = new Zend_Form_Element_File('file');
        $file->setLabel('File')
            ->setDestination(BASE_PATH . '/data/uploads')
            ->setRequired(true);

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

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

Как и ранее (прим. пер.: в предыдущей заметке, ссылка на которую была выше), мы задаем имя формы и атрибут enctype для включения механизма загрузки файлов. Сама форма имеет два поля: текстовое поле, названное «Описание», и поле для загрузки файла, названное «Файл», наряду с кнопкой «Отправить». Здесь ничего особо сложного нет.

Элемент Zend_Form_Element_File имеет метод setDestination (), который используется для указания нижележащему (прим. пер.: имеется в виду с точки зрения абстракции) Zend_File_Transfer_Adapter_Http где мы хотим сохранить загруженные файлы. В данном примере мы выбрали каталог data/uploads.

Контроллер и представление

Контроллер так же весьма стандартный:

<?php

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this->view->headTitle('Home');
        $this->view->title = 'Zend_Form_Element_File Example';
        $this->view->bodyCopy = "<p>Please fill out this form.</p>";

        $form = new forms_UploadForm();

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

Представление views/scripts/index.phtml абсолютно тривиально:

<h1><?= $this->title; ?></h1>
<?= $this->bodyCopy; ?>
<?= $this->form; ?>

Если форма успешно прошла валидацию, массив $uploadedData будет содержать значения полей формы вместе с именем загруженного файла. Обратите внимание, что имя файла не полное. Если вам нужен весь путь к файлу, то используйте метод getFileName () файлового элемента.

Заключение

Это все, что нужно для построения простейшей формы загрузки файлов. Однако есть еще несколько настолько важных ошибок в компоненте, что имеет смысл дождаться версии 1.7.2. К примеру, валидатор Count не всегда работает так, как от него ожидаешь, а getValues () и receive () все еще не достаточно умны, чтобы вызывать move_uploaded_file () только один раз.

Как обычно, вот zip-файл проекта, созданный мной для тестирования: Zend_Form_Element_File_Example.zip (включает Zend Framework (снепшот ветки release-1.7) — именно поэтому он более 3,9Мб).

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

1 звезда2 звезд3 звезд4 звезд5 звезд (2 голосов, средний: 5.00 из 5)
Loading ... Loading ...

Метки: ,



Оставить комментарий