验证Yii中的动态文件字段失败


Failed validate dynamic filefields in Yii?

嗨,我正在尝试验证在Yii中创建的活动filefield字段的动态性

我使用forech来构建这些输入,问题是,当试图验证用户何时选择图像时,请指出您选择的文件是否超过了允许的重量,以及它是否是正确的文件格式。

但我不知道我做错了。

我试过这个:我的型号

public $image;
public function tableName() {
    return 'vrf_image';
}
/**
 * @return array validation rules for model attributes.
 */
public function rules() {
    // NOTE: you should only define rules for those attributes that
    // will receive user inputs.
    return array(
        array('id_form', 'numerical', 'integerOnly'=>true),
        // Pruebas para subir imagen
            // Inicio
            array(
                'image',
                'file',
                'types'=>'jpg, gif, png',
                'allowEmpty'=>true,
                'on'=>'update',
                'on'=>'insert',
                'wrongType'=>'Solo imagenes',
                'mimeTypes' => 'image/gif, image/jpeg, image/png',
                'wrongMimeType' => 'Invalid mime type',
                'maxSize'=>1024*1024*2,
                'tooLarge'=>'File has to be smaller than 2MB',
            ),
            array(
                'image',
                'length',
                'max'=>50,
                'on'=>'insert,update'
            ),
            array(
                'id, image, id_form, id_ques',
                'safe',
                'on'=>'search'
            ),
        // Fin
    );
}

我的观点

<div class="container-fluid">
<div class="row paddings_bottom">
<?php
    $hoho = VrfImage::model()->findAll("id_form = $search->id");
    $formImage=$this->beginWidget('CActiveForm', array(
        'id'=>'verification-form-image',
        'action' => Yii::app()->createUrl("backendVerification/default/CreateImage?id=".$modUser->id),
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
            'validateOnChange'=>true,
            'validateOnType'=>true,
        ),
    ));
?>
    <div class="col-md-12 col-lg-12">
        <table class="table table-bordered" style="margin-bottom: 0;">
            <?php
                $oo = 0; $ban = 0;
                foreach ($numQues as $ii => $NQ){
                    if($ii==0){
                        echo '<div class="borTopFormVrf"><span class="White">Company Documentation</span></div>';
                    }
                    if($ii <6){
                    if($oo<2){
                        if($oo==0){
                            echo '<tr>';
                        }
            ?>
                            <td class="col-md-6 col-lg-6 nopadd" style="border: 1px solid #000;">
                                <?php
                                    foreach ($hoho as $key => $value) {
                                        if($hoho[$key]->id_ques == $NQ){
                                            echo '<img src="'.getThemeUri().'/../../VerificationResource/images/'.$hoho[$key]->image.'" style="max-width:100%;">';
                                            $ban = 1;
                                        }
                                    }
                                    if($ban!=1){ echo '<img src="#" style="max-width:100%; visibility: hidden;" id="img_prev'.$ii.'" alt="your image"/>'; }
                                    else{ $ban=0; }
                                ?>
                                <?php echo $form->HiddenField($modImage,"[".$ii."]id_ques",array('value'=>$NQ)); ?>
                                <?php echo $formImage->fileField($modImage,'['.$ii.']image', array('class'=>'form-control Borf-c', 'onChange'=>'readURL(this,'.$ii.')')); ?>
                                <?php echo $formImage->error($modImage,'['.$ii.']image'); ?>
                                <div class="text-center">
                                    <?php echo $nameQues[$ii]; ?>
                                </div>
                            </td>
            <?php       if($oo==1){ echo '</tr>'; $oo = -1; }
                        $oo++;
                    }}
                }
            ?>
        </table>
    </div>
    <div class="col-md-12 col-lg-12">
        <div class="col-md-12 col-lg-12 divTopFormBVrf">
            <?php
                if(isset($search->id_verifier)){
                    if($search->id_verifier == userID()){
                        echo CHtml::submitButton('Save', array('class' => 'btn btn-success btn_create_address btn_create_address_size'));
                    }
                }
            ?>
        </div>
    </div>
<?php $this->endWidget(); ?>
</div>

在我的控制器中

public function actionCreateImage($id) {
    $form = VrfForm::model()->find("id_user = $id");
    $path_picture = realpath(Yii::app()->getBasePath()."/../VerificationResource/images")."/"; //ruta final de la imagen
    if(isset($_POST['VrfImage'])) {
        foreach ($_POST['VrfImage'] as $key => $value) {
            $modImage = new VrfImage;
            $modImage->attributes = $value;
            //print_r($modImage->validate());
            if($modImage->validate()){
                echo 'Correcto';
                ////////////////////////////////////////////////////////////////////
                $rnd = rand(0,9999);  // generar números aleatorios entre 0-9999
                $uploadedFile=CUploadedFile::getInstance($modImage,'['.$key.']image');
                $fileName = "{$rnd}-{$uploadedFile}";  // número aleatorio + nombre de archivo, o se puede usar: $fileName=$uploadedFile->getName();
                if(!empty($uploadedFile)) { // Compruebe si el archivo se ha subido o no.
                    $uploadedFile->saveAs($path_picture.$fileName);
                    $modImage->image = $fileName;
                    $modImage->id_ques = $value['id_ques'];
                    $modImage->id_form = $form->id;
                    if($modImage->save()) {
                        //echo ' REVISA!!! <br>';
                    }
                    else{
                        echo $modImage->error();
                    }
                }
                ////////////////////////////////////////////////////////////////////
            }
            else{
                echo 'Falla';
                //$this->redirect($this->createUrl('default/Form'));
            }
        }
    }
    //$this->redirect(Yii::app()->user->returnUrl.'backendVerification/default/Form?id='.$id);
}

