/** * _unserializeRecurser() * * This method will be used to traverse the depths of the structure * as needed to *unserialize* the profile from an xmlIterator * * @param SimpleXMLIterator $xmlIterator * @param \Zend\Tool\Project\Profile\Resource\Resource $resource */ protected function _unserializeRecurser(\SimpleXMLIterator $xmlIterator, Resource $resource = null) { foreach ($xmlIterator as $resourceName => $resourceData) { $contextName = $resourceName; $subResource = new Resource($contextName); $subResource->setProfile($this->_profile); if ($resourceAttributes = $resourceData->attributes()) { $attributes = array(); foreach ($resourceAttributes as $attrName => $attrValue) { $attributes[$attrName] = (string) $attrValue; } $subResource->setAttributes($attributes); } if ($resource) { $resource->append($subResource, false); } else { $this->_profile->append($subResource); } if ($this->_contextRepository->isOverwritableContext($contextName) == false) { $subResource->initializeContext(); } if ($xmlIterator->hasChildren()) { self::_unserializeRecurser($xmlIterator->getChildren(), $subResource); } } }
/** * createResource() * * Method to create a resource with a given context with specific attributes * * @param string $context * @param array $attributes * @return \Zend\Tool\Project\Profile\Resource\Resource */ public function createResource($context, array $attributes = array()) { if (is_string($context)) { $contextRegistry = \Zend\Tool\Project\Context\Repository::getInstance(); if ($contextRegistry->hasContext($context)) { $context = $contextRegistry->getContext($context); } else { throw new Exception\InvalidArgumentException('Context by name ' . $context . ' was not found in the context registry.'); } } elseif (!$context instanceof \Zend\Tool\Project\Context) { throw new Exception\InvalidArgumentException('Context must be of type string or Zend\\Tool\\Project\\Context\\Interface.'); } $newResource = new Resource($context); if ($attributes) { $newResource->setAttributes($attributes); } /** * Interesting logic here: * * First set the parentResource (this will also be done inside append). This will allow * the initialization routine to change the appendability of the parent resource. This * is important to allow specific resources to be appendable by very specific sub-resources. */ $newResource->setParentResource($this); $newResource->initializeContext(); $this->append($newResource); return $newResource; }