Mercurial
comparison .cms/mini/blog.php @ 0:78edf6b517a0 draft
24.10
author | Coffee CMS <info@coffee-cms.ru> |
---|---|
date | Fri, 11 Oct 2024 22:40:23 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 <main> | |
2 <?php | |
3 $date = date( 'Y-m-d H:i:s' ); | |
4 $q = "SELECT * FROM pages WHERE tpl = 'post' AND `created`<'{$date}' AND published ORDER BY `created` DESC"; | |
5 if ( $res = mysqli_query( $cms["base"], $q ) ) { | |
6 | |
7 $html = ""; | |
8 $n = 12; | |
9 | |
10 while ( $n-- > 0 && $page = mysqli_fetch_assoc( $res ) ) { | |
11 | |
12 if ( preg_match( '/<img[^>]+data-preview[^>]*>/us', $page['text'], $m ) ) { | |
13 $preview_img = $m[0]; | |
14 } else { | |
15 $preview_img = ''; | |
16 } | |
17 | |
18 if ( preg_match( '/^(.*)(<!--[\s]*preview-start[\s]*-->)(.*)(<!--[\s]*preview-end[\s]*-->)(.*)$/us', $page['text'], $m ) ) { | |
19 $preview = $m[3]; | |
20 } else { | |
21 $preview = preg_replace( "/<h1>(.*?)<\/h1>/su", "", $page['text'] ); | |
22 $preview = preg_replace( "/<style>(.*?)<\/style>/su", "", $preview ); | |
23 $preview = trim( $preview ); | |
24 $preview = mb_substr( strip_tags( $preview ), 0, 500 ); | |
25 $preview = preg_replace( '/\s\S*$/u', ' ...', $preview ); | |
26 $preview = "<p>{$preview}</p>"; | |
27 } | |
28 | |
29 $html .= " | |
30 <article data-date='{$page['created']}'> | |
31 {$preview_img} | |
32 <h2><a href='{$page['url']}' target=_blank>{$page['title']}</a></h2> | |
33 {$preview} | |
34 </article> | |
35 "; | |
36 | |
37 } | |
38 | |
39 echo $html; | |
40 // Показать кнопку "Загрузить еще" если есть посты | |
41 if ( $page = mysqli_fetch_assoc( $res ) ) { | |
42 $tpl = $cms["config"]["template.mod.php"]["template"]; | |
43 echo "<button class=load-more>" . __( "load_more", $tpl ) . "</button>"; | |
44 } | |
45 | |
46 } | |
47 ?> | |
48 <script> | |
49 document.addEventListener( "DOMContentLoaded", function( event ) { | |
50 let main = document.querySelector( "body > main" ); | |
51 function load_more() { | |
52 let more = document.querySelector( `button[class="load-more"]` ); | |
53 if ( more ) more.addEventListener( "click", function( el ) { | |
54 let last_el = this.previousElementSibling; | |
55 let last = last_el.getAttribute( "data-date" ); | |
56 api( { last: last }, function( html ) { | |
57 more.remove(); | |
58 main.insertAdjacentHTML( "beforeend", html ); | |
59 load_more(); | |
60 } ); | |
61 } ); | |
62 } | |
63 load_more(); | |
64 | |
65 function api( data, rfn ) { | |
66 const formData = new FormData(); | |
67 buildFormData( formData, data ); | |
68 let ajax = new XMLHttpRequest(); | |
69 ajax.addEventListener( "load", function( event ) { | |
70 rfn( event.target.responseText ); | |
71 } ); | |
72 ajax.addEventListener( "error", function( event ) { | |
73 console.log( event ); | |
74 } ); | |
75 ajax.open( "POST", "<?php echo $cms["base_path"]; ?>get_posts" ); | |
76 ajax.send( formData ); | |
77 } | |
78 function buildFormData( formData, data, parentKey ) { | |
79 if ( data && typeof data === 'object' && ! ( data instanceof Date ) && ! ( data instanceof File ) ) { | |
80 Object.keys( data ).forEach( key => { | |
81 buildFormData( formData, data[key], parentKey ? `${parentKey}[${key}]` : key ); | |
82 } ); | |
83 } else { | |
84 const value = data == null ? '' : data; | |
85 formData.append( parentKey, value ); | |
86 } | |
87 } | |
88 } ); | |
89 </script> | |
90 </main> |