示例#1
0
 /**
  * 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);
 }
示例#2
0
 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;
 }
示例#3
0
 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');
 }
示例#4
0
 /**
  * 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]);
             }
     }
 }
示例#5
0
 /**
  * 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;
 }
示例#6
0
 /**
  * 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;
 }
示例#7
0
 /**
  * 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;
 }