Zend_Form Jquery& fileUploadErrorIniSize

时间:2011-04-08 15:47:54

标签: javascript ajax json zend-framework zend-form

编辑,我通过将我的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:

<?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 个答案:

答案 0 :(得分:4)

问题是您无法以与常规文本字段相同的方式处理文件字段。

当您致电$('input').val()时,您会获得文本字段的实际文本值,但是对于文件字段,您将获得文件名 - 而不是文件内容。

然后,您的脚本会尝试将您的文件名验证为文件,显然会失败。为了使文件验证器成功,您需要将实际文件内容传递给脚本。

因此,基本上,您需要将文件异步上传到服务器以执行所有必要的验证。

不幸的是,通过Ajax上传文件并不是一件容易的事情。您的基本选项是通过iFrameswfObject上传文件。您可以查看适用于此目的的广泛插件here

我个人对异步文件上传的选择是file-uploader jQuery plugin

答案 1 :(得分:2)

您是否在表单上添加了加密类型?

我找到了两篇不同的论坛帖子,包括一个堆栈帖子:

odd Zend_Form_Element_File behavior

您需要将enctype="multipart/form-data"添加到表单标记中。

基本上发生的事情是表单在发送到服务器之前使用其默认的“application / x-www-form-urlencoded”加密方法。此方法不支持文件上传。