/** * Generates variations based on selected attributes. * * @param ProductAttributeType $attributetype * @param array $values */ public function generateVariationsFromAttributes(ProductAttributeType $attributetype, array $values) { //TODO: introduce transactions here, in case objects get half made etc //if product has variation attribute types if (is_array($values)) { //TODO: get values dataobject set $avalues = $attributetype->convertArrayToValues($values); $existingvariations = $this->owner->Variations(); if ($existingvariations->exists()) { //delete old variation, and create new ones - to prevent modification of exising variations foreach ($existingvariations as $oldvariation) { $oldvalues = $oldvariation->AttributeValues(); foreach ($avalues as $value) { $newvariation = $oldvariation->duplicate(); $newvariation->InternalItemID = $this->owner->InternalItemID . '-' . $newvariation->ID; $newvariation->AttributeValues()->addMany($oldvalues); $newvariation->AttributeValues()->add($value); $newvariation->write(); $existingvariations->add($newvariation); } $existingvariations->remove($oldvariation); $oldvariation->AttributeValues()->removeAll(); $oldvariation->delete(); $oldvariation->destroy(); //TODO: check that old variations actually stick around, as they will be needed for past orders etc } } else { foreach ($avalues as $value) { $variation = new ProductVariation(); $variation->ProductID = $this->owner->ID; $variation->Price = $this->owner->BasePrice; $variation->write(); $variation->InternalItemID = $this->owner->InternalItemID . '-' . $variation->ID; $variation->AttributeValues()->add($value); //TODO: find or create actual value $variation->write(); $existingvariations->add($variation); } } } }