public function testClone()
 {
     $text = EavField::getNewInstance('User', EavField::DATATYPE_TEXT, EavField::TYPE_TEXT_SIMPLE);
     $text->save();
     $singleSel = EavField::getNewInstance('User', EavField::DATATYPE_NUMBERS, EavField::TYPE_NUMBERS_SELECTOR);
     $singleSel->handle->set('single.sel');
     $singleSel->setValueByLang('name', 'en', 'Select one value');
     $singleSel->save();
     $value1 = EavValue::getNewInstance($singleSel);
     $value1->setValueByLang('value', 'en', $firstValue = '20');
     $value1->save();
     $value2 = EavValue::getNewInstance($singleSel);
     $value2->setValueByLang('value', 'en', $secValue = '30');
     $value2->save();
     $user = User::getNewInstance('*****@*****.**');
     $user->save();
     $spec = $user->getSpecification();
     $spec->setAttributeValueByLang($text, 'en', 'text');
     $spec->setAttributeValue($singleSel, $value1);
     $user->save();
     $cloned = clone $user;
     $cloned->email->set('*****@*****.**');
     $cloned->save();
     $this->assertNotSame($cloned->getSpecification(), $user->getSpecification());
     $this->assertEquals($cloned->getSpecification()->getAttribute($text)->getValueByLang('value', 'en'), 'text');
     ActiveRecordModel::clearPool();
     $reloaded = ActiveRecordModel::getInstanceByID('User', $cloned->getID(), true);
     $this->assertEquals($reloaded->getSpecification()->getAttribute($text)->getValueByLang('value', 'en'), 'text');
     $this->assertEquals($reloaded->getSpecification()->getAttribute($singleSel)->getValue()->get()->getID(), $value1->getID());
 }
Пример #2
0
 public static function model($className = __CLASS__)
 {
     return parent::model($className);
 }
Пример #3
0
 public function actionAjaxAttributeValues($attrs, $term, $typeId = 0)
 {
     if (Yii::app()->request->isAjaxRequest) {
         // Получаем список доступных атрибутов для поиска
         $searchAddressAttributes = [];
         foreach (RealtyItem::$searchAddressAttributes as $section) {
             $searchAddressAttributes = array_merge($searchAddressAttributes, $section['attributes']);
         }
         // Проверяем переданный список атрибутов на корректность
         $attrs = explode(',', $attrs);
         foreach ($attrs as &$attr) {
             $attr = trim($attr);
             if (!in_array($attr, $searchAddressAttributes)) {
                 unset($attr);
             }
         }
         $criteria = new CDbCriteria();
         $criteria->addInCondition('t.name', $attrs);
         $attributes = EavAttributeExtended::model()->findAll($criteria);
         $values = [];
         foreach ($attributes as $attribute) {
             $class = EavValue::model($attribute->data_type);
             $valueField = $class->valueField;
             $criteria = new CDbCriteria();
             $criteria->join = 'LEFT JOIN ' . RealtyItem::model()->tableName() . ' r ON t.entity_id = r.id';
             $criteria->distinct = true;
             $criteria->select = 't.' . $valueField;
             if (!empty($typeId)) {
                 $criteria->compare('r.type_id', (int) $typeId);
             }
             $criteria->compare('t.eav_attribute_id', $attribute->id);
             $criteria->compare('r.status', RealtyItem::STATUS_ACTIVE);
             $criteria->addCondition('t.' . $valueField . ' LIKE :term');
             $criteria->params[':term'] = '%' . $term . '%';
             $criteria->order = 't.' . $valueField . ' ASC';
             $models = EavValue::model()->findAll($criteria);
             foreach ($models as $model) {
                 $values[] = $model->{$valueField};
             }
         }
         sort($values);
         echo CJSON::encode($values);
         Yii::app()->end();
     }
 }
