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>";
+            }
+    
+        }
+    }
+}