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>