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()); }
public static function model($className = __CLASS__) { return parent::model($className); }
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(); } }
/** * 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.'); } } } }
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(); }
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; }
/** * 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; }