/** * Returns a new instance of the $name module with data container level $level. * * @param string $name The name of the module to create * @param string $level The level of the data container ('feed' or 'item') * @return ezcFeedModule */ public static function create($name, $level = 'feed') { $supportedModules = ezcFeed::getSupportedModules(); if (!isset($supportedModules[$name])) { throw new ezcFeedUnsupportedModuleException($name); } return new $supportedModules[$name]($level); }
protected function createFeed($type, $data) { $feed = new ezcFeed($type); $supportedModules = ezcFeed::getSupportedModules(); if (is_array($data)) { foreach ($data as $property => $value) { if (is_array($value)) { foreach ($value as $val) { if (isset($supportedModules[$property])) { $element = $feed->addModule($property); } else { $element = $feed->add($property); } if (is_array($val)) { foreach ($val as $subKey => $subValue) { if ($subKey === '#') { $element->set($subValue); } else { if ($subKey === 'MULTI') { $values = array(); foreach ($subValue as $multi) { foreach ($multi as $subSubKey => $subSubValue) { if (isset($supportedModules[$subSubKey])) { $subElement = $element->addModule($subSubKey); } else { if ($property === 'skipDays') { $values[] = $subSubValue; $element->days = $values; } else { if ($property === 'skipHours') { $values[] = $subSubValue; $element->hours = $values; } else { $subElement = $element->add($subSubKey); } } } if ($property !== 'skipDays' && $property !== 'skipHours') { $subElement->set($subSubValue); } } } } else { if (is_array($subValue)) { if (count($subValue) === 0 || !isset($subValue[0])) { if (isset($supportedModules[$subKey])) { $subElement = $element->addModule($subKey); } else { $subElement = $element->add($subKey); } } foreach ($subValue as $subSubKey => $subSubValue) { if ($subSubKey === '#') { $subElement->set($subSubValue); } else { if (is_array($subSubValue)) { if (isset($supportedModules[$subKey])) { $subElement = $element->addModule($subKey); } else { $subElement = $element->add($subKey); } foreach ($subSubValue as $subSubSubKey => $subSubSubValue) { if ($subSubSubKey === '#') { $subElement->set($subSubSubValue); } else { if (is_array($subSubSubValue)) { foreach ($subSubSubValue as $subSubSubSubKey => $subSubSubSubValue) { $subSubElement = $subElement->add($subSubSubKey); foreach ($subSubSubSubValue as $subSubSubSubSubKey => $subSubSubSubSubValue) { if ($subSubSubSubSubKey === '#') { $subSubElement->set($subSubSubSubSubValue); } else { $subSubElement->{$subSubSubSubSubKey} = $subSubSubSubSubValue; } } } } else { $subElement->{$subSubSubKey} = $subSubSubValue; } } } } else { $subElement->{$subSubKey} = $subSubValue; } } } } else { $element->{$subKey} = $subValue; } } } } } else { $element->set($val); } } } else { $feed->{$property} = $value; } } } return $feed; }
public function testRegisterNewModuleType() { ezcFeed::registerModule('Slash', 'mySlashHandler', 'slash'); $types = ezcFeed::getSupportedModules(); $expected = array('Content' => 'ezcFeedContentModule', 'CreativeCommons' => 'ezcFeedCreativeCommonsModule', 'DublinCore' => 'ezcFeedDublinCoreModule', 'Geo' => 'ezcFeedGeoModule', 'iTunes' => 'ezcFeedITunesModule', 'Slash' => 'mySlashHandler'); $this->assertEquals($expected, $types); $types = ezcFeed::getSupportedModulesPrefixes(); $expected = array('content' => 'Content', 'creativeCommons' => 'CreativeCommons', 'dc' => 'DublinCore', 'geo' => 'Geo', 'itunes' => 'iTunes', 'slash' => 'Slash'); $this->assertEquals($expected, $types); ezcFeed::unregisterModule('Slash'); }
/** * Returns if the property $name is set. * * @param string $name The property name * @return bool * @ignore */ public function __isset($name) { switch ($name) { case 'author': case 'category': case 'comments': case 'content': case 'contributor': case 'copyright': case 'description': case 'enclosure': case 'id': case 'link': case 'published': case 'title': case 'updated': case 'source': case 'language': return isset($this->properties[$name]); default: $supportedModules = ezcFeed::getSupportedModules(); if (isset($supportedModules[$name])) { return isset($this->modules[$name]); } } }
/** * Returns if the property $name is set. * * @param string $name The property name * @return bool * @ignore */ public function __isset($name) { switch ($name) { case 'author': case 'category': case 'cloud': case 'contributor': case 'copyright': case 'description': case 'docs': case 'generator': case 'icon': case 'id': case 'image': case 'item': case 'language': case 'link': case 'published': case 'rating': case 'skipDays': case 'skipHours': case 'textInput': case 'title': case 'ttl': case 'updated': case 'webMaster': return isset($this->elements[$name]); default: $supportedModules = ezcFeed::getSupportedModules(); if (isset($supportedModules[$name])) { return $this->hasModule($name); } } return false; }
/** * Fetches the supported prefixes and namespaces from the XML document $xml. * * @param DOMDocument $xml The XML document object to parse * @return array(string=>string) * @ignore */ protected function fetchUsedPrefixes(DOMDocument $xml) { $usedPrefixes = array(); $xp = new DOMXpath($xml); $set = $xp->query('./namespace::*', $xml->documentElement); $usedNamespaces = array(); foreach ($set as $node) { foreach (ezcFeed::getSupportedModules() as $moduleName => $moduleClass) { $moduleNamespace = call_user_func(array($moduleClass, 'getNamespace')); // compare the namespace URIs from the XML source with the supported ones if ($moduleNamespace === $node->nodeValue) { // the nodeName looks like: xmlns:some_module list($xmlns, $prefix) = explode(':', $node->nodeName); // use the prefix from the XML source as a key in the array $usedPrefixes // eg. array( 'some_prefix' => 'DublinCore' ); // then, when calling later parseModules(), if encountering an element // like <some_prefix:creator>, it is checked if 'DublinCore' is supported $usedPrefixes[$prefix] = $moduleName; } } } return $usedPrefixes; }
/** * Fetches the supported prefixes and namespaces from the XML document $xml. * * @param DOMDocument $xml The XML document object to parse * @return array(string=>string) * @ignore */ protected function fetchUsedPrefixes(DOMDocument $xml) { $usedPrefixes = array(); $xp = new DOMXpath($xml); $set = $xp->query('./namespace::*', $xml->documentElement); $usedNamespaces = array(); foreach ($set as $node) { foreach (ezcFeed::getSupportedModules() as $moduleName => $moduleClass) { $moduleNamespace = call_user_func(array($moduleClass, 'getNamespace')); // compare the namespace URIs from the XML source with the supported ones if ($moduleNamespace === $node->nodeValue) { // the nodeName looks like: xmlns:some_module list($xmlns, $prefix) = explode(':', $node->nodeName); // use the prefix from the XML source as a key in the array $usedPrefixes // eg. array( 'some_prefix' => 'DublinCore' ); // then, when calling later parseModules(), if encountering an element // like <some_prefix:creator>, it is checked if 'DublinCore' is supported $usedPrefixes[$prefix] = $moduleName; } } // If the feed contains the ATOM namespace (xmlns:atom="http://www.w3.org/2005/Atom") // and the feed itself is not of type ATOM, then add the 'atom' prefix (or any alias) // to the $usedPrefixes array which is returned by the function if (ezcFeedAtom::NAMESPACE_URI === $node->nodeValue && $xml->documentElement->tagName !== 'feed') { // the nodeName looks like: xmlns:some_module list($xmlns, $prefix) = explode(':', $node->nodeName); $usedPrefixes[$prefix] = 'Atom'; } } return $usedPrefixes; }