Mercurial
diff .cms/mini/tpl.mod.php @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.cms/mini/tpl.mod.php Fri Oct 11 22:40:23 2024 +0000 @@ -0,0 +1,125 @@ +<?php + +// ru_RU.UTF-8: +// Мини-модуль, встроенный в шаблон, +// демонстрирующий поиск и пагинацию. + +$cms["urls"]["^{$cms['base_path']}search_by_tag$"] = "hook_search_by_tag"; +$cms["urls"]["^{$cms['base_path']}get_posts$"] = "hook_tpl_get_posts"; + +hook_add_fn( "hook_search_by_tag", "tpl_search_by_tag_fn" ); +hook_add_fn( "menu_item_link", "tpl_menu_item_link" ); +hook_add_fn( "hook_tpl_get_posts", "tpl_get_posts" ); + +$tpl = $cms["config"]["template.mod.php"]["template"]; +// Translate +$cms["lang"][$tpl]["en_US.UTF-8"] = array( + "load_more" => "Load more", +); +$cms["lang"][$tpl]["ru_RU.UTF-8"] = array( + "load_more" => "Загрузить еще", +); +$cms["lang"][$tpl]["uk_UA.UTF-8"] = array( + "load_more" => "Завантажити ще", +); + +// Делает дополнительную обертку пунктам меню имеющим подпункты +// Как проверить: +// +function tpl_menu_item_link() { + global $cms; + + if ( $cms["menu.mod.php"]["item_link"]["has_submenu"] ) { + $cms["menu.mod.php"]["item_link"]["link"] = " + <div class=plus> + {$cms['menu.mod.php']['item_link']['link']} + <div class=icon></div> + </div>"; + } +} + +// Поиск по тегам +// Как проверить: +// Нигде не задействована +function tpl_search_by_tag_fn() { + global $cms; + if ( ! empty( $_GET['tag'] ) ) { + $cms["page"]["title"] = "Поиск по тегу"; + $cms["status"] = "200"; + $cms["hooks"]["write"]["disabled"] = true; + $cms["hooks"]["hook_search_by_tag"]["next"] = "template"; + $cms["page"]["text"] = "<h1>Статьи с тегом \"{$_GET['tag']}\"</h1>"; + $cms["page"]["tpl"] = "page"; + $cms["page"]["id"] = "search"; + + if ( cms_base_connect() ) { + $etag = mysqli_real_escape_string( $cms["base"], $_GET["tag"] ); + $query = "SELECT * FROM pages WHERE tags LIKE '%{$etag}%' ORDER BY id DESC"; + + if ( $res = mysqli_query( $cms["base"], $query ) ) { + while ( $page = mysqli_fetch_assoc( $res ) ) { + $cms["page"]["text"] .= "<a target=_blank href='{$cms['base_path']}{$page['url']}'>{$page['title']}</a>"; + } + } else { + $cms["page"]["text"] .= "<p class=error>Ошибка выполнения запроса к базе данных.</p>"; + } + } else { + $cms["page"]["text"] .= "<p class=error>Ошибка подключения к базе данных.</p>"; + } + } +} + +function tpl_get_posts() { + global $cms; + + if ( ! empty( $_POST["last"] ) ) { + cms_base_connect(); + + $last = mysqli_real_escape_string( $cms["base"], $_POST["last"] ); + $date = date( 'Y-m-d H:i:s' ); + // `created`<'{$date}' все равно нужно чтобы не запрашивали будущие + $q = "SELECT * FROM pages WHERE tpl = 'post' AND `created`<'{$last}' AND `created`<'{$date}' AND published ORDER BY `created` DESC"; + if ( $res = mysqli_query( $cms["base"], $q ) ) { + + $html = ""; + $n = 12; + + while ( $n-- > 0 && $page = mysqli_fetch_assoc( $res ) ) { + + if ( preg_match( '/<img[^>]+data-preview[^>]*>/us', $page['text'], $m ) ) { + $preview_img = $m[0]; + } else { + $preview_img = ''; + } + + if ( preg_match( '/^(.*)(<!--[\s]*preview-start[\s]*-->)(.*)(<!--[\s]*preview-end[\s]*-->)(.*)$/us', $page['text'], $m ) ) { + $preview = $m[3]; + } else { + $preview = preg_replace( "/<h1>(.*?)<\/h1>/su", "", $page['text'] ); + $preview = preg_replace( "/<style>(.*?)<\/style>/su", "", $preview ); + $preview = trim( $preview ); + $preview = mb_substr( strip_tags( $preview ), 0, 500 ); + $preview = preg_replace( '/\s\S*$/u', ' ...', $preview ); + $preview = "<p>{$preview}</p>"; + } + + $html .= " + <article data-date='{$page['created']}'> + {$preview_img} + <h2><a href='{$page['url']}' target=_blank>{$page['title']}</a></h2> + {$preview} + </article> + "; + + } + + echo $html; + // Показать кнопку "Загрузить еще" если есть посты + if ( $page = mysqli_fetch_assoc( $res ) ) { + $tpl = $cms["config"]["template.mod.php"]["template"]; + echo "<button class=load-more>" . __( "load_more", $tpl ) . "</button>"; + } + + } + } +}