Пример #4
0
 /**
  * Validates the specified value of the property EavAttribute::$data_type.
  * @param $attribute
  * @param $params
  */
 public function eavAttributeDataTypeValidator($attribute, $params)
 {
     if (!$this->getIsNewRecord()) {
         if ($this->oldDataType !== $this->data_type) {
             $this->addError($attribute, 'The value of the property ' . __CLASS__ . '::$' . $attribute . ' cannot be
             changed if it was saved previously.');
         }
     } else {
         if (!@class_exists($this->data_type)) {
             $this->addError($attribute, 'The class ' . $this->data_type . ' not found.');
         } else {
             if (!EavValue::model($this->data_type) instanceof EavValue) {
                 $this->addError($attribute, 'The class ' . $this->data_type . '.php must be ' . 'a subclass of the class EavValue.');
             }
         }
     }
 }
Пример #5
0
 public function setValue($entityModel, $catgoryId, $itemId, $value)
 {
     if (!isset($this->_value) || !$this->_value) {
         $this->_value = $this->loadValue($entityModel, $catgoryId, $itemId);
     }
     if (!$this->_value) {
         if (!($eavModel = EavEntityModel::findOne(['entity_model' => $entityModel]))) {
             throw new InvalidParamException(Yii::t('yee/eav', 'Model was not found.'));
         }
         if (!($eavEntity = EavEntity::findOne(['model_id' => $eavModel->id, 'category_id' => $catgoryId]))) {
             throw new InvalidParamException(Yii::t('yee/eav', 'Entity was not found.'));
         }
         $eavValue = new EavValue(['entity_id' => $eavEntity->id, 'attribute_id' => $this->getPrimaryKey(), 'item_id' => $itemId, 'value' => $value]);
         if (!$eavValue->save()) {
             throw new \yii\db\Exception(Yii::t('yee/eav', 'An error occurred during creation of EavValue record.'));
         }
         $this->_value = $eavValue;
     }
     $this->_value->value = $value;
 }
 /**
  * Creates an instance of the class CDbCommand that represents an SQL statement to retrieve
  * all the values of EAV-attributes for the specified record(s) from the database.
  * @param mixed $record Either a derived class instance from the class EavActiveRecord or list of instances.
  * @return mixed Returns false if specified records do not have any EAV-attributes, otherwise it returns
  * an instance of the class CDbCommand.
  */
 private function createUnionCommand($record)
 {
     $db = $this->getDbConnection();
     $castType = $this->getCastType();
     $params = array();
     $sql = '';
     $counter = 0;
     if ($record instanceof EavActiveRecord) {
         $set = $record->getRelated(self::EAV_SET_RELATION_NAME);
         if (is_null($set)) {
             return false;
         }
         $attributes = $set->getEavAttributes();
         if (empty($attributes)) {
             return false;
         }
         if (count($attributes) == 1) {
             $key = array_keys($attributes);
             $attr = $attributes[$key[0]];
             $class = EavValue::model($attr->data_type);
             return $db->createCommand()->select()->from($class->tableName())->where(array('and', 'eav_attribute_id = :eav_attribute_id', 'entity = :entity', 'entity_id = :entity_id'), array(':eav_attribute_id' => $attr->id, ':entity' => $record->getEntity(), ':entity_id' => $record->getPrimaryKey()));
         }
         foreach ($attributes as $attr) {
             $class = EavValue::model($attr->data_type);
             $command = $db->createCommand()->select('id, eav_attribute_id, entity_id, entity, CAST(value AS ' . $castType . ') AS value')->from($class->tableName())->where(array('and', 'eav_attribute_id = :eav_attribute_id_' . $counter, 'entity = :entity_' . $counter, 'entity_id = :entity_id_' . $counter));
             $params[':eav_attribute_id_' . $counter] = $attr->id;
             $params[':entity_' . $counter] = $record->getEntity();
             $params[':entity_id_' . $counter] = $record->getPrimaryKey();
             $counter++;
             $sql .= $sql === '' ? '(' . $command->text . ')' : ' UNION ALL (' . $command->text . ')';
         }
         $command = $db->createCommand()->select('id, eav_attribute_id, entity_id, entity, CAST(value AS ' . $castType . ') AS value')->from('(' . $sql . ') AS t');
         $command->params = $params;
         return $command;
     } else {
         if (count($record) == 1) {
             $keys = array_keys($record);
             return $this->createUnionCommand($record[$keys[0]]);
         }
         foreach ($record as $rec) {
             $set = $rec->getRelated(self::EAV_SET_RELATION_NAME);
             if (is_null($set)) {
                 continue;
             }
             $attributes = $set->getEavAttributes();
             if (empty($attributes)) {
                 continue;
             }
             foreach ($attributes as $attr) {
                 $class = EavValue::model($attr->data_type);
                 $command = $db->createCommand()->select('id, eav_attribute_id, entity_id, entity, CAST(value AS ' . $castType . ') AS value')->from($class->tableName())->where(array('and', 'eav_attribute_id = :eav_attribute_id_' . $counter, 'entity = :entity_' . $counter, 'entity_id = :entity_id_' . $counter));
                 $params[':eav_attribute_id_' . $counter] = $attr->id;
                 $params[':entity_' . $counter] = $rec->getEntity();
                 $params[':entity_id_' . $counter] = $rec->getPrimaryKey();
                 $counter++;
                 $sql .= $sql === '' ? '(' . $command->text . ')' : ' UNION ALL (' . $command->text . ')';
             }
         }
         if ($counter == 0) {
             return false;
         } else {
             if ($counter == 1) {
                 $command->params = $params;
                 return $command;
             }
         }
         $command = $db->createCommand()->select('id, eav_attribute_id, entity_id, entity, CAST(value AS ' . $castType . ') AS value')->from('(' . $sql . ') AS t');
         $command->params = $params;
         return $command;
     }
 }
 public function testInsertWithEavAttributes()
 {
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test1';
     $model->datetimeSingle = '2011-10-05 09:10:01';
     $model->varcharMultiple = array(1, 2, 3, 4, 5);
     $this->assertTrue($model->insertWithEavAttributes());
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test1', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertEquals('2011-10-05 09:10:01', $model->datetimeSingle);
     $this->assertEquals(5, count($model->varcharMultiple));
     $this->assertTrue(in_array('1', $model->varcharMultiple));
     $this->assertTrue(in_array('2', $model->varcharMultiple));
     $this->assertTrue(in_array('3', $model->varcharMultiple));
     $this->assertTrue(in_array('4', $model->varcharMultiple));
     $this->assertTrue(in_array('5', $model->varcharMultiple));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test2';
     $model->datetimeSingle = '';
     $model->varcharMultiple = array(1, 2, 3, 4, 5);
     $this->assertTrue($model->insertWithEavAttributes());
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test2', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertNull($model->datetimeSingle);
     $this->assertEquals(5, count($model->varcharMultiple));
     $this->assertTrue(in_array('1', $model->varcharMultiple));
     $this->assertTrue(in_array('2', $model->varcharMultiple));
     $this->assertTrue(in_array('3', $model->varcharMultiple));
     $this->assertTrue(in_array('4', $model->varcharMultiple));
     $this->assertTrue(in_array('5', $model->varcharMultiple));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test3';
     $model->varcharMultiple = array(1, 2, 3, 4, 5);
     $this->assertTrue($model->insertWithEavAttributes());
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test3', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertNull($model->datetimeSingle);
     $this->assertEquals(5, count($model->varcharMultiple));
     $this->assertTrue(in_array('1', $model->varcharMultiple));
     $this->assertTrue(in_array('2', $model->varcharMultiple));
     $this->assertTrue(in_array('3', $model->varcharMultiple));
     $this->assertTrue(in_array('4', $model->varcharMultiple));
     $this->assertTrue(in_array('5', $model->varcharMultiple));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test4';
     $model->varcharMultiple = array(1, '', null, 4, 5);
     $this->assertTrue($model->insertWithEavAttributes());
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test4', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertNull($model->datetimeSingle);
     $this->assertEquals(3, count($model->varcharMultiple));
     $this->assertTrue(in_array('1', $model->varcharMultiple));
     $this->assertTrue(in_array('4', $model->varcharMultiple));
     $this->assertTrue(in_array('5', $model->varcharMultiple));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test5';
     $model->varcharMultiple = array();
     $this->assertTrue($model->insertWithEavAttributes());
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test5', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertNull($model->datetimeSingle);
     $this->assertEquals(0, count($model->varcharMultiple));
     $this->assertEquals(array(), $model->varcharMultiple);
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test6';
     $this->assertTrue($model->insertWithEavAttributes());
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test6', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertNull($model->datetimeSingle);
     $this->assertEquals(array(), $model->varcharMultiple);
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test7';
     $model->datetimeSingle = '2011-10-05 09:10:01';
     $model->varcharMultiple = array('a', 'b');
     $this->assertTrue($model->insertWithEavAttributes(array('eav_set_id', 'datetimeSingle', 'varcharMultiple')));
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertNull($model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertEquals('2011-10-05 09:10:01', $model->datetimeSingle);
     $this->assertEquals(2, count($model->varcharMultiple));
     $this->assertTrue(in_array('a', $model->varcharMultiple));
     $this->assertTrue(in_array('b', $model->varcharMultiple));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test8';
     $model->datetimeSingle = '2011-10-05 09:10:01';
     $model->varcharMultiple = array('a', 'b');
     $this->assertTrue($model->insertWithEavAttributes(array('eav_set_id', 'name', 'varcharMultiple')));
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test8', $model->name);
     $this->assertEquals('2', $model->eav_set_id);
     $this->assertNull($model->datetimeSingle);
     $this->assertEquals(2, count($model->varcharMultiple));
     $this->assertTrue(in_array('a', $model->varcharMultiple));
     $this->assertTrue(in_array('b', $model->varcharMultiple));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test9';
     $model->datetimeSingle = '2011-10-05 18:10:01';
     $model->varcharMultiple = array('e', 'i');
     $this->assertTrue($model->insertWithEavAttributes(array('name', 'varcharMultiple', 'datetimeSingle')));
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test9', $model->name);
     $this->assertNull($model->eav_set_id);
     $query1 = Yii::app()->db->createCommand()->select()->from(EavValue::model('DatetimeDataType')->tableName())->where(array('and', 'entity = :entity', 'entity_id = :eid', 'eav_attribute_id = :aid'), array(':entity' => $model->getEntity(), ':eid' => $model->id, ':aid' => 1))->queryAll();
     $query2 = Yii::app()->db->createCommand()->select()->from(EavValue::model('VarcharDataType')->tableName())->where(array('and', 'entity = :entity', 'entity_id = :eid', 'eav_attribute_id = :aid'), array(':entity' => $model->getEntity(), ':eid' => $model->id, ':aid' => 2))->queryAll();
     $this->assertEquals(0, count($query1));
     $this->assertEquals(0, count($query2));
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->eav_set_id = 1;
     $model->name = 'test10';
     $model->datetimeSingle = '2011-10-05 18:10:01';
     $this->assertTrue($model->insertWithEavAttributes());
     $model = new TestEavActiveRecord();
     $model->eav_set_id = 2;
     $model->name = 'test11';
     $model->datetimeSingle = '2011-10-05 18:10:01';
     $model->varcharMultiple = array('e', 'i');
     $this->assertTrue($model->insertWithEavAttributes(array('name', 'datetimeSingle', 'varcharMultiple')));
     $model = TestEavActiveRecord::model()->withEavAttributes()->findByPk($model->id);
     $this->assertEquals('test11', $model->name);
     $this->assertNull($model->eav_set_id);
     $query1 = Yii::app()->db->createCommand()->select()->from(EavValue::model('DatetimeDataType')->tableName())->where(array('and', 'entity = :entity', 'entity_id = :eid', 'eav_attribute_id = :aid'), array(':entity' => $model->getEntity(), ':eid' => $model->id, ':aid' => 1))->queryAll();
     $query2 = Yii::app()->db->createCommand()->select()->from(EavValue::model('VarcharDataType')->tableName())->where(array('and', 'entity = :entity', 'entity_id = :eid', 'eav_attribute_id = :aid'), array(':entity' => $model->getEntity(), ':eid' => $model->id, ':aid' => 2))->queryAll();
     $this->assertEquals(0, count($query1));
     $this->assertEquals(0, count($query2));
     $model = new TestEavActiveRecord();
     $model->attachEavSet(null);
     $model->name = 'test1-2';
     $model->insertWithEavAttributes(array('name', 'eav_set_id'));
     $model = new TestEavActiveRecord();
     $model->attachEavSet(null);
     $model->name = 'test1-3';
     $model->insertWithEavAttributes();
     $model = new TestEavActiveRecord();
     $model->attachEavSet(3);
     $model->name = 'test1-4';
     $model->insertWithEavAttributes();
 }
Пример #8
0
 public function duplicate($modify = [])
 {
     $clone = clone $this;
     // clean up data for new entry
     $clone->id = null;
     $clone->xls_id = 0;
     $clone->alias .= mt_rand(100, 1000);
     $clone->isNewRecord = true;
     foreach ($modify as $key => $value) {
         $clone->{$key} = $value;
     }
     // Сохраняем
     if ($clone->insert()) {
         $result = true;
         $clone->lotnum = implode('', [$clone->category->id, $clone->primaryKey]);
         $clone->update(['lotnum']);
         $attributes = EavValue::model()->findAllByAttributes(['entity_id' => $this->id, 'entity' => $this->getEntity()]);
         foreach ($attributes as $attribute) {
             $result = $attribute->duplicate(['entity_id' => $clone->id]);
         }
         return $result;
     }
     return false;
 }
Пример #9
0
 /**
  * Prepares an SQL condition.
  * @param mixed $condition It must be a string or an array or an instance of the class CDbCriteria.
  * @return mixed Returns an instance of the class CDbCriteria or a string.
  */
 private function prepareCondition($condition)
 {
     $pattern = '/[:]{2}[a-zA-Z_\\x7f-\\xff]+[a-zA-Z0-9_\\x7f-\\xff]*[:]{2}/';
     $matches = array();
     $replace = array();
     if (is_string($condition)) {
         preg_match_all($pattern, $condition, $matches);
         if (!empty($matches[0])) {
             /** Oriole **/
             $attributes = EavAttribute::model()->findAll();
             if (!empty($attributes)) {
                 foreach ($attributes as $attr) {
                     if (!$this->hasAttribute($attr->name) && !$this->getMetaData()->hasRelation($attr->name)) {
                         $eavAttributeInstances[$attr->name] = $attr;
                     }
                 }
             }
             /** --Oriole **/
             foreach ($matches[0] as $name) {
                 $name = trim($name, '::');
                 $this->findEavAttributes[] = $name;
                 if (key_exists($name, $eavAttributeInstances)) {
                     $attribute = $eavAttributeInstances[$name];
                     $class = EavValue::model($attribute->data_type);
                     $replace[] = $this->quoteColumnName(self::EAV_FIND_RELATION_NAME . ucfirst($name) . '.' . $class->valueField);
                 }
             }
             $this->addFindEavRelation();
             return str_replace($matches[0], $replace, $condition);
         }
         return $condition;
     } else {
         if (is_array($condition)) {
             $criteria = new CDbCriteria($condition);
             $condition = $this->prepareCondition($criteria->condition);
             $criteria->condition = $condition;
             return $criteria;
         } else {
             if ($condition instanceof CDbCriteria) {
                 $condition->condition = $this->prepareCondition($condition->condition);
                 return $condition;
             }
         }
     }
 }
 public function getValuesList($attributeId)
 {
     $attribute = EavAttributeExtended::model()->findByPK($attributeId);
     if (is_null($attribute)) {
         return [];
     }
     $class = EavValue::model($attribute->data_type);
     $valueField = $class->valueField;
     $models = EavValue::model()->findAllByAttributes(['eav_attribute_id' => $attributeId], ['select' => 't.' . $valueField, 'order' => 't.' . $valueField . ' ASC', 'distinct' => true]);
     $values = [];
     foreach ($models as $model) {
         $values[] = $model->{$valueField};
     }
     return $values;
 }