Измучен я страданьем этим,
Я до тебя не плохо жил.
Зачем тебя я только встретил,
Скажи пожалуйста, скажи.
Это то я про этот замечательный фреймворк. Теперь по делу.
Пишу социальную сеть на Yii + MongoDB. Использую расширение YiiMongoDbSuite. Возникла проблема.
Дело в том, что в MongoDb нет жесткой структуры документа и если я запихну новое поле - оно сохраняется.
Вопрос в следующем: Как запретить Yii сохранять определенные аттрибуты? Чтобы они просто не сохранялись при вызове $model->save() ?????
Например, при авторизации пользователь вводит кроме логина и пароля еще и капчу. Чтобы код капчи проверялся, он должен быть свойством класса модели, притом публичным свойством, иначе каждый раз введенный код будет не верным. И в Mongo получается, что при сохранении модели в базу ложится и код капчи, а он там нафиг не нужен. Еще такая забавная штука происходит, когда у нас есть поле Пароль и Подтверждение пароля, пароль мы после валидации шифруем и сохраняем в базу, но поле Подтверждение пароля (оно тоже проходит валидации и значит определенно в модели) тоже ложится в базу при сохранении. Получается классная штука, мы термоядерными алгоритмами хешируем пароль, и все это напрасно, так как рядом есть поле подтверждение пароля, которое в откром виде. Как быть? Пробывал колдовать с safe/unsafe, но ничего не выходит, как только объявляю код капчи как unsafe, так сразу пропадает валидация этого поля, т.е. все время пишет, что введенный код не правильный. Гугл не дал никаких результатов. Есть идеи?
Код модели:
Код: Выделить всё
class Item extends EMongoDocument{
public $name;
public $soname;
public $verifyCode;
public static function model($className = __CLASS__) {
return parent::model($className);
}
public function getCollectionName() {
return 'item';
}
public function rules() {
return array(
array('name, soname', 'required', 'message'=>'Warning bleat!!!!!!'),
array('verifyCode', 'captcha', 'message'=>'hueviy cod'),
);
}
public function attributeLabels() {
return array(
'name'=>'Name',
'soname'=>'Soname',
);
}
public function attributeNames() {
return array(
'name',
'soname',
);
}
}
Код: Выделить всё
public function actionIndex()
{
// renders the view file 'protected/views/site/index.php'
// using the default layout 'protected/views/layouts/main.php'
$model = new Item;
if(isset($_POST['Item'])) {
$model->attributes = $_POST['Item'];
if($model->validate()) {
$model->save();
Yii::app()->end();
}
}
$this->render('index', array('model'=>$model));
}
Код: Выделить всё
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'UserForm',
'method'=>'post',
)); ?>
<?php echo $form->errorSummary($model); ?>
<div class="row">
<?php echo $form->label($model,'name'); ?>
<?php echo $form->textField($model,'name') ?>
</div>
<div class="row">
<?php echo $form->label($model,'soname'); ?>
<?php echo $form->textField($model,'soname') ?>
</div>
<div class="row rememberMe">
<?if(extension_loaded('gd') && Yii::app()->user->isGuest):?>
<?=CHtml::activeLabelEx($model, 'verifyCode')?>
<?$this->widget('CCaptcha')?>
<?=CHtml::activeTextField($model, 'verifyCode')?>
<?endif?>
</div>
<div class="row submit">
<?php echo CHtml::submitButton('Send'); ?>
</div>
<?php $this->endWidget(); ?>
</div><!-- form -->