问个批量更新的问题 [ 新手入门 ]
遇到这样一个问题,比如有一个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 -->
共 7 条回复
-
但是我试验了下,验证在一般输入里可以,但是在uploaded里面就失效了。。。
controllerpublic 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'
BoyLee
注册时间:2011-03-10
最后登录:2019-12-26
在线时长:20小时5分
最后登录:2019-12-26
在线时长:20小时5分
- 粉丝22
- 金钱2810
- 威望150
- 积分4510