Mercurial
diff .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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.cms/mini/blog.php Fri Oct 11 22:40:23 2024 +0000 @@ -0,0 +1,90 @@ +<main> + <?php + $date = date( 'Y-m-d H:i:s' ); + $q = "SELECT * FROM pages WHERE tpl = 'post' 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>"; + } + + } +?> +<script> + document.addEventListener( "DOMContentLoaded", function( event ) { + let main = document.querySelector( "body > main" ); + function load_more() { + let more = document.querySelector( `button[class="load-more"]` ); + if ( more ) more.addEventListener( "click", function( el ) { + let last_el = this.previousElementSibling; + let last = last_el.getAttribute( "data-date" ); + api( { last: last }, function( html ) { + more.remove(); + main.insertAdjacentHTML( "beforeend", html ); + load_more(); + } ); + } ); + } + load_more(); + + function api( data, rfn ) { + const formData = new FormData(); + buildFormData( formData, data ); + let ajax = new XMLHttpRequest(); + ajax.addEventListener( "load", function( event ) { + rfn( event.target.responseText ); + } ); + ajax.addEventListener( "error", function( event ) { + console.log( event ); + } ); + ajax.open( "POST", "<?php echo $cms["base_path"]; ?>get_posts" ); + ajax.send( formData ); + } + function buildFormData( formData, data, parentKey ) { + if ( data && typeof data === 'object' && ! ( data instanceof Date ) && ! ( data instanceof File ) ) { + Object.keys( data ).forEach( key => { + buildFormData( formData, data[key], parentKey ? `${parentKey}[${key}]` : key ); + } ); + } else { + const value = data == null ? '' : data; + formData.append( parentKey, value ); + } + } + } ); +</script> +</main>