Проблема. На странице есть куча полей редактируемых через TbEditableField и отдельная форма, которая отвечает за загрузку фотографии профиля. Фотография грузится, в БД записывается ее название и все хорошо до тех пор, пока не произойдет обновление любого поля через TbEditableField. Данные о фотографии просто слетают..
1. Как залогировать все запросы в БД, даже которые происходят через AJAX.
2. Как вообще решить данную проблему?
Часть вьюхи с TbEditableField
Код: Выделить всё
<div class="text-left block_name">
<?php echo Yii::t('system', 'email').':' ?>
</div>
<div class="text-left block_desc">
<?php $this->widget('booster.widgets.TbEditableField', array('type' => 'text', 'emptytext'=>Yii::t('system','specify'), 'model' => $model, 'attribute' => 'email', 'url' => array('/user/default/updateField'))); ?>
</div>
<div class="text-left block_name">
<?php echo Yii::t('system', 'password').':' ?>
</div>
<div class="text-left block_desc">
<?php $this->widget('booster.widgets.TbEditableField', array('type' => 'text', 'model' => $model, 'attribute' => 'password', 'url' => array('/user/default/updateField'), 'emptytext'=>Yii::t('system','change_password'))); ?>
</div>
Код: Выделить всё
<div style="display: inline-block;">
<?php echo CHtml::beginForm(array('/user/default/uploadPhoto'),'post', array('enctype'=>'multipart/form-data'));
echo CHtml::activeFileField($model,'photo'); ?>
</div>
<div style="display: inline-block;">
<?php $this->widget('booster.widgets.TbButton',array('label' =>Yii::t('system', 'upload'), 'buttonType'=>'submit'));
echo CHtml::endForm(); ?>
</div>
Действие контроллера для TbEditableField
Код: Выделить всё
public function actionUpdateField(){
$model = User::model()->attr()->findbyPk(Yii::app()->user->id);
if($_POST['name']!=='password')
$model->$_POST['name'] = $_POST['value'];
else
$model->password = UserModule::encrypting($_POST['value']);
$model->save();
}
Код: Выделить всё
$model = User::model()->attr()->findbyPk(Yii::app()->user->id);
$model->photo = $_POST['User']['photo'];
$model->save();
$this->redirect(array('/user/default/index'));
Код: Выделить всё
public $photo;
public function rules(){
return array(
array('photo', 'file', 'types'=>'jpg, jpeg, gif, png','allowEmpty'=>true,'on'=>'insert, update'),
);
}
protected function beforeSave(){
if(!parent::beforeSave())
return false;
if(($this->scenario=='insert' || $this->scenario=='update') && ($file = CUploadedFile::getInstance($this,'photo'))){
$this->deletePhoto();
$extension = strtolower($file->extensionName);
$filename = RandomNameHelper::getRandomFileName(Yii::getPathOfAlias('webroot.uploads/user_photos'), $extension);
$basename = $filename.'.'.$extension;
$this->photo = $basename;
$file->saveAs(Yii::getPathOfAlias('webroot.uploads/user_photos').DIRECTORY_SEPARATOR.$this->photo);
}
return true;
}
protected function beforeDelete(){
if(!parent::beforeDelete())
return false;
$this->deletePhoto();
return true;
}
public function deletePhoto(){
$photoPath = Yii::getPathOfAlias('webroot').'/uploads/user_photos/'.User::model()->attr()->findbyPk(Yii::app()->user->id)->photo;
if(is_file($photoPath))
unlink($photoPath);
}