예제 #1
0
 public function testArrayOfMultipleComplexObjectsToXml()
 {
     // Create objects
     $object1 = $this->createComplexObject(1);
     $object2 = $this->createComplexObject(2);
     $object3 = $this->createComplexObject(3);
     // Create aray of objects
     $data = array($object1, $object2, $object3);
     // Convert to XML, with root of 'root' and tag wrappers of 'item'
     $actual_xml = TypeConverter::toXml($data);
     // Compose expected XML structure
     $expected_xml = $this->getXmlDeclaration() . '<root>' . '<item><id>1</id><name>Object 1</name><foo><bar>string</bar><baz>' . '<item><id>1.1</id><name>Object 1.1</name></item>' . '<item><id>1.2</id><name>Object 1.2</name></item>' . '<item><id>1.3</id><name>Object 1.3</name></item>' . '</baz></foo></article>' . '<item><id>2</id><name>Object 2</name><foo><bar>string</bar><baz>' . '<item><id>2.1</id><name>Object 2.1</name></item>' . '<item><id>2.2</id><name>Object 2.2</name></item>' . '<item><id>2.3</id><name>Object 2.3</name></item>' . '</baz></foo></article>' . '<item><id>3</id><name>Object 3</name><foo><bar>string</bar><baz>' . '<item><id>3.1</id><name>Object 3.1</name></item>' . '<item><id>3.2</id><name>Object 3.2</name></item>' . '<item><id>3.3</id><name>Object 3.3</name></item>' . '</baz></foo></item>' . '</root>';
     // Now check with single string tag.
     // Convert to XML, with root of 'root' and tag wrappers of 'item'
     $actual_xml = TypeConverter::toXml($data, 'root', 'article');
     // Compose expected XML structure
     $expected_xml = $this->getXmlDeclaration() . '<root>' . '<article><id>1</id><name>Object 1</name><foo><bar>string</bar><baz>' . '<article><id>1.1</id><name>Object 1.1</name></article>' . '<article><id>1.2</id><name>Object 1.2</name></article>' . '<article><id>1.3</id><name>Object 1.3</name></article>' . '</baz></foo></article>' . '<article><id>2</id><name>Object 2</name><foo><bar>string</bar><baz>' . '<article><id>2.1</id><name>Object 2.1</name></article>' . '<article><id>2.2</id><name>Object 2.2</name></article>' . '<article><id>2.3</id><name>Object 2.3</name></article>' . '</baz></foo></article>' . '<article><id>3</id><name>Object 3</name><foo><bar>string</bar><baz>' . '<article><id>3.1</id><name>Object 3.1</name></article>' . '<article><id>3.2</id><name>Object 3.2</name></article>' . '<article><id>3.3</id><name>Object 3.3</name></article>' . '</baz></foo></article>' . '</root>';
     $this->assertXMLStringEqualsXmlString($expected_xml, $actual_xml);
     // Now check with array of tags.
     // Convert to XML, with root of 'root' and tag wrappers of 'item'
     $actual_xml = TypeConverter::toXml($data, 'root', array('outer', 'inner'));
     // Compose expected XML structure
     $expected_xml = $this->getXmlDeclaration() . '<root>' . '<outer><id>1</id><name>Object 1</name><foo><bar>string</bar><baz>' . '<inner><id>1.1</id><name>Object 1.1</name></inner>' . '<inner><id>1.2</id><name>Object 1.2</name></inner>' . '<inner><id>1.3</id><name>Object 1.3</name></inner>' . '</baz></foo></outer>' . '<outer><id>2</id><name>Object 2</name><foo><bar>string</bar><baz>' . '<inner><id>2.1</id><name>Object 2.1</name></inner>' . '<inner><id>2.2</id><name>Object 2.2</name></inner>' . '<inner><id>2.3</id><name>Object 2.3</name></inner>' . '</baz></foo></outer>' . '<outer><id>3</id><name>Object 3</name><foo><bar>string</bar><baz>' . '<inner><id>3.1</id><name>Object 3.1</name></inner>' . '<inner><id>3.2</id><name>Object 3.2</name></inner>' . '<inner><id>3.3</id><name>Object 3.3</name></inner>' . '</baz></foo></outer>' . '</root>';
     $this->assertXMLStringEqualsXmlString($expected_xml, $actual_xml);
 }
