Zend_Form Jquery & fileUploadErrorIniSize - PullRequest
       14

Zend_Form Jquery & fileUploadErrorIniSize

2 голосов
/ 08 апреля 2011

Редактировать, я исправил это, изменив мой JS на:

$('.zend_form input:not([type="file"]), .zend_form textarea').each(function() {
    data[$(this).attr('name')] = $(this).val();
});

Здравствуйте,

Как я уже писал ранее, я следовал за ZendCast, который позволял вам использовать jQuery для обнаружения и отображения пользователям проблем с их формой.

Однако поля файла всегда возвращаются: fileUploadErrorIniSize (Файл 'image_front_url' превышает определенный размер ini ", даже если файл находится в пределах ограничений по размеру.

TPL Forms:

<?php $this->headScript()->captureStart(); ?>

$(function() { 

    $('.zend_form input, .zend_form textarea').blur(function() {
        var formElementId = ($(this).parent().prev().find('label').attr('for'));
        doValidation(formElementId);
    });
});


function doValidation(id) {

    var url = '/<?php echo MODULE; ?>/json/validateform/form_name/<?php echo get_class($this->form); ?>';
    var data = {};

    $('.zend_form input, .zend_form textarea').each(function() {
        data[$(this).attr('name')] = $(this).val();
    });

    $.post(url, data, function(resp) {
        $('#'+id).parent().find('.errors').remove();
        $('#'+id).parent().append(getErrorHtml(resp[id], id));
    }, 'json');

};

function getErrorHtml(formErrors, id) {

    var o = '';
    if (formErrors != null) {
    var o = '<ul id="errors-'+id+'" class="errors">';

    for (errorKey in formErrors) {
        o += '<li>'+formErrors[errorKey]+'</li>';
    }
    o += '</ul>';
    }
    return o;
}

<?php $this->headScript()->captureEnd(); ?>


<?php 
if (is_object($this->form) && $this->form->getErrorMessages()) {
    echo $this->partial('partials/errors.phtml', array('errors' => $this->form->getErrorMessages(), 'translate' => $this->translate));
}
?>

<?php if (isset($this->errorMsg)) { ?>
    <p><?php echo $this->errorMsg; ?></p>
<?php } ?>

<?php echo $this->form; ?>

Который направлен на

<?php

class Administration_JsonController extends Zend_Controller_Action {


    public function validateformAction() {

        $form_name  = $this->_getParam('form_name');
        $form       = new $form_name();
        $data       = $this->_getAllParams();

        $form->isValidPartial($data);
        $json = $form->getMessages();
        $this->_helper->json($json);
    }

}

Пример возвращаемого json:

{"name":{"isEmpty":"Value is required and can't be empty"},"name_url":{"isEmpty":"Value is required and can't be empty"},"image_site_url":{"fileUploadErrorIniSize":"File 'image_site_url' exceeds the defined ini size"},"image_url":{"fileUploadErrorIniSize":"File 'image_url' exceeds the defined ini size"},"image_front_url":{"fileUploadErrorIniSize":"File 'image_front_url' exceeds the defined ini size"},"image_back_url":{"fileUploadErrorIniSize":"File 'image_back_url' exceeds the defined ini size"}}

Я заметил, что у некоторых людей была эта проблема, и они сказали, что isValidPartial исправляет ее, поэтому я изменил

$form->isValid($data);

до

$form->isValidPartial($data);

но это не решило эту проблему.

Есть идеи?

Ответы [ 2 ]

4 голосов
/ 13 апреля 2011

Проблема в том, что вы не можете обрабатывать файловые поля так же, как обычные текстовые поля.

Когда вы вызываете $('input').val(), вы получаете фактическое текстовое значение для текстового поля, но для поля файла вы получаете имя файла, а не содержимое файла.

Затем ваш скрипт пытается проверить ваше имя файла как файл и, по-видимому, не удается. Для успешной проверки файлов вам необходимо передать фактическое содержимое файла в сценарий.

Таким образом, вам необходимо асинхронно загрузить файл на сервер, чтобы выполнить все необходимые проверки.

К сожалению, загрузка файлов через Ajax не совсем тривиальная вещь. Ваши основные опции - загрузка файлов через iFrame или swfObject. Вы можете взглянуть на широкий выбор плагинов, подходящих для этой цели здесь .

Мой личный выбор для асинхронной загрузки файла будет плагин jQuery для загрузки файлов .

2 голосов
/ 12 апреля 2011

Вы добавляете в форму тип Encrypt?

Я нашел два сообщения на этом форуме, включая сообщение в стеке:

странное поведение Zend_Form_Element_File

Вам необходимо добавить enctype="multipart/form-data" в тег формы.

В основном происходит то, что форма использует по умолчанию метод шифрования application / x-www-form-urlencoded по умолчанию перед отправкой на сервер.Загрузка файла не поддерживается этим методом.

...