BoyLee 2011-04-04 14:39:22 10015次浏览 7条回复 0 0 0

遇到这样一个问题,比如有一个model,定义了2个属性 一个是名称,一个是图片。

然后我需要做一个批量更新的页面,这个页面主要实现,一次更新8个 上面提到的model,主要就是 读出8个名字,然后8个图片上传框。

这个时候就遇到个问题,在view里面如何命名这8个model里面的name,实现post and file类型传值? 这个问题我解决了,但是不优雅,直接的问题就是rules全部都无效了。

下面是代码 controller

public function actionUpdateAll()
{
    for ($i=1;$i<7;$i++)
        ${'model_'.$i}=$this->loadModel($i);
    if(isset($_POST['PPreviewMap1']))
    {
        for ($i=1;$i<7;$i++)
        {
            $tmp_img_old =${'model_'.$i}->img; 
            ${'model_'.$i}->attributes=$_POST['PPreviewMap'.$i];  
            if (@!empty($_FILES['PPreviewMap'.$i]['name']['img'])){
                ${'model_'.$i}->img = Map::model()->generateRandomName(0);
                //validate, oldname, newname, waiting to save and saveAs
                if (${'model_'.$i}->validate(array('img'))){
                    //echo $i;
                    $tmp_img = CUploadedFile::getInstanceByName(('PPreviewMap'.$i.'[img]'));
                    //var_dump($tmp_img);
                    $tmp_img->saveAs(Yii::app()->basePath.'/../map_img/'.${'model_'.$i}->img);
                }
            }else {
                ${'model_'.$i}->img = $tmp_img_old==''? 'default.jpg' : $tmp_img_old;
            }
			  
            ${'model_'.$i}->save();
            }
        }
for ($i=1;$i<7;$i++)
    $arrPass['model_'.$i] = ${'model_'.$i};
    $this->render('updateAll',array('arrPass' =>$arrPass));
}

updateAll

<?php echo $this->renderPartial('_formAll', $arrPass); ?>

_formAll

<div class="form">
<?php 
$form=$this->beginWidget('CActiveForm', array(
    'id'=>'ppreview-map-form',
    'enableAjaxValidation'=>false,
    'htmlOptions' =>array('enctype'=>"multipart/form-data" )
)); ?>

<?php 
for ($i=1;$i<7;$i++)
    echo $form->errorSummary(${'model_'.$i}); 
?>

