}
/**
+ * Returns the stories of a channel rendered with the specified template.
+ *
+ * @param integer $channel_id The news channel to get stories from.
+ * @param string $tpl The name of the template to use.
+ * @param integer $max The maximum number of stories to get. If
+ * null, all stories will be returned.
+ * @param integer $from The number of the story to start with.
+ * @param integer $order How to sort the results for internal channels
+ * Possible values are the Jonah::ORDER_*
+ * constants.
+ *
+ * @return string The rendered story listing.
+ */
+ function renderChannel($channel_id, $tpl, $max = 10, $from = 0, $order = Jonah::ORDER_PUBLISHED)
+ {
+ $channel = $this->getChannel($channel_id);
+ if (is_a($channel, 'PEAR_Error')) {
+ return sprintf(_("Error fetching feed: %s"), $channel->getMessage());
+ }
+
+ include JONAH_BASE . '/config/templates.php';
+ $escape = !isset($templates[$tpl]['escape']) ||
+ !empty($templates[$tpl]['escape']);
+ $template = new Horde_Template();
+
+ if ($escape) {
+ $channel['channel_name'] = htmlspecialchars($channel['channel_name']);
+ $channel['channel_desc'] = htmlspecialchars($channel['channel_desc']);
+ }
+ $template->set('channel', $channel, true);
+
+ /* Get one story more than requested to see if there are more
+ * stories. */
+ if ($max !== null) {
+ $stories = $this->getStories($channel_id, $max + 1, $from, false, time(), false, $order);
+ if (is_a($stories, 'PEAR_Error')) {
+ return $stories->getMessage();
+ }
+ } else {
+ $stories = $this->getStories($channel_id, null, 0, false, time(), false, $order);
+ if (is_a($stories, 'PEAR_Error')) {
+ return $stories->getMessage();
+ }
+ $max = count($stories);
+ }
+
+ if (!$stories) {
+ $template->set('error', _("No stories are currently available."), true);
+ $template->set('stories', false, true);
+ $template->set('image', false, true);
+ $template->set('form', false, true);
+ } else {
+ /* Escape. */
+ if ($escape) {
+ array_walk($stories, array($this, '_escapeStories'));
+ }
+
+ /* Process story summaries. */
+ array_walk($stories, array($this, '_escapeStoryDescriptions'));
+
+ $template->set('error', false, true);
+ $template->set('story_marker', Horde::img('story_marker.png'));
+ $template->set('image', false, true);
+ $template->set('form', false, true);
+ if ($from) {
+ $template->set('previous', max(0, $from - $max), true);
+ } else {
+ $template->set('previous', false, true);
+ }
+ if ($from && !empty($channel['channel_page_link'])) {
+ $template->set('previous_link',
+ str_replace(
+ array('%25c', '%25n', '%c', '%n'),
+ array('%c', '%n', $channel['channel_id'], max(0, $from - $max)),
+ $channel['channel_page_link']),
+ true);
+ } else {
+ $template->set('previous_link', false, true);
+ }
+ $more = count($stories) > $max;
+ if ($more) {
+ $template->set('next', $from + $max, true);
+ array_pop($stories);
+ } else {
+ $template->set('next', false, true);
+ }
+ if ($more && !empty($channel['channel_page_link'])) {
+ $template->set('next_link',
+ str_replace(
+ array('%25c', '%25n', '%c', '%n'),
+ array('%c', '%n', $channel['channel_id'], $from + $max),
+ $channel['channel_page_link']),
+ true);
+ } else {
+ $template->set('next_link', false, true);
+ }
+
+ $template->set('stories', $stories, true);
+ }
+
+ return $template->parse($templates[$tpl]['template']);
+ }
+
+ /**
+ */
+ function _escapeStories(&$value, $key)
+ {
+ $value['story_title'] = htmlspecialchars($value['story_title']);
+ $value['story_desc'] = htmlspecialchars($value['story_desc']);
+ if (isset($value['story_link'])) {
+ $value['story_link'] = htmlspecialchars($value['story_link']);
+ }
+ if (empty($value['story_body_type']) || $value['story_body_type'] != 'richtext') {
+ $value['story_body'] = htmlspecialchars($value['story_body']);
+ }
+ }
+
+ /**
*/
function _escapeStoryDescriptions(&$value, $key)
{