` tags * * @param array $attrib `` tag attributes * @return string An RSS document * @access public */ function document($attrib = array(), $content = null) { if ($content === null) { $content = $attrib; $attrib = array(); } if (!isset($attrib['version']) || empty($attrib['version'])) { $attrib['version'] = $this->version; } return $this->elem('rss', $attrib, $content); } /** * Returns an RSS `` element * * @param array $attrib `` tag attributes * @param mixed $elements Named array elements which are converted to tags * @param mixed $content Content (``'s belonging to this channel * @return string An RSS `` * @access public */ function channel($attrib = array(), $elements = array(), $content = null) { $view =& ClassRegistry::getObject('view'); if (!isset($elements['title']) && !empty($view->pageTitle)) { $elements['title'] = $view->pageTitle; } if (!isset($elements['link'])) { $elements['link'] = '/'; } if (!isset($elements['description'])) { $elements['description'] = ''; } $elements['link'] = $this->url($elements['link'], true); $elems = ''; foreach ($elements as $elem => $data) { $attributes = array(); if (is_array($data)) { if (strtolower($elem) == 'cloud') { $attributes = $data; $data = array(); } elseif (isset($data['attrib']) && is_array($data['attrib'])) { $attributes = $data['attrib']; unset($data['attrib']); } else { $innerElements = ''; foreach ($data as $subElement => $value) { $innerElements .= $this->elem($subElement, array(), $value); } $data = $innerElements; } } $elems .= $this->elem($elem, $attributes, $data); } return $this->elem('channel', $attrib, $elems . $content, !($content === null)); } /** * Transforms an array of data using an optional callback, and maps it to a set * of `` tags * * @param array $items The list of items to be mapped * @param mixed $callback A string function name, or array containing an object * and a string method name * @return string A set of RSS `` elements * @access public */ function items($items, $callback = null) { if ($callback != null) { $items = array_map($callback, $items); } $out = ''; $c = count($items); for ($i = 0; $i < $c; $i++) { $out .= $this->item(array(), $items[$i]); } return $out; } /** * Converts an array into an `` element and its contents * * @param array $attrib The attributes of the `` element * @param array $elements The list of elements contained in this `` * @return string An RSS `` element * @access public */ function item($att = array(), $elements = array()) { $content = null; if (isset($elements['link']) && !isset($elements['guid'])) { $elements['guid'] = $elements['link']; } foreach ($elements as $key => $val) { $attrib = array(); $escape = true; if (is_array($val) && isset($val['convertEntities'])) { $escape = $val['convertEntities']; unset($val['convertEntities']); } switch ($key) { case 'pubDate' : $val = $this->time($val); break; case 'category' : if (is_array($val) && !empty($val[0])) { foreach ($val as $category) { $attrib = array(); if (isset($category['domain'])) { $attrib['domain'] = $category['domain']; unset($category['domain']); } $categories[] = $this->elem($key, $attrib, $category); } $elements[$key] = implode('', $categories); continue 2; } else if (is_array($val) && isset($val['domain'])) { $attrib['domain'] = $val['domain']; } break; case 'link': case 'guid': case 'comments': if (is_array($val) && isset($val['url'])) { $attrib = $val; unset($attrib['url']); $val = $val['url']; } $val = $this->url($val, true); break; case 'source': if (is_array($val) && isset($val['url'])) { $attrib['url'] = $this->url($val['url'], true); $val = $val['title']; } elseif (is_array($val)) { $attrib['url'] = $this->url($val[0], true); $val = $val[1]; } break; case 'enclosure': if (is_string($val['url']) && is_file(WWW_ROOT . $val['url']) && file_exists(WWW_ROOT . $val['url'])) { if (!isset($val['length']) && strpos($val['url'], '://') === false) { $val['length'] = sprintf("%u", filesize(WWW_ROOT . $val['url'])); } if (!isset($val['type']) && function_exists('mime_content_type')) { $val['type'] = mime_content_type(WWW_ROOT . $val['url']); } } $val['url'] = $this->url($val['url'], true); $attrib = $val; $val = null; break; } if (!is_null($val) && $escape) { $val = h($val); } $elements[$key] = $this->elem($key, $attrib, $val); } if (!empty($elements)) { $content = implode('', $elements); } return $this->elem('item', $att, $content, !($content === null)); } /** * Converts a time in any format to an RSS time * * @param mixed $time * @return string An RSS-formatted timestamp * @see TimeHelper::toRSS */ function time($time) { return $this->Time->toRSS($time); } }