masimaro blog

menu

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

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


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(投稿記事)のテンプレを作成しようと思います。

コメントを残す

お名前

コメント



コメント一覧

コメントはまだありません
MENU