예제 #2
0
 /**
  * Format the response into the right content type.
  *
  * @access private
  * @param string $type
  * @return mixed
  */
 private function __format($type)
 {
     $response = array('success' => $this->_success, 'data' => $this->_data);
     if (!empty($this->_code)) {
         $response['code'] = $this->_code;
     }
     switch (strtolower($type)) {
         case 'json':
             $format = TypeConverter::toJson($response);
             break;
         case 'xml':
             $format = TypeConverter::toXml($response);
             break;
         case 'html':
         case 'text':
         default:
             $format = (string) $this->_data;
             break;
     }
     return $format;
 }
예제 #3
0
 /**
  * Processes the feed and rebuilds an array based on the feeds type (RSS, RDF, Atom).
  *
  * @access protected
  * @param CakeResponse $response
  * @param array $query
  * @param string $source
  * @return boolean
  */
 protected function _process($response, $query, $source)
 {
     $feed = TypeConverter::toArray($response->body());
     $clean = array();
     if (!empty($query['root']) && !empty($feed[$query['feed']['root']])) {
         $items = $feed[$query['feed']['root']];
     } else {
         // Rss
         if (isset($feed['channel']) && isset($feed['channel']['item'])) {
             $items = $feed['channel']['item'];
             // Rdf
         } else {
             if (isset($feed['item'])) {
                 $items = $feed['item'];
                 // Atom
             } else {
                 if (isset($feed['entry'])) {
                     $items = $feed['entry'];
                     // Xml
                 } else {
                     $items = $feed;
                 }
             }
         }
     }
     if (empty($items) || !is_array($items)) {
         return $clean;
     }
     // Gather elements
     $elements = array('title', 'guid' => array('guid', 'id'), 'date' => array('date', 'pubDate', 'published', 'updated'), 'link' => array('link', 'origLink'), 'image' => array('image', 'thumbnail'), 'author' => array('author', 'writer', 'editor', 'user'), 'source' => array('source'), 'description' => array('description', 'desc', 'summary', 'content', 'text'));
     if (is_array($query['fields'])) {
         $elements = array_merge_recursive($elements, $query['fields']);
     }
     // Loop the feed
     foreach ($items as $item) {
         $data = array();
         foreach ($elements as $element => $keys) {
             if (is_numeric($element)) {
                 $element = $keys;
                 $keys = array($keys);
             }
             if (isset($keys['attributes'])) {
                 $attributes = $keys['attributes'];
                 unset($keys['attributes']);
             } else {
                 $attributes = array('value', 'href', 'src', 'name', 'label');
             }
             if (isset($keys['keys'])) {
                 $keys = $keys['keys'];
             }
             foreach ($keys as $key) {
                 if (isset($item[$key]) && empty($data[$element])) {
                     $value = $this->_extract($item[$key], $attributes);
                     if (!empty($value)) {
                         $data[$element] = $value;
                         break;
                     }
                 }
             }
         }
         if (empty($data['link'])) {
             trigger_error(sprintf('Feed %s does not have a valid link element.', $source), E_USER_NOTICE);
             continue;
         }
         if (empty($data['source']) && $source) {
             $data['source'] = (string) $source;
         }
         $sort = null;
         if (isset($data[$query['feed']['sort']])) {
             $sort = $data[$query['feed']['sort']];
         }
         if (!$sort) {
             if ($query['feed']['sort'] == 'date' && isset($data['date'])) {
                 $sort = strtotime($data['date']);
             } else {
                 $sort = microtime();
             }
         }
         if (!empty($data)) {
             $clean[$sort] = $data;
         }
     }
     return $clean;
 }