- 15, May 2024
- #1
Привет. Я пытаюсь собрать воедино несколько фрагментов кода, чтобы создать базовую CMS для бедняков. Я ищу эти функции:
Некоторые сомнения Проблема со списком страниц:
Как лучше всего добавить систему тегов? статьи имеют идентификатор.
Я подумал о создании файла с именем tags.txt, в котором теги будут присваиваться каждому идентификатору статьи следующим образом:
Это хорошая идея?
Мои познания в программировании очень ограничены — лишь немного базового C. Любая помощь приветствуется. Фактический код Большая часть взята из материалов @deathshadow на нескольких форумах и кода его веб-сайта Скрытая информация :: Авторизуйтесь для просмотра »
Benson. Я внес некоторые изменения.
index.php
- Пагинация.
- Полные дружественные URL-адреса.
- Статьи.
- Теги.
- Плоские файлы вместо базы данных.
Некоторые сомнения Проблема со списком страниц:
- Элемент 1 имеет URL-адрес /articles/0 вместо /articles.
- Элемент 2 имеет URL-адрес /articles/1 вместо /articles/2.
Как лучше всего добавить систему тегов? статьи имеют идентификатор.
Я подумал о создании файла с именем tags.txt, в котором теги будут присваиваться каждому идентификатору статьи следующим образом:
<?php
function template_header(
$pageTitle = false,
$keywords = false,
$description = false
) {
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"[URL='https://lumtu.com/yti/dk55kdGRodHRwOi8vdzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdCjlm']http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd[/URL]">
<html
xmlns="[URL='https://lumtu.com/yti/b0hh0bWxodHRwOi8vdzMub3JnLzE5OTkveGvkT']http://www.w3.org/1999/xhtml[/URL]"
lang="en"
xml:lang="en"
><head>
<meta
http-equiv="Content-Type"
content="текст/html; кодировка = utf-8"
/>
<meta
http-equiv="Content-Language"
contrut="en"
/>
<meta
name="viewport"
content="ширина = ширина устройства; начальный масштаб = 1,0"
/>';
if ($keywords) echo '
<meta
name="keywords"
content="', $ключевые слова, '"
/>';
if ($description) echo '
<meta
name="description"
content="', $описание, '"
/>';
echo '
<link
type="text/css"
rel="stylesheet"
href="', ROOT_HTTP, 'theme/screen.css"
media="screen,projection,tv"
/>
<title>
', ($pageTitle ? $pageTitle . ' - ' : ''), ' Site Title
</title>
</head><body>
<div id="top" class="widthWrapper">
<h1>
Site Title
<span><!-- image replacement --></span>
</h1>
<ul id="mainMenu">
<li><a href="', ROOT_HTTP, '">Home</a></li>
<li><a href="', ROOT_HTTP, 'articles">Articles</a></li>
<li><a href="', ROOT_HTTP, 'about">About</a></li>
<li><a href="', ROOT_HTTP, 'contact">Contact</a></li>
</ul>
<hr /><!-- remove if content starts with numbered heading -->
<div id="contentWrapper"><div id="content">';
// using double-wrapper for fluid content-first columns
} // template_header
function template_footer($extrasFile = false) {
echo '
<!-- #content, #contentWrapper --></div></div>
<div id="extras">';
// any static / common to all pages sidebar stuff here
if ($extrasFile) include($extrasFile . '.php');
echo '
<!-- #extras --></div>
<div id="footer">
Disclaimer / Other footer stuff here
<!-- #footer --></div>
<!-- #top.widthWrapper --></div>
';
} // template_footer
?>
Код (разметка): а затем обработка его с помощью PHP.
Это хорошая идея?
Мои познания в программировании очень ограничены — лишь немного базового C. Любая помощь приветствуется. Фактический код Большая часть взята из материалов @deathshadow на нескольких форумах и кода его веб-сайта Скрытая информация :: Авторизуйтесь для просмотра »
Benson. Я внес некоторые изменения.
index.php
<?php require_once('theme/index.template.php'); template_header( false, // don't show "pageTitle - Site title" 'seven,or,eight,words,that,exist,in,body', // keywords 'A short natural language description describing the site' ); require_once('libs/articles.lib.php'); require_once('libs/paginate.lib.php'); if (request::value(2)!='') { echo '<h1>Error 404</h1>'; http_response_code(404); template_footer(); die(); } echo ' <h2>Articles</h2> <p> This is where your page unique content would go! </p> '; //$page = isset($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 0; $page = request::value(1); $paginator = new Paginate('', $page, newsNumber()); $paginator->show(); $limits = $paginator->getLimits(); news(false, $limits[':offset'], $limits[':limit']); template_footer(); ?>
Код (разметка): библиотеки/articles.lib.php
<?php /* gzip.lib.php Version 1.0 Jason M. Knight, August 2009 Uses a proper exit handler to provide automation of gzip compression of our PHP output with little if any headaches.
ASSUMES: CONTENT_ENCODING contains either 'x-gzip' or 'gzip' based on the value in HTTP_ACCEPT_ENCODING.
See "defines.php" to see how this is set.
If STRIP_WHITESPACE is defined whitespace between tags or at the start of lines will be stripped, as will comments.
Whitespace between a tag and CDATA or between attributes will be left alone.
*/ ob_start(); ob_implicit_flush(0); register_shutdown_function(function() { header('Content-Encoding: ' . CONTENT_ENCODING); $contents = ob_get_contents(); if (defined('STRIP_WHITESPACE')) $contents = preg_replace( ['#<!--.*?-->#s', '#>\s+<#', '#\n\s+<#'], ['', '><', '<'], $data ); ob_end_clean(); echo "\x1f\x8b\x08\x00\x00\x00\x00\x00", substr(gzcompress($contents, 6), 0, -4); }); [/B]
Код (разметка): библиотеки/paginate.lib.php
<?php class Paginate { private $perPage, $maxShow, $middle, $href, $current, $lastPage; public function __construct( $href = '/', $current = 0, $total = 0, $perPage = 5, $maxShow = 5 //, //$field = 'page' ) { //$this->href = ' href="' . $href . ( // strpos($href, '?') === FALSE ? '?' : '&' //) . $field . '='; $this->href = ' href="'; $this->current = $current; $this->total = $total; $this->perPage = $perPage; $this->maxShow = $maxShow; $this->middle = floor($maxShow / 2); $this->lastPage = floor(($total - 1) / $perPage); } // Paginate::__construct public function getLimits() { return [ ':offset' => $this->current * $this->perPage, ':limit' => $this->perPage ]; } private function anchorLine($page, $text, $title = false, $rel = false) { $tag = $page < 0 ? 'span' : 'a'; echo ' <li><', $tag, ( $page >= 0 ? $this->href . $page . '"' : '' ), ( $page == -2 ? ' class="disabled"' : '' ), ( $title ? ' title="' . $название.
'"' : '' ), ( $rel ? ' rel="' . $rel . '"' : '' ), '>', $text, '</', $tag, '></li>'; } public function show() { if ($this->total <= $this->perPage) return; echo ' <ul class="pagination">'; if (($this->lastPage > 0) && ($this->current > 0)) { $this->anchorLine(0, 'First'); $this->anchorLine($this->current - 1, '◀', 'Previous Page', 'prev'); } else { $this->anchorLine(-2, 'First'); $this->anchorLine(-2, '◀'); } if ($this->lastPage >= $this->maxShow) { $counter = ($this->current <= $this->middle) ? 0 : $this->current - $this->middle; $endPage = $counter + $this->maxShow; if ($endPage > $this->lastPage) { $counter = $this->lastPage - $this->maxShow; if ($counter < 0) $counter = 0; $endPage = $this->lastPage; } } else { $counter = 0; $endPage = $this->lastPage; } while ($counter <= $endPage) $this->anchorLine( $counter == $this->current ? -1 : $counter, ++$counter ); if (($this->lastPage > 0) && ($this->current < $this->lastPage)) { $this->anchorLine($this->current + 1, '▶', 'Next Page', 'next'); $this->anchorLine($this->lastPage, 'Last'); } else { $this->anchorLine(-2, '▶'); $this->anchorLine(-2, 'Last'); } echo ' </ul>'; } // Paginate::show } // Paginate
Код (разметка): библиотеки/gzip.lib.php
<?php function newsNumber() { global $article_dir,$users,$txt_convert; $articles=scandir($article_dir,1); return (count($articles)-2); // Number of files except . and .. } function news($mode,$start,$count) { global $article_dir,$users,$txt_convert; $articles=scandir($article_dir,1); $t=$start; $end=$t+$count; if ($end>count($articles)) { $end=count($articles); } while ($t<$end) { switch ($articles[$t]) { case '.': case '..': break; default: list($id, $date,$subject,$author)=explode('_',$articles[$t]); //$author=$users[str_replace('.article.txt','',$author)]; $author = str_replace('.article.txt','',$author); $date=date("d F Y", mktime(0,0,0, substr($date,4,2), substr($date,6,2), substr($date,0,4) ) ); $contents=str_ireplace($txt_convert['in'],$txt_convert['out'], trim(file_get_contents($article_dir.'/'.$articles[$t])) ); echo ' <div class="article"> <h3> '; echo ' ',$subject,' <span>',$date,'</span>'; echo ' </h3> '; echo '<div class="article_body">'; echo ' <p>',$contents,'</p> <div class="author">Author: ',$author,'</div> <div class="id">ID: ',$id,'</div> '; echo '</div>'; echo ' </div> '; break; } $t++; } } ?>
Код (разметка): статика/articles.php
<?php // start compression first since it does a heading and starts buffering define('CONTENT_ENCODING', (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'x-gzip') !== false) ? 'x-gzip' : (strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false) ? 'gzip' : false ); if (CONTENT_ENCODING) include('libs/gzip.lib.php'); function cleanPath($path) { return trim(str_replace(['\\','%5C'],'/',$path),'/'); } function bomb($title, $message) { template_header('ERROR - ' . $title); echo ' <div id="fatalError"> <h2> ',$title,' </h2> <p>',$message,'</p> <p><strong>EXECUTION HALTED</strong></p> <!-- #fatalError --></div>'; template_footer(); die; } final class request { private static $data = []; public static function value($index = 0, $clean = false) { if ($index === true) { $index = 0; $clean = true; } if (count(self::$data) == 0) { $path = cleanPath(parse_url($_SERVER['REQUEST_URI'],PHP_URL_PATH)); if (strpos($path,'..')) bomb('hackingDetected', 'uptreeFail'); $path = substr($path, strlen(HTTP_ROOT) - 1); self::$data = empty($path) ? ['default'] : explode('/',$path); foreach (self::$data as &$p) $p = urldecode($p); } return isset(self::$data[$index]) ? ( $clean ? cleanName(self::$data[$index]) : self::$data[$index] ) : false; } } // class request.
request::value(0) return first parameter.
/* define('SCRIPT_PATH', cleanPath(pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME))); define('ROOT_HTTP', '/' . SCRIPT_PATH . (SCRIPT_PATH == '' ? '' : '/')); define('ROOT_LOCAL', pathinfo($_SERVER['SCRIPT_FILENAME'], PATHINFO_DIRNAME) . '/'); define('HOST_PROTOCOL', 'http' . ( isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] != 'off') ? 's' : '' ) . '://'); define('HOST_HTTP', HOST_PROTOCOL . $_SERVER['HTTP_HOST']); define('BASE_HTTP', HOST_HTTP . ROOT_HTTP); define('PATH_HTTP', '/' . parse_url(cleanPath($_SERVER['REQUEST_URI']), PHP_URL_PATH) ); define('FULL_HTTP', HOST_HTTP . PATH_HTTP); define('CANONICAL_PATH', request::getPath()); define('CANONICAL_URI', HOST_PROTOCOL . WORKING_DOMAIN . '/' . CANONICAL_PATH); define('CANONICAL_URIe', urlencode(CANONICAL_URI)); */ define('SCRIPT_PATH', cleanPath(pathinfo($_SERVER['SCRIPT_NAME'], PATHINFO_DIRNAME))); define('ROOT_HTTP', '/' . SCRIPT_PATH . (SCRIPT_PATH == '' ? '' : '/')); define('SCRIPT_FILENAME',cleanPath($_SERVER['SCRIPT_FILENAME'])); define('HTTP_ROOT',str_ireplace('index.php','',$_SERVER['PHP_SELF'])); define('LOCAL_ROOT',str_ireplace('index.php','',SCRIPT_FILENAME)); define('HTTP_THEME', HTTP_ROOT . 'theme/'); require_once('setup.php'); switch(request::value()) { case 'article': require_once('theme/article.template.php'); break; default: // then it must be the index, a static or Not Found require_once( is_file($targetFile = 'statics/' . request::value() . '.php') ? $targetFile : 'statics/404.php' ); } ?>
Код (разметка): тема/index.template.php
1 tag1,tag2,tag3 2 tag2 3 tag4,tag5
Код (разметка):
Ссылки на код, который я использую
- https://forums.digitalpoint.com/threads/pagination-trouble.2765688/#post-19241004
- http://www.codingforums.com/php/376974-what-better.html
- http://www.webdeveloper.com/forum/showthread.php?294891-Maintaining-Large-Websites-(input-wanted)
- http://www.codingforums.com/php/377106-single-entry-point-php.html
- https://forums.digitalpoint.com/threads/what-is-the-need-of-php-in-a-website.506496/#post-4760020