<?php 
for ($i=1; $i<7; $i++):?>
    <div class="row">
        <?php echo $form->labelEx(${'model_'.$i},'pre_map_title'); ?>
        <?php echo $form->textField(${'model_'.$i},'pre_map_title',array('size'=>32,'maxlength'=>32, 'name'=>'PPreviewMap'.$i.'[pre_map_title]')); ?>
        <?php echo $form->error(${'model_'.$i},'pre_map_title'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx(${'model_'.$i},'img'); ?>
        <?php echo $form->fileField(${'model_'.$i},'img',array('size'=>60,'maxlength'=>150, 'name'=>'PPreviewMap'.$i.'[img]')); ?>
        <?php echo $form->error(${'model_'.$i},'img'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx(${'model_'.$i},'url'); ?>
        <?php echo $form->textField(${'model_'.$i},'url',array('size'=>60,'maxlength'=>1500, 'name'=>'PPreviewMap'.$i.'[url]')); ?>
        <?php echo $form->error(${'model_'.$i},'url'); ?>
    </div>
<hr/>
<?php endfor;?>

    <div class="row buttons">
        <?php echo CHtml::submitButton('Save'); ?>
    </div>

<?php $this->endWidget(); ?>

</div><!-- form -->
  • 回复于 2011-04-04 14:43 举报

    以前 获得上传实例是这样实现的,但是在多个model同时的情况下就无效了

    $model->uploaded_cover_img = CUploadedFile::getInstance($model, 'map_img');
    

    如果我改成

    $model->uploaded_cover_img = CUploadedFile::getInstance(${'model_'$i}, 'map_img');
    

    如果这样写 在循环里就抓不到内容了。。好奇怪。。。

  • 回复于 2011-04-04 14:46 举报

    收集表格输入
    我也处理过这个问题,看一下上面的教程。

  • 回复于 2011-04-04 15:18 举报

    看了一次原来是在这里

    <td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
    

    搞错了POST的类型,下潜,测试下。

  • 回复于 2011-04-04 15:30 举报

    哈哈,这个我测试过了,是可行的。

  • 回复于 2011-04-04 17:03 举报

    但是我试验了下,验证在一般输入里可以,但是在uploaded里面就失效了。。。
    controller

    public function actionUpdateAll()
    {
        for ($i=1;$i<7;$i++)
        $PMaps[$i]=$this->loadModel($i);
        if(isset($_POST['PPreviewMap']))
        {
            $valid = true;
            foreach ($PMaps as $k=>$PMap)
            {
                $tmp_img_old = $PMap->img;
                $PMap->attributes = $_POST['PPreviewMap']["$k"];
            		
                if (@!empty($_FILES['PPreviewMap']['name']["$k"]['img'])){
                    $PMap->img = Map::model()->generateRandomName(0);
                    //validate, oldname, newname, waiting to save and saveAs
                if ($PMap->validate(array("img"))){ //这一行无效。。。。
                    $tmp_img = CUploadedFile::getInstance($PMap, "[$k]img");
                    echo '<pre>';
                    print_r($tmp_img);
                    echo '</pre>';
                    $tmp_img->saveAs(Yii::app()->basePath.'/../map_img/'.$PMap->img);
                }
                }else {
                    $PMap->img = $tmp_img_old==''? 'default.jpg' : $tmp_img_old;
                }
                $valid = $valid && $PMap->validate();
                }
    		    
                if ($valid)
                    echo 'All Pass';
                }
    
        $this->render('updateAll',
            array('PMaps' =>$PMaps)
        );
    }
    

    view

    <?php 
    foreach ($PMaps as $PMap)
        echo '<p>'.$form->errorSummary($PMap).'</p>'; 
    ?>
    
    <?php foreach ($PMaps as $k=>$PMap):?>
    <div class="row">
        <?php echo $form->labelEx($PMap,"[$k]pre_map_title"); ?>
        <?php echo $form->textField($PMap,"[$k]pre_map_title",array('size'=>32,'maxlength'=>32)); ?>
        <?php echo $form->error($PMap,$k."[$k]pre_map_title"); ?>
    </div>
    
    <div class="row">
        <?php echo $form->labelEx($PMap,"[$k]img"); ?>
        <?php echo $form->fileField($PMap,"[$k]img",array('size'=>60,'maxlength'=>150)); ?>
        <?php echo $form->error($PMap,"[$k]img"); ?>
    </div>
    
    <div class="row">
        <?php echo $form->labelEx($PMap,"[$k]url"); ?>
        <?php echo $form->textField($PMap,"[$k]url",array('size'=>60,'maxlength'=>1500)); ?>
        <?php echo $form->error($PMap,"[$k]url"); ?>
    </div>
    <hr/>
    <?php endforeach;?>
    

    model

    array('img', 'file', 'allowEmpty'=>true, 'types'=>'jpg','maxSize'=>1024*1024*1, 'tooLarge'=>'最大只能上传1MB'),
    

    我想认证这一条规则,但是这个规则只能在单model模式下有效,验证方法 $PMap->validate(array("img")), 一旦使用多model就不行了。。。。而且在tabular file uploading的时候

    $tmp_img = CUploadedFile::getInstance($PMap, "[$k]img");
    

    这样获得的实例,而不是直接'img'

  • 回复于 2011-04-05 16:09 举报
    $PMap->img = Map::model()->generateRandomName(0);
    

    问题解决了, 出错在这一步,大概的方法是,在tabular uploading file的时候,必须指定实例给model的属性,然后验证,我写的代码是验证文件名了,或者内部逻辑不对,大概是这样,不过我之前的代码在单文件upload的时候有效,所以我想 是我不够熟悉这个导致的。

  • 回复于 2011-04-05 16:58 举报

    哈哈哈哈,祝贺你啊!

您需要登录后才可以回复。登录 | 立即注册