public function testGetUsedAttributeNames() { $mappingData = array(array('attributeName' => 'a'), array('attributeName' => 'b'), array('attributeName' => 'c')); $metadata = new DropDownDependencyDerivedAttributeMetadata(); $metadata->setScenario('nonAutoBuild'); $metadata->name = 'someName3'; $metadata->modelClassName = 'Whatever2'; $metadata->serializedMetadata = serialize(array('stuff', 1, 'attributeLabels' => array(), 'mappingData' => $mappingData)); $this->assertTrue($metadata->save()); $usedModelAttributeNames = $metadata->getUsedAttributeNames(); $this->assertEquals(array('a', 'b', 'c'), $usedModelAttributeNames); }
public function testGetCustomFieldAttributesNotUsedInOtherDependencyAttributes() { $adapter = new DropDownDependencyToMappingLayoutAdapter('TestDropDownDependencyModel', null, 4); $attributeNames = $adapter->getCustomFieldAttributesNotUsedInOtherDependencyAttributes(); $availableAttributes = array('something1' => 'Something 1', 'something2' => 'Something 2', 'something3' => 'Something 3', 'something4' => 'Something 4'); $this->assertEquals($availableAttributes, $attributeNames); //Now save a drop down dependency. This means it will use up one of the attribute names. $metadata = new DropDownDependencyDerivedAttributeMetadata(); $metadata->setScenario('nonAutoBuild'); $metadata->name = 'someName'; $metadata->modelClassName = 'TestDropDownDependencyModel'; $mappingData = array(array('attributeName' => 'something1')); $metadata->serializedMetadata = serialize(array('stuff', 1, 'attributeLabels' => array(), 'mappingData' => $mappingData)); $this->assertTrue($metadata->save()); //Now requery and see that something1 is not available. $adapter = new DropDownDependencyToMappingLayoutAdapter('TestDropDownDependencyModel', null, 4); $attributeNames = $adapter->getCustomFieldAttributesNotUsedInOtherDependencyAttributes(); $availableAttributes = array('something2' => 'Something 2', 'something3' => 'Something 3', 'something4' => 'Something 4'); $this->assertEquals($availableAttributes, $attributeNames); }
public function testUpdateValueInMappingByOldAndNewValue() { //First create a dependency $mappingData = array(array('attributeName' => 'a'), array('attributeName' => 'b', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2', 'b3' => 'a3', 'b4' => 'a4')), array('attributeName' => 'c', 'valuesToParentValues' => array('c1' => 'b1', 'c2' => 'b2', 'c3' => 'b3', 'c4' => 'b4'))); $metadata = new DropDownDependencyDerivedAttributeMetadata(); $metadata->setScenario('nonAutoBuild'); $metadata->name = 'aName'; $metadata->modelClassName = 'aModelClassName'; $metadata->serializedMetadata = serialize(array('attributeLabels' => array('a' => 'b'), 'mappingData' => $mappingData)); $this->assertTrue($metadata->save()); //Change b3 to b3New $oldAndNewValuePairs = array('b3' => 'b3New'); DropDownDependencyDerivedAttributeDesignerUtil::updateValueInMappingByOldAndNewValue('aModelClassName', 'b', $oldAndNewValuePairs); //Confirm b3 values changed correctly to b3New $metadata = DropDownDependencyDerivedAttributeMetadata::getById($metadata->id); $unserializedData = unserialize($metadata->serializedMetadata); $compareData = array(array('attributeName' => 'a'), array('attributeName' => 'b', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2', 'b3New' => 'a3', 'b4' => 'a4')), array('attributeName' => 'c', 'valuesToParentValues' => array('c1' => 'b1', 'c2' => 'b2', 'c3' => 'b3New', 'c4' => 'b4'))); $this->assertEquals(array('a' => 'b'), $unserializedData['attributeLabels']); $this->assertEquals($compareData, $unserializedData['mappingData']); //Now change a value for a dropdown that is the first level of the dependency. This will only change the //value when it is a parent value. $oldAndNewValuePairs = array('a2' => 'a2New'); DropDownDependencyDerivedAttributeDesignerUtil::updateValueInMappingByOldAndNewValue('aModelClassName', 'a', $oldAndNewValuePairs); //Confirm a2 values changed correctly to a2New $metadata = DropDownDependencyDerivedAttributeMetadata::getById($metadata->id); $unserializedData = unserialize($metadata->serializedMetadata); $compareData = array(array('attributeName' => 'a'), array('attributeName' => 'b', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2New', 'b3New' => 'a3', 'b4' => 'a4')), array('attributeName' => 'c', 'valuesToParentValues' => array('c1' => 'b1', 'c2' => 'b2', 'c3' => 'b3New', 'c4' => 'b4'))); $this->assertEquals(array('a' => 'b'), $unserializedData['attributeLabels']); $this->assertEquals($compareData, $unserializedData['mappingData']); //Now change 2 values at once. $oldAndNewValuePairs = array('c1' => 'c1New', 'c2' => 'c2New'); DropDownDependencyDerivedAttributeDesignerUtil::updateValueInMappingByOldAndNewValue('aModelClassName', 'c', $oldAndNewValuePairs); //Confirm c1, c2 both changed. $metadata = DropDownDependencyDerivedAttributeMetadata::getById($metadata->id); $unserializedData = unserialize($metadata->serializedMetadata); $compareData = array(array('attributeName' => 'a'), array('attributeName' => 'b', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2New', 'b3New' => 'a3', 'b4' => 'a4')), array('attributeName' => 'c', 'valuesToParentValues' => array('c1New' => 'b1', 'c2New' => 'b2', 'c3' => 'b3New', 'c4' => 'b4'))); $this->assertEquals(array('a' => 'b'), $unserializedData['attributeLabels']); $this->assertEquals($compareData, $unserializedData['mappingData']); }
public function setAttributeMetadataFromForm(AttributeForm $attributeForm) { assert('$attributeForm instanceof DropDownDependencyAttributeForm'); $modelClassName = get_class($this->model); $attributeName = $attributeForm->attributeName; $attributeLabels = $attributeForm->attributeLabels; $elementType = $attributeForm->getAttributeTypeName(); $mappingData = $attributeForm->mappingData; $id = $attributeForm->id; if ($id != null) { $metadata = DropDownDependencyDerivedAttributeMetadata::getById($id); $metadata->setScenario('nonAutoBuild'); } else { $metadata = new DropDownDependencyDerivedAttributeMetadata(); $metadata->setScenario('nonAutoBuild'); } $metadata->name = $attributeName; $metadata->modelClassName = $modelClassName; $metadata->serializedMetadata = serialize(array('mappingData' => $mappingData, 'attributeLabels' => $attributeLabels)); $saved = $metadata->save(); if (!$saved) { throw new NotSupportedException(); } }
/** * @depends testSetMetadataFromLayoutWithAndWithOutRequiredDerivedField */ public function testSetMetadataFromLayoutWithAndWithOutOnlyUniqueFields() { Yii::app()->user->userModel = User::getByUsername('super'); //First create a dependency $mappingData = array(array('attributeName' => 'type'), array('attributeName' => 'officePhone', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2', 'b3' => 'a3', 'b4' => 'a4'))); $metadata = new DropDownDependencyDerivedAttributeMetadata(); $metadata->setScenario('nonAutoBuild'); $metadata->name = 'aName'; $metadata->modelClassName = 'Account'; $metadata->serializedMetadata = serialize(array('attributeLabels' => array('a' => 'b'), 'mappingData' => $mappingData)); $this->assertTrue($metadata->save()); $layout = array('panels' => array(array('rows' => array(array('cells' => array(array('element' => 'aName'))), array('cells' => array(array('element' => 'type'))), array('cells' => array(array('element' => 'officeFax'))), array('cells' => array(array('element' => 'employees'))))))); $model = new Account(); $editableMetadata = AccountEditAndDetailsView::getMetadata(); $modelAttributesAdapter = new ModelAttributesAdapter($model); $attributesLayoutAdapter = AttributesLayoutAdapterUtil::makeAttributesLayoutAdapter($modelAttributesAdapter->getAttributes(), new EditAndDetailsViewDesignerRules(), $editableMetadata); $adapter = new LayoutMetadataAdapter('AccountEditAndDetailsView', 'AccountsModule', $editableMetadata, new EditAndDetailsViewDesignerRules(), $attributesLayoutAdapter->getPlaceableLayoutAttributes(), $attributesLayoutAdapter->getRequiredDerivedLayoutAttributeTypes()); $x = $adapter->setMetadataFromLayout($layout, array()); $this->assertFalse($adapter->setMetadataFromLayout($layout, array())); $this->assertEquals($adapter->getMessage(), 'All required fields must be placed in this layout.'); }
public function testUsingTheAdapterAsAWrapperToUpdateValueInMappingByOldAndNewValue() { $account = new Account(); //First create a dependency $mappingData = array(array('attributeName' => 'aaaCstm'), array('attributeName' => 'bbbCstm', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2', 'b3' => 'a3', 'b4' => 'a4')), array('attributeName' => 'cccCstm', 'valuesToParentValues' => array('c1' => 'b1', 'c2' => 'b2', 'c3' => 'b3', 'c4' => 'b4'))); $metadata = new DropDownDependencyDerivedAttributeMetadata(); $metadata->setScenario('nonAutoBuild'); $metadata->name = 'aName'; $metadata->modelClassName = 'Account'; $metadata->serializedMetadata = serialize(array('attributeLabels' => array('a' => 'b'), 'mappingData' => $mappingData)); $this->assertTrue($metadata->save()); //Change b3 to b3New $attributeForm = AttributesFormFactory::createAttributeFormByAttributeName($account, 'bbbCstm'); $attributeForm->customFieldDataDataExistingValues = array('b1', 'b2', 'b3', 'b4'); $attributeForm->customFieldDataData = array('b1', 'b2', 'b3New', 'b4'); $modelAttributesAdapterClassName = $attributeForm::getModelAttributeAdapterNameForSavingAttributeFormData(); $adapter = new $modelAttributesAdapterClassName($account); try { $adapter->setAttributeMetadataFromForm($attributeForm); } catch (FailedDatabaseSchemaChangeException $e) { echo $e->getMessage(); $this->fail(); } //Confirm b3 values changed correctly to b3New $metadata = DropDownDependencyDerivedAttributeMetadata::getById($metadata->id); $unserializedData = unserialize($metadata->serializedMetadata); $compareData = array(array('attributeName' => 'aaaCstm'), array('attributeName' => 'bbbCstm', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2', 'b3New' => 'a3', 'b4' => 'a4')), array('attributeName' => 'cccCstm', 'valuesToParentValues' => array('c1' => 'b1', 'c2' => 'b2', 'c3' => 'b3New', 'c4' => 'b4'))); $this->assertEquals(array('a' => 'b'), $unserializedData['attributeLabels']); $this->assertEquals($compareData, $unserializedData['mappingData']); //Now change a value for a dropdown that is the first level of the dependency. This will only change the //value when it is a parent value. $attributeForm = AttributesFormFactory::createAttributeFormByAttributeName($account, 'aaaCstm'); $attributeForm->customFieldDataDataExistingValues = array('a1', 'a2', 'a3', 'a4'); $attributeForm->customFieldDataData = array('a1', 'a2New', 'a3', 'a4'); $modelAttributesAdapterClassName = $attributeForm::getModelAttributeAdapterNameForSavingAttributeFormData(); $adapter = new $modelAttributesAdapterClassName($account); try { $adapter->setAttributeMetadataFromForm($attributeForm); } catch (FailedDatabaseSchemaChangeException $e) { echo $e->getMessage(); $this->fail(); } //Confirm a2 values changed correctly to a2New $metadata = DropDownDependencyDerivedAttributeMetadata::getById($metadata->id); $unserializedData = unserialize($metadata->serializedMetadata); $compareData = array(array('attributeName' => 'aaaCstm'), array('attributeName' => 'bbbCstm', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2New', 'b3New' => 'a3', 'b4' => 'a4')), array('attributeName' => 'cccCstm', 'valuesToParentValues' => array('c1' => 'b1', 'c2' => 'b2', 'c3' => 'b3New', 'c4' => 'b4'))); $this->assertEquals(array('a' => 'b'), $unserializedData['attributeLabels']); $this->assertEquals($compareData, $unserializedData['mappingData']); //Now change 2 values at once. $attributeForm = AttributesFormFactory::createAttributeFormByAttributeName($account, 'cccCstm'); $attributeForm->customFieldDataDataExistingValues = array('c1', 'c2', 'c3', 'c4'); $attributeForm->customFieldDataData = array('c1New', 'c2New', 'c3', 'c4'); $modelAttributesAdapterClassName = $attributeForm::getModelAttributeAdapterNameForSavingAttributeFormData(); $adapter = new $modelAttributesAdapterClassName($account); try { $adapter->setAttributeMetadataFromForm($attributeForm); } catch (FailedDatabaseSchemaChangeException $e) { echo $e->getMessage(); $this->fail(); } //Confirm c1, c2 both changed. $metadata = DropDownDependencyDerivedAttributeMetadata::getById($metadata->id); $unserializedData = unserialize($metadata->serializedMetadata); $compareData = array(array('attributeName' => 'aaaCstm'), array('attributeName' => 'bbbCstm', 'valuesToParentValues' => array('b1' => 'a1', 'b2' => 'a2New', 'b3New' => 'a3', 'b4' => 'a4')), array('attributeName' => 'cccCstm', 'valuesToParentValues' => array('c1New' => 'b1', 'c2New' => 'b2', 'c3' => 'b3New', 'c4' => 'b4'))); $this->assertEquals(array('a' => 'b'), $unserializedData['attributeLabels']); $this->assertEquals($compareData, $unserializedData['mappingData']); }