但别这样。它不起作用

表单中的"clientOptions"不好吗我在模型中的规则不好吗

帮助T.T

我知道不要使用Yii来验证我的字段。这不是最好的方法,但我最终得到了这一点,以进行我需要的验证。

<div class="container-fluid">
<div class="row paddings_bottom">
<?php
    $hoho = VrfImage::model()->findAll("id_form = $search->id");
    $formImage=$this->beginWidget('CActiveForm', array(
        'id'=>'verification-form-image',
        'action' => Yii::app()->createUrl("backendVerification/default/CreateImage?id=".$modUser->id),
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
            'validateOnChange'=>true,
            'validateOnType'=>true,
        ),
    ));
?>
    <div class="col-md-12 col-lg-12">
        <table class="table table-bordered" style="margin-bottom: 0;">
            <?php
                $numQues = [11,22,33,44,55,66,77,88,99,111,222,333];
                $nameQues = ['Business license','Company code','Tax register','Export license','Joint venture approved certificate','Land certificate','ISO9001:2008','ISO14001;2004','UL certificate','CE certificate','Quality manual','Quality organization'];
                $oo = 0; $ban = 0;
                foreach ($numQues as $ii => $NQ){
                    if($ii==0){
                        echo '<div class="borTopFormVrf"><span class="White">Company Documentation</span></div>';
                    }
                    if($ii <6){
                    if($oo<2){
                        if($oo==0){
                            echo '<tr>';
                        }
            ?>
                            <td class="col-md-6 col-lg-6 nopadd" style="border: 1px solid #000;">
                                <?php
                                    foreach ($hoho as $key => $value) {
                                        if($hoho[$key]->id_ques == $NQ){
                                            echo '<img src="'.getThemeUri().'/../../VerificationResource/images/'.$hoho[$key]->image.'" style="max-width:100%;">';
                                            $ban = 1;
                                        }
                                    }
                                    if($ban!=1){
                                        echo '<img src="#" style="visibility: hidden;" id="img_prev'.$ii.'" alt="your image"/>';
                                    }
                                    else{ $ban=0; }
                                ?>
                                <?php echo $form->HiddenField($modImage,"[".$ii."]id_ques",array('value'=>$NQ)); ?>
                                <div class="col-md-12 col-lg-12" style="border-bottom: solid 1px #000;">
                                    <div class="col-md-7 col-lg-7">
                                        <?php echo $formImage->fileField($modImage,'['.$ii.']image', array( 'onChange'=>'readURL(this,'.$ii.')')); ?>
                                    </div>
                                    <div class="col-md-5 col-lg-5">
                                        <?php
                                        if($ban!=1){
                                            echo '<label id="lbl'.$ii.'" style="visibility: hidden;" onclick="kkk('.$ii.')">X</label>';
                                        }
                                        ?>
                                    </div>
                                </div>
                                <?php echo $formImage->error($modImage,'['.$ii.']image'); ?>
                                <div class="text-center">
                                    <?php echo $nameQues[$ii]; ?>
                                </div>
                            </td>
            <?php       if($oo==1){ echo '</tr>'; $oo = -1; }
                        $oo++;
                    }}
                }
            ?>
        </table>
    </div>
    <div class="col-md-12 col-lg-12 MT15">
        <div class="col-md-2 col-lg-2">
            <?php
                if(isset($search->id_verifier)){
                    if($search->id_verifier == userID()){
                        echo CHtml::submitButton('Save', array('class' => 'btn btn-success btn_formVrf btn_create_address_size GreenVrf'));
                    }
                }
            ?>
        </div>
    </div>
<?php $this->endWidget(); ?>
</div>

稍后使用函数js:

function readURL(input,num) {
    if (input.files && input.files[0]) {
        if(input.files[0].type=='image/jpeg' || input.files[0].type=='image/gif' || input.files[0].type=='image/png'){
            if(input.files[0].size>1000000){
                $('#VrfImage_'+num+'_image').val('');
                alert("El archivo supera el peso permitido (1MB)");
                return false;
            }
            else{
                var reader = new FileReader();
                reader.onload = function (e) {
                    $('#img_prev'+num).css('visibility','visible');
                    $('#img_prev'+num).attr('src', e.target.result).width(250).height(250);
                    $('#lbl'+num).css('visibility','visible');
                };
                reader.readAsDataURL(input.files[0]);   
            }
        }
        else{
            $('#VrfImage_'+num+'_image').val('');
            alert("El archivo no es una imagen valida'n(debe ser JPG, JPEG, GIF o PNG y pesar maximo 1MB.)");
            return false;
        }
    }
}
function kkk(num){
    $('#img_prev'+num).css('visibility','hidden');
    $('#img_prev'+num).css('height','27px');
    $('#VrfImage_'+num+'_image').val('');
    $('#lbl'+num).css('visibility','hidden');
}