Новостная лента
Создаем файл модели models/news.model.php
<? class News extends Model { protected $name = "Новости"; protected $model_elements = array( array("Активация", "bool", "active", array("on_create" => true)), array("Дата", "date", "date", array("required" => true)), array("Название", "char", "name", array("required" => true)), array("Ссылка", "url", "url", array("unique" => true, "translit_from" => "name")), array("Изображение", "image", "image"), array("Текст новости", "text", "content", array("rich_text" => true)) ); ?>
Вносим название модели в файл config/models.php
$mvActiveModels = array('pages', 'blocks', ... , 'news');
Создаем SQL таблицу в базе данных, после чего модель может работать в административной панели
CREATE TABLE `news` ( `id` int(11) NOT NULL, `active` tinyint(1) NOT NULL, `name` varchar(250) NOT NULL, `date` date NOT NULL, `image` varchar(250) NOT NULL, `url` varchar(200) NOT NULL, `content` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `news` ADD PRIMARY KEY (`id`), ADD KEY `url` (`url`); ALTER TABLE `news` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Создаем файлы шаблонов views/view-news.php и views/view-news-details.php, а также вносим маршруты к шаблонам в файл config/routes.php
$mvFrontendRoutes = array( ... , "news/" => "view-news.php", "news/*/" => "view-news-details.php" );
Добавляем методы в файл модели
public function defineNewsPage(Router $router) { $url_parts = $router -> getUrlParts(); $record = false; if(count($url_parts) == 2) if(is_numeric($url_parts[1])) $record = $this -> findRecord(array("id" => $url_parts[1], "active" => 1)); else $record = $this -> findRecord(array("url" => $url_parts[1], "active" => 1)); return $record; } public function display() { $params = array("active" => 1, "order->desc" => "date", "limit->" => $this -> pager -> getParamsForSelect()); $rows = $this -> select($params); $html = ""; foreach($rows as $row) { $url = $this -> root_path."news/".($row['url'] ? $row['url'] : $row['id'])."/"; $html .= "<div class=\"news-wrapper\">\n"; $html .= "<h2><a href=\"".$url."\">".$row['name']."</a></h2>\n"; $html .= "<p class=\"news-date\">".I18n :: formatDate($row['date'])."</p>\n"; if($row['image']) { $html .= "<a href=\"".$url."\" class=\"news-image\">\n"; $html .= $this -> cropImage($row['image'], 187, 127)."</a>\n"; } $html .= "<p class=\"news-content\">".Service :: cutText($row['content'], 350, " ...")."</p>\n"; $html .= "</div>\n"; } return $html; } public function displayPreviousAndNext($current_id, $current_date) { $html = ""; $params = array("active" => 1, "id!=" => $current_id, "date>=" => $current_date, "order->asc" => "date"); if($record = $this -> findRecord($params)) { $url = $this -> root_path."news/".($record -> url ? $record -> url : $record -> id)."/"; $html .= "<a class=\"previous\" href=\"".$url."\">Предыдущая новость</a>\n"; } $params = array("active" => 1, "id!=" => $current_id, "date<=" => $current_date, "order->desc" => "date"); if($record = $this -> findRecord($params)) { $url = $this -> root_path."news/".($record -> url ? $record -> url : $record -> id)."/"; $html .= "<a class=\"next\" href=\"".$url."\">Следующая новость</a>\n"; } return $html; }
Содержимое файла шаблона view-news.php
<? $count_records = $mv -> news -> countRecords(array("active" => 1)); $current_page = $mv -> router -> defineCurrentPage("page"); $mv -> news -> runPager($count_records, 7, $current_page); $path = $mv -> root_path."news/"; $mv -> seo -> mergeParams("Новости"); include $mv -> views_path."main-header.php"; ?> <div class="wrapper"> <div id="content"> <div class="breadcrumbs"> <a href="<? echo $mv -> root_path; ?>">Главная</a> </div> <h1>Новости</h1> <div class="news-list"> <? echo $mv -> news -> display(); if($mv -> news -> pager -> hasPages()) { echo "<div class=\"pager\">\n<span>Страница</span>\n"; echo $mv -> news -> pager -> displayPrevLink("предыдущая", $path); echo $mv -> news -> pager -> display($path, false); echo $mv -> news -> pager -> displayNextLink("следующая", $path); echo "</div>\n"; } ?> </div> </div> </div> <? include $mv -> views_path."main-footer.php"; ?>
Содержимое файла шаблона view-news-details.php
<? $record = $mv -> news -> defineNewsPage($mv -> router); $mv -> display404($record); $mv -> seo -> mergeParams($record, "name"); include $mv -> views_path."main-header.php"; ?> <div class="wrapper"> <div id="content"> <div class="breadcrumbs"> <a href="<? echo $mv -> root_path; ?>">Главная</a> <a href="<? echo $mv -> root_path; ?>news/">Новости</a> </div> <h1><? echo $record -> name; ?></h1> <div class="news-inside-date"><? echo I18n :: formatDate($record -> date); ?></div> <div class="news-inside-content"> <? echo $mv -> news -> cropImage($record -> image, 383, 258); echo $record -> content; ?> </div> <div id="previous-next"> <? echo $mv -> news -> displayPreviousAndNext($record -> id, $record -> date); ?> </div> </div> </div> <? include $mv -> views_path."main-footer.php"; ?>