/** * Alternative rendering of front page news, called from layout/faux_site_index.php which * replaces the standard news output with this. * * @return string */ public function site_frontpage_news() { global $CFG, $SITE; require_once $CFG->dirroot . '/mod/forum/lib.php'; if (!($forum = forum_get_course_forum($SITE->id, 'news'))) { print_error('cannotfindorcreateforum', 'forum'); } $cm = get_coursemodule_from_instance('forum', $forum->id, $SITE->id, false, MUST_EXIST); $context = \context_module::instance($cm->id, MUST_EXIST); $output = html_writer::start_tag('div', array('id' => 'site-news-forum', 'class' => 'clearfix')); $output .= $this->heading(format_string($forum->name, true, array('context' => $context))); $groupmode = groups_get_activity_groupmode($cm, $SITE); $currentgroup = groups_get_activity_group($cm); if (!($discussions = forum_get_discussions($cm, 'p.modified DESC', true, null, $SITE->newsitems, false, -1, $SITE->newsitems))) { $output .= html_writer::tag('div', '(' . get_string('nonews', 'forum') . ')', array('class' => 'forumnodiscuss')); if (forum_user_can_post_discussion($forum, $currentgroup, $groupmode, $cm, $context)) { $output .= html_writer::link(new moodle_url('/mod/forum/post.php', array('forum' => $forum->id)), get_string('addanewtopic', 'forum'), array('class' => 'btn btn-primary')); } else { // No news and user cannot edit, so return nothing. return ''; } return $output . '</div>'; } $output .= html_writer::start_div('', array('id' => 'news-articles')); foreach ($discussions as $discussion) { if (!forum_user_can_see_discussion($forum, $discussion, $context)) { continue; } $message = file_rewrite_pluginfile_urls($discussion->message, 'pluginfile.php', $context->id, 'mod_forum', 'post', $discussion->id); $imagestyle = ''; $imgarr = \theme_snap\local::extract_first_image($message); if ($imgarr) { $imageurl = s($imgarr['src']); $imagestyle = " style=\"background-image:url('{$imageurl}')\""; } $name = format_string($discussion->name, true, array('context' => $context)); $date = userdate($discussion->timemodified, get_string('strftimedatetime', 'langconfig')); $readmorebtn = "<a class='btn btn-default toggle' href='" . $CFG->wwwroot . "/mod/forum/discuss.php?d=" . $discussion->discussion . "'>" . get_string('readmore', 'theme_snap') . "</a>"; $preview = ''; $newsimage = ''; if (!$imagestyle) { $preview = html_to_text($message, 0, false); $preview = "<div class='news-article-preview'><p>" . shorten_text($preview, 200) . "</p>\n <p class='text-right'>" . $readmorebtn . "</p></div>"; } else { $newsimage = '<div class="news-article-image toggle"' . $imagestyle . ' title="' . get_string('readmore', 'theme_snap') . '"></div>'; } $close = get_string('close', 'theme_snap'); $output .= <<<HTML <div class="news-article clearfix"> {$newsimage} <div class="news-article-inner"> <div class="news-article-content"> <h3 class='toggle'><a href="{$CFG->wwwroot}/mod/forum/discuss.php?d={$discussion->discussion}">{$name}</a></h3> <em class="news-article-date">{$date}</em> </div> </div> {$preview} <div class="news-article-message" tabindex="-1"> {$message} <div><hr><a class="snap-action-icon toggle" href="#"> <i class="icon icon-close"></i><small>{$close}</small></a></div> </div> </div> HTML; } $actionlinks = html_writer::link(new moodle_url('/mod/forum/view.php', array('id' => $cm->id)), get_string('morenews', 'theme_snap'), array('class' => 'btn btn-default')); if (forum_user_can_post_discussion($forum, $currentgroup, $groupmode, $cm, $context)) { $actionlinks .= html_writer::link(new moodle_url('/mod/forum/post.php', array('forum' => $forum->id)), get_string('addanewtopic', 'forum'), array('class' => 'btn btn-primary')); } $output .= html_writer::end_div(); $output .= "<br><div class='text-center'>{$actionlinks}</div>"; $output .= html_writer::end_tag('div'); return $output; }
/** * Get page module html * @param $mod * @return string */ protected function mod_page_html($mod) { if (!$mod->uservisible) { return ""; } global $DB; $sql = "SELECT * FROM {course_modules} cm\n JOIN {page} p ON p.id = cm.instance\n WHERE cm.id = ?"; $page = $DB->get_record_sql($sql, array($mod->id)); $context = context_module::instance($mod->id); $formatoptions = new stdClass(); $formatoptions->noclean = true; $formatoptions->overflowdiv = true; $formatoptions->context = $context; // Make sure we have some summary/extract text for the course page. if (!empty($page->intro)) { $page->summary = file_rewrite_pluginfile_urls($page->intro, 'pluginfile.php', $context->id, 'mod_page', 'intro', null); $page->summary = format_text($page->summary, $page->introformat, $formatoptions); } else { $preview = html_to_text($page->content, 0, false); $page->summary = shorten_text($preview, 200); } $content = file_rewrite_pluginfile_urls($page->content, 'pluginfile.php', $context->id, 'mod_page', 'content', $page->revision); $content = format_text($content, $page->contentformat, $formatoptions); $imgarr = \theme_snap\local::extract_first_image($content); $thumbnail = ''; if ($imgarr) { $img = html_writer::img($imgarr['src'], $imgarr['alt']); $thumbnail = "<div class=summary-figure>{$img}</div>"; } $readmore = get_string('readmore', 'theme_snap'); $close = get_string('close', 'theme_snap'); $o = "\n {$thumbnail}\n <div class='summary-text'>\n {$page->summary}\n <p><a class='pagemod-readmore' href='{$mod->url}'>{$readmore}</a></p>\n </div>\n\n <div class=pagemod-content tabindex='-1'>\n {$content}\n <div><hr><a class='snap-action-icon' href='#'>\n <i class='icon icon-office-52'></i><small>{$close}</small></a></div>\n </div>"; return $o; }
public function test_extract_first_image() { $actual = local::extract_first_image('no image here'); $this->assertFalse($actual); $html = '<img src="http://www.example.com/image.jpg" alt="example image">'; $actual = local::extract_first_image($html); $this->assertSame('http://www.example.com/image.jpg', $actual['src']); $this->assertSame('example image', $actual['alt']); }
/** * Get page module html * @param cm_info $mod * @return string */ protected function mod_page_html(cm_info $mod) { if (!$mod->uservisible) { return ""; } $page = \theme_snap\local::get_page_mod($mod); $imgarr = \theme_snap\local::extract_first_image($page->content); $thumbnail = ''; if ($imgarr) { $img = html_writer::img($imgarr['src'], $imgarr['alt']); $thumbnail = "<div class=summary-figure>{$img}</div>"; } $readmore = get_string('readmore', 'theme_snap'); $close = get_string('close', 'theme_snap'); // Identify content elements which should force an AJAX lazy load. $elcontentblist = ['iframe', 'video', 'object', 'embed']; $content = $page->content; $lazyload = false; foreach ($elcontentblist as $el) { if (stripos($content, '<' . $el) !== false) { $content = ''; // Don't include the content as it is likely to slow the page load down considerably. $lazyload = true; } } $contentloaded = !$lazyload ? 1 : 0; $o = "\n {$thumbnail}\n <div class='summary-text'>\n {$page->summary}\n <p><a class='pagemod-readmore' href='{$mod->url}' data-pagemodcontext='{$mod->context->id}'>{$readmore}</a></p>\n </div>\n\n <div class=pagemod-content tabindex='-1' data-content-loaded={$contentloaded}>\n {$content}\n <div><hr><a class='snap-action-icon' href='#'>\n <i class='icon icon-office-52'></i><small>{$close}</small></a></div>\n </div>"; return $o; }