CMSを自作してオリジナル動的ホームページをフルスクラッチ開発⑧公開用トップページ、各種テンプレートの作成
2021-07-22

今回より、公開する動的ページの作成に入りたいと思います。
Wordpressで言えば、「テーマ」にあたる部分ですね。
公開するページのファイル構成は下記の通りです。
動的ページとなりますので、各ページのテンプレートを作成します。また、haderなどの使いまわしが出来る部分は「パーツ」としてテンプレートを作成します。各ページテンプレートに、テンプレートパーツを埋め込んで使いまわす感じですね。
動的ページの作成の流れとしては、まず「モック」(見本)として、静的なページを作成しておきます。
今回、下のようなモックをあらかじめ準備しました。↓
一部抜粋し、ソースを載せておきます↓
<header>
<div class="top">
<h1>Hallo!!</h1>
<p id="target">menu</p>
</div>
<nav id="nav" class="closed">
<div id="la1">target1</div>
<ul id="menu1" class="close">
<li>target1-2</li>
<li>target1-3</li>
<li>target1-4</li>
</ul>
<div id="la2">target1</div>
<ul id="menu2" class="close">
<li>target1-2</li>
<li>target1-3</li>
<li>target1-4</li>
</ul>
~~~~~~~~~
<main>
<div class="kiji">
<img src="#">
<p>あかかかkっヴぃおdんヴぃおdんしおdんこdんc:おいんvc:dんcv:いんcv:いんv:おんヴぉvんv:んv</p>
</div>
<div class="kiji">
<img src="#">
<p>あかかかkっヴぃおdんヴぃおdんしおdんこdんc:おいんvc:dんcv:いんcv:いんv:おんヴぉvんv:んv</p>
</div>
<div class="kiji">
<img src="#">
<p>あかかかkっヴぃおdんヴぃおdんしおdんこdんc:おいんvc:dんcv:いんcv:いんv:おんヴぉvんv:んv</p>
</div>
~~~~~~~~~~
モックが準備できれば、あとは静的な部分を動的に変更していくだけです。つまり、上記であれば下部を記事一覧表示部分のつもりで作成したので、そこをデータベースに紐づけて表示させる仕組みに変更していけば、おのずと動的ページに仕上がっていく感じです。
モックがあれば、phpの埋め込み場所やどういった挙動にさせたいかをイメージしやすいですし、マークアップしているidやclassをそのまま使いまわせるので、スタイリングも後々楽になります。
それでは、今回はトップページとなる「index.php」と、テンプレートパーツ各種を作成したいと思います。
※モックに関しての詳細は割愛します。ここをこう変更した等の説明をすれば、長くなりますので。以後、変更済みのモックをベースに説明していきます。
テンプレートパーツ
header.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hellnear blog</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1><a class="card" href="index.php">hellnear blog</a></h1>
<p id="target">menu</p>
</header>
cmsディレクトリにheader.phpを作成します。
各種ページで使いまわせるheader部を、テンプレパーツとして作成しておきます。
idやclass等、各種マークアップが今後色々出てきますが、モックを基準として同じ個所に配置しているので、あまり気にしないでください。
他はとくに説明はいらないですね。
pankuzu.php
<?php
try {
require_once("common/common.php");
if(empty($_GET["n"]) === true && empty($_GET["cate"]) === true && empty($_GET["p"]) === true) {
print "<a href='index.php'>";
print "home";
print "</a>";
} else {
$get = sanitize($_GET);
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if(isset($get["n"]) === true) {
$sql = "SELECT title, category FROM blog WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $get["n"];
$stmt -> execute($data);
$data = array();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$category = $rec["category"];
$title = $rec["title"];
$sql = "SELECT o_code FROM k_menu WHERE name=?";
$stmt = $dbh -> prepare($sql);
$data[] = $category;
$stmt -> execute($data);
$data = array();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$o_code = $rec["o_code"];
$sql = "SELECT name FROM o_menu WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $o_code;
$stmt -> execute($data);
$data = array();
$dbh = null;
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$oya = $rec["name"];
print "<a href='index.php'>";
print "home";
print "</a>";
print " > ";
print "<a href='category.php?cate=".$category."'>";
print $oya.":".$category;
print "</a>";
print " > ";
print strip_tags($title);
$o_code = array();
$title = array();
} else if(isset($get["cate"]) === true) {
$sql = "SELECT o_code FROM k_menu WHERE name=?";
$stmt = $dbh -> prepare($sql);
$data[] = $get["cate"];
$stmt -> execute($data);
$data = array();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$o_code = $rec["o_code"];
$sql = "SELECT name FROM o_menu WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $o_code;
$stmt -> execute($data);
$data = array();
$dbh = null;
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
$oya = $rec["name"];
print "<a href='index.php'>";
print "home";
print "</a>";
print " > ";
print "<a href='category.php?cate=".$get['cate']."'>";
print $oya.":".$get["cate"];
print "</a>";
//print " > ";
$o_code = array();
} else {
$sql = "SELECT title FROM page WHERE code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $get["p"];
$stmt -> execute($data);
$data = array();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
print "<a href='index.php'>";
print "home";
print "</a>";
print " > ";
print strip_tags($rec["title"]);
}
}
}
catch(Exception $e) {
print "異常";
exit();
}
?>
cmsディレクトリにpankuzu.phpを作成します。
これはパンくずリストのテンプレになります。
少々長いですので、簡潔にまとまめす。
「GETパラメータで現在の位置を表示させる」プログラムになります。
今回、各ページの識別として、
$nには記事のID
$cateにはカテゴリーID
$pにはページID
の3つの変数を利用しています。パンくずリストの表示は、
home < カテゴリ < 記事タイトル
としているので、いづれかのidが取得できれば、そこからデータベースを参照し、リストをリンク付きで表示さる事ができます。
少し話が脱線しますが、WEBページはDOMの仕組みに従って表示されます。
例えばトップページを表示させた場合、別のファイルであるテンプレートモジュールを埋め込んでいれば、それも含めて「1ページ」であるかのように振舞います。
したがって、ファイルは違えど、「変数の値は維持される」のです。
ですので、$data[] などのよく利用する変数があるならば、都度中身をarray()などで空にしておく事が重要です。
nav.php
<nav id="menu" class="close">
<h3>カテゴリー</h3>
<?php
try{
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT name, code FROM o_menu WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["name"]) === true) {
break;
}
$o_name[] = $rec["name"];
$o_code[] = $rec["code"];
}
if(isset($o_name) === true) {
$max = count($o_name);
$maxval = json_encode($max);
for($i = 0; $i < $max; $i++) {
$n = $i+1;
print "<div id='menu$n'>".$o_name[$i]."</div>";
$code = $o_code[$i];
$sql = "SELECT name FROM k_menu WHERE o_code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $code;
$stmt -> execute($data);
print "<ul id='menuopen$n'>";
while(true) {
$rec2 = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec2["name"]) === false) {
//print "<li>".$rec2['name']."</li>";
print "<a href='category.php?cate=".$rec2['name']."'>";
print "<li>".$rec2['name']."</li>";
print "</a>";
} else {
print "</ul>";
$data = array();
break 1;
}
}
}
$o_name = array();
$o_code = array();
} else {
$maxval = json_encode(999);
}
print "<br>";
print "<h3>メニュー</h3>";
$sql = "SELECT title, code FROM page WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
while(true) {
$rec3 = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec3["title"]) === true) {
break;
}
print "<a href='page.php?p=".$rec3['code']."'>";
print strip_tags($rec3["title"]);
print "</a>";
print "<br>";
}
$dbh = null;
}
catch(Exception $e) {
print "異常";
exit();
}
?>
<script type="text/javascript">
let maxval = JSON.parse("<?php echo $maxval;?>");
</script>
</nav>
<div id="back" class="white"></div>
<div id="scrolltop" class="st">⇧</div>
<div id="scrollmenu" class="sm">MENU</div>
<br><br>
cmsディレクトリにnav.phpを作成します。
ナビゲーションメニューのテンプレになります。
データベースを参照し、「親メニュー」があれば、for文で全ての親メニューを表示させ、付随する「子メニュー」があれば、その中でwhileループで子メニューを表示させています。
このナビゲーションメニューは、スマホ用の横からスライドで出てくるmenuになっているので、javascriptで操作できるようにしています。(スライドなどのクリックイベント)
そこで、各メニューにidを振っておき、それをjavascriptに伝えることが出来れば、javascript側で各メニューのidに合わせたクリックイベントを自動で生成する事が可能です。
しかし、phpの値をjavascriptにそのまま渡すことは出来ません。
そこで、「一旦JSON形式に変換する」方法を用います。
$maxval = json_encode($max); とありますが、ここでphp形式の$max(親メニューの数)をJSON形式にエンコードして、$maxvalの変数に格納しています。
これを、下部にあるjavascriptのスクリプトタグ内でパースし、javascriptとしてオブジェクトを生成します。
let maxval = JSON.parse("<?php echo $maxval;?>");
これで、javascriptの「maxval」変数に、phpの$maxの値が渡す事が出来ました。
今回、メインのjavascriptは、外部scriptとして別途作成していますが(読み出しはbody閉じタグ前に設置)、DOMの仕組みに従っているため、そこでもmaxvalの変数が利用可能です。
ちなみに、親メニューが無い場合、$maxval = json_encode(999)としていますが、これは後ほど説明します。
それでは一旦、外部scriptのjavascriptを作成します。
javascript
const target = document.getElementById("target");
const menu = document.getElementById("menu");
const back = document.getElementById("back");
const scrolltop = document.getElementById("scrolltop");
const scrollmenu = document.getElementById("scrollmenu");
if(maxval != 999) {
for(let i = 1; i <= maxval; i++) {
let menuk = +i;
let menuopen = +i;
menuk = document.getElementById("menu" + i);
menuopen = document.getElementById("menuopen" + i);
menuk.addEventListener("click", () => {
menuopen.classList.toggle("menuopen");
});
};
}
const n = 200;
window.addEventListener("scroll", function() {
if(scrollY > n) {
scrolltop.classList.add("look");
scrollmenu.classList.add("look");
} else {
scrolltop.classList.remove("look");
scrollmenu.classList.remove("look");
}
});
scrolltop.addEventListener("click", function() {
anime({
targets: "html, body",
scrollTop: 0,
dulation: 600,
easing: 'easeOutCubic',
});
});
target.addEventListener("click", function() {
menu.classList.toggle("open");
back.classList.toggle("black");
});
back.addEventListener("click", function() {
menu.classList.remove("open");
back.classList.remove("black");
});
scrollmenu.addEventListener("click", () => {
menu.classList.add("open");
back.classList.add("black");
});
cmsディレクトリにmain.jsを作成します。
これは主にスマホ画面時のメニューの出し入れなどの操作を行うクリックイベントになります。
クリックイベントについては、割愛します。
また、アニメーション(スクロールトップのアニメーション)は、anime.min.jsのライブラリを使用しています。これは別途DLして下さい。
ここでは、先頭のif文について触れておきます。
先ほどphpからjavascriptに値を渡した maxval の値が999以外ならtrueとしています。
999は、前途した通り親メニューが無い場合に格納した値になりますが、これが値を空にするとNGが出たため、とりあえず適当に数字を格納しました。。それが999なだけです、他に方法はあるんでしょうけど。。
親メニューがあった場合、親メニューの数がmaxvalに格納されているので、これを元にforで回します。
for文の中では、各id名にiを加えた変数を作成し、それにクリックイベントを付随させています。
つまり、cmsで追加した親メニューの数だけ、その親メニューに対するクリックイベントを自動で生成してくれるのです。
これは結構便利です。
side.php
<aside>
<div class="box2">
<h2>カテゴリー</h2>
<?php
try{
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT name, code FROM o_menu WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["name"]) === true) {
break;
}
$o_name[] = $rec["name"];
$o_code[] = $rec["code"];
}
if(isset($o_name) === true) {
$max = count($o_name);
print "<div class='box3'>";
for($i = 0; $i < $max; $i++) {
$n = $i+1;
print "<div id='menu$n'>".$o_name[$i]."</div>";
$code = $o_code[$i];
$sql = "SELECT name FROM k_menu WHERE o_code=?";
$stmt = $dbh -> prepare($sql);
$data[] = $code;
$stmt -> execute($data);
print "<ul class='side_ul'>";
while(true) {
$rec2 = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec2["name"]) === false) {
//print "<li>".$rec2['name']."</li>";
print "<a href='category.php?cate=".$rec2['name']."'>";
print "<li>".$rec2['name']."</li>";
print "</a>";
} else {
print "</ul>";
$data = array();
break 1;
}
}
}
}
print "</div>";
print "</div>";
print "<div class='box2'>";
print "<h2>メニュー</h2>";
$sql = "SELECT title, code FROM page WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
while(true) {
$rec3 = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec3["title"]) === true) {
break;
}
$code2[] = $rec3["code"];
$title2[] = $rec3["title"];
}
if(isset($code2) === true) {
$max2 = count($code2);
print "<div class='box3'>";
for($i = 0; $i < $max2; $i++) {
print "<a href='page.php?p=".$code2[$i]."'>";
print strip_tags($title2[$i]);
print "</a>";
print "<br>";
}
print "</div>";
}
print "</div>";
$sql = "SELECT * FROM pro WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
print "<h2>管理人</h2>";
if(isset($rec["name"]) === true) {
print "<div class='box'>";
print "<h3>".$rec['name']."</h3>";
print "<div class='img'>";
print "<img src='setting/img/".$rec['img']."'>";
print "</div>";
print $rec["honbun"];
print "</div>";
}
print "<h2>最近の投稿</h2>";
$sql = "SELECT title, img, category, time, code FROM blog ORDER BY code DESC LIMIT 0, 3";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["title"]) === true) {
break;
}
print "<div id='blog_card'>";
print "<a class='card' href='single.php?n=".$rec['code']."'>";
print "<div id='main_img'>";
print "<img src='setting/img/".$rec['img']."'>";
print "</div>";
print "<div id='main_text'>";
print "カテゴリ ".$rec["category"]."<br>";
print "更新日時 ".$rec["time"]."<br>";
print strip_tags($rec["title"])."<br>";
print "</div>";
print "</a>";
print "</div>";
}
$sql = "SELECT * FROM sp WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
print "<h2>スポンサー</h2>";
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["name"]) === true) {
break;
}
print "<div class='box'>";
print "<h3>".$rec["name"]."</h3>";
print "<div class='img'>";
print "<a href='".$rec['url']."'>";
print "<img src='setting/img/".$rec['img']."'>";
print "</a>";
print "</div>";
print "</div>";
}
}
catch(Exception $e) {
print "異常";
exit();
}
?>
</aside>
</warapper>
cmsディレクトリにside.phpを作成します。
これはsideエリアのテンプレートになります。
今回はこの部分に、「PC画面のカテゴリ」「固定記事のリンク」「プロフィール」「スポンサーリンク」「最近の投稿」を設置しました。
全てcmsからデータベースへ登録した内容が反映される仕組みになっています。
特に説明はいりませんね。
ちなみに、スマホ版のカテゴリメニューと、PC版のカテゴリメニューは表示の仕方を変えているので、cssでレスポンシブに表示を変えさせています。
footer.php
<footer> <h3>hellnere blog</h3> </footer> <script src="main.js"></script> <script src="anime.min.js"></script> </body> </html
cmsディレクトリにfooter.phpを作成します。
これはfooterのテンプレートになります。
これも特に説明はいらないですね。外部スクリプトとしてmain.jsとanime.min.jsを読み込ませています。
トップページのテンプレート
index.php
<?php require_once("header.php");?>
<warapper>
<main>
<?php require_once("pankuzu.php");?>
<?php
try {
require_once("common/common.php");
if(empty($_GET["page"]) === true) {
$page = 1;
} else {
$get = sanitize($_GET);
$page = $get["page"];
}
$now = $page -1;
$card_max = 5;
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$user = "root";
$password = "";
$dbh = new PDO($dsn, $user, $password);
$dbh -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT title FROM blog WHERE1";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["title"]) === true) {
break;
}
$title[] = $rec["title"];
}
if(isset($title) === true) {
$card_all = count($title);
$page_max = ceil($card_all / $card_max);
if($page === 1) {
$sql = "SELECT code, category, img, title, time FROM blog ORDER BY code DESC LIMIT $now, $card_max";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
} else {
$now = $now * $card_max;
$sql = "SELECT code, category, img, title, time FROM blog ORDER BY code DESC LIMIT $now, $card_max";
$stmt = $dbh -> prepare($sql);
$stmt -> execute();
}
while(true) {
$rec = $stmt -> fetch(PDO::FETCH_ASSOC);
if(empty($rec["title"]) === true) {
break;
}
print "<div id='blog_card'>";
print "<a class='card' href='single.php?n=".$rec['code']."'>";
print "<div id='main_img'>";
print "<img src='setting/img/".$rec['img']."'>";
print "</div>";
print "<div id='main_text'>";
print "カテゴリ ".$rec["category"]."<br>";
print "更新日 ".$rec["time"]."<br>";
print "<div class='card_title'>";
print strip_tags($rec["title"])."</div><br>";
print "</div>";
print "</a>";
print "</div>";
}
print "<div class='pag'>";
for($i = 1; $i <= $page_max; $i++) {
if($i == $page) {
print "<div class='posi'>".$page."</div>";
} else {
print "<div class='posi'><a href='index.php?page=".$i."'>";
print $i."</a></div>";
}
}
print "</div>";
} else {
print "<br><br>";
print "記事はありません。";
}
$dbh = null;
}
catch(Exception $e) {
print "異常";
exit();
}
?>
<?php require_once("nav.php");?>
</main>
<?php require_once("side.php");?>
<?php require_once("footer.php");?>
cmsディレクトリにindex.phpを作成します。
これは公開するWEBサイトのトップページのテンプレートになります。全ての投稿記事の一覧を、ページネーションを利用して、このテンプレート1つで実現させます。
動的ページですので、このページ1つで、複数のページを再現する事が可能なんです。
モックを参考に、適切な箇所に<?php require_once("");?>を埋め込み、先ほど作成したモジュールテンプレートを読み込んでいます。
このページでは、モジュールテンプレートの他に、「ページ毎の投稿記事の一覧」を表示させたいので、そのプログラムを記述しています。ページ毎とは、例えばトップページの記事一覧の上限を5とした場合、投稿記事が21あれば「5ページ」必要になります。
そして、それぞれのページに適した記事の一覧を表示させなければなりません。
まずはその仕組の部分から説明します。
ページネーション毎の記事表示
初めに、GETでpageの値を受け取っています。
この情報を元に、現在いるページ、表示させる記事、などを決める事が出来ます。
$page には、現在いるページ番号が代入されています。
$now には、現在のページ-1 が代入されています。
$card_max には、1ページで表示させる記事の上限を代入しています。
$card_all には、投稿記事のトータル数が代入されています。
$page_max には、ceil($card_all / $card_max); 、全投稿記事を1ページで表示させる記事の上限で割った数をceil(少数繰り上げ)した数、つまり全ページ数が代入されています。
pageが1の場合、投稿記事が保存されているblogテーブルから、LIMIT $now, $card_max の分だけ記事を選択します。
sqlのLIMITメソッドは、第1引数に開始位置、第2引数に欲しいレコードの数、を入力します。
つまり、この場合だと「blogテーブルの「0」番目から「5つ」の記事を選択する事になります。※LIMITの仕組み上、テーブルの初めのレコードが「0番目」と認識されます。
これがORDER BY code DESCとなっているので、取り出した記事はプライマリkeyの降順に、表示される事になります。
変わって、ページが1でない場合、$now = $now * $card_max; とありますが、これは例えば今2ページ目にいるとすれば、0~5つの記事は反映してはいけません。したがって、$nowには、「4」が入る事になります。
つまり、$now = $now * $card_max; は、ページに合った記事を反映させるため、テーブルから記事を選択する「開始位置」を決めている部分になります。
この仕組みによって、現在いるページが分かれば、ページ毎の記事一覧をうまく表示させる事ができます。
ページネーションの表示
続いてページネーションの表示に入ります。
for文でページの上限分ループさせます。
その中で、$iと$pageを比較し、一致すればリンク無しの$pageを表示させます。これは現在いるページになるためです。
一致しなければ、$iを表示させ、パラメータに$iを乗せたリンクを貼ります。
至って簡単ですね。
表示確認
スタイリング済みにしたいので、cssも乗っけておきます。これをsettingディレクトリにstyle.cssとして保存します。
※cssの説明はいらないと思うので割愛します。
body {
max-width: 1200px;
margin: 0;
margin-left: auto;
margin-right: auto;
}
header {
margin-bottom: 10px;
display: flex;
}
header p {
margin-left:auto;
padding-right: 10px;
font-weight: bold;
}
header h1 {
padding-left: 10px;
}
header, footer {
background: #3cb371;
padding: 5px 0;
}
footer {
text-align: center;
}
h1, h3 {
margin: 0;
}
main {
padding: 0 10px;
word-break: break-all;
}
img.bunimg {
display: block;
margin-left: auto;
margin-right: auto;
}
.pankuzu {
display: initial;
}
.card {
text-decoration: none;
color: black;
}
.card_title {
font-size: 20px;
font-weight: bold;
}
#blog_card {
border: solid 0.5px;
margin: 10px 0 ;
}
#blog_card a {
display: flex;
}
#main_img {
padding: 5px;
}
#main_text {
padding: 5px;
overflow: auto;
}
.catetime {
text-align: right;
padding-right: 10px;
}
.toi input {
width: 60%;
}
.toi2 textarea {
width: 80%;
height: 30vh;
}
.comment textarea {
width: 80%;
height: 30vh;
}
.comment2 {
margin: 10px 0 10px 0;
border-bottom: dotted 0.5px;
}
nav ul {
margin: 0;
padding: 0;
max-height: 0;
overflow: hidden;
transition: 0.5s;
}
nav li {
list-style: none;
padding: 5px;
}
.menuopen {
max-height: 100%;
}
.box {
border: solid 1px;
}
.box2 {
display: none;
}
nav {
padding-top: 40px;
}
.sidemenu {
padding: 10px;
}
nav h3 {
text-align: center;
}
.close {
position: fixed;
top: 0;
bottom: 0;
right: 0;
width: 0;
background: #3cb371;
transition: 0.5s;
z-index: 10;
}
.open {
width: 50%;
padding: 40px 10px 0 10px;
}
#back {
z-index: 5;
}
.black {
position: fixed;
top: 0;
bottom: 0;
right: 0;
left: 0;
background: black;
opacity: 0.8;
}
.pag {
display: flex;
}
.posi {
border: solid 0.5px;
margin: 0 3px;
padding: 5px;
}
.pag2 {
display: flex;
margin: 100px 0 100px 0;
}
.posi2 {
width: 47%;
margin-left: auto;
margin-right: auto;
}
.st {
position: fixed;
bottom: 10px;
left: 10px;
padding: 5px;
background: #3cb371;
visibility: hidden;
opacity: 0;
}
.sm {
position: fixed;
bottom: 10px;
right: 10px;
padding: 5px;
background: #3cb371;
visibility: hidden;
opacity: 0;
}
.look {
animation: anime 3s;
visibility: visible;
animation-fill-mode: forwards;
}
@keyframes anime {
33% {
opacity: 0.3;
}
66% {
opacity: 0.6;
}
100% {
opacity: 1;
}
}
aside {
padding: 0 10px;
}
aside .box {
margin-bottom: 10px;
margin-top: 10px;
padding: 10px;
}
aside img {
width: 150px;
height: auto;
}
.ex textarea {
width: 80%;
height: 100px;
}
.img {
text-align: center;
}
.img img {
border-radius: 100%;
}
.npe {
padding: 10px;
}
@media screen and (min-width: 600px) {
main {
width: 70%;
}
.box2 {
display: block;
}
.box3 {
display: block;
border: solid 1px;
margin-bottom: 10px;
margin-top: 10px;
padding: 10px;
}
aside {
width: 30%;
}
warapper {
display: flex;
}
.list {
display: flex;
}
#scrolltop, #scrollmenu, #target {
display: none;
}
.pag2 {
text-align: center;
}
.box3 ul {
margin: 0;
list-style: none;
}
}
それでは、ここで表示が確認出来るようになっているはずですので、一旦index.phpにアクセスしてみましょう。
すでにCMSでデータベースに各項目を保存していれば、下記のように、データが反映されているはずです。
まだsingle.phpなどを作成していないので、記事の詳細は確認できませんが、ページネーションの移動は可能です。
ちなみに、テーブルの情報を全て消した状態(デフォルト)であれば、下記のような画面になると思います。
この状態からだと、cmsからのデータ反映を1つ1つ確認する事が出来るので、一度試してみるのもいいと思います。
次回は、single.php(投稿記事)のテンプレを作成しようと思います。