自作CMSの作り方#12 管理者ページをつくる。その4
こんにちは。suipediaです。
前回は管理者ページでテーブルデータの登録処理を行いました。ちょっと大変だったかもしれませんね。でも、これでphpMyAdminを開かずにブラウザからデータベースにデータを登録する術を得ました。
あとは更新、削除処理を実装すれば管理者ページの基本的なところは抑えたことになります。
その後に待ち構えるのが記事の作成ですね。CMSの中で最も重要な部分です。
では、今回は前回に引き続き更新の処理を実装しましょう。前回紹介した処理を今回も利用する箇所があるので、ボリュームとしては抑えられると思います。
では、参りましょう!
カテゴリの更新用ファイルを用意する
今回もカテゴリテーブルを対象に説明していきますね。
前回始めにcreateというフォルダを追加してもらいました。
ここにさらにupdateというフォルダを追加しましょう。
そしてupdateフォルダの中に以下のファイルを追加してください。
はい、えーっとですね。今実装しようとしているのは・・・
赤枠で囲んだ「更新」リンクをクリックした先の画面及び処理です。
先ほどのc.phpを追加した状態で、いずれかの更新リンクを押下してみてください。ここでね・・・
こういうエラーの表示になるんですが、「あれれ。おかしいぞ;つД`)」と思ってほしいんです。以前ならc.phpファイルを追加したことでbody.phpの9行目を原因とするエラーはなくなっていました。
しかし、今回はまだこのエラーがなくなっていない・・・。
これはですね。body.phpの9行目でしているのは、アクセスされたURL+c.phpファイルをインクルードする、という処理です。
だから、#11のhttp://localhost/admin/category/create/にアクセスされた例であればC:\xampp\htdocs\cms\admin\category\create\c.phpを表示していればOKでした。
しかし、今回はアクセスされたURLがhttp://localhost/admin/category/update/?category_id=1なので、body.phpの9行目はC:\xampp\htdocs\cms\admin\category\update\?category_id=1c.phpを表示しようとします。
でも「?category_id=1c.php」なんてファイルは存在しないので、(というかそもそもフォルダ、ファイル名に「?」は使用できない)エラーになっています。
なので、今回はbody.phpの方に手を加えてやる必要があります。
今、body.phpの9行目は・・・
include_once(getRoot().getRequestURL()."c.php");
このようになっているでしょう。この1行を
include_once(getRoot().$page["url"]."c.php");
に置き換えてください。
これによりインクルード対象となるc.phpのファイルパスは
C:\xampp\htdocs\cms\admin\category\update\?category_id=1c.php
から
C:\xampp\htdocs\cms\admin\category\update\c.php
に変わりました。
getRequestURL()のときはブラウザのURLバーに表示されている文字列を採用していたのですが、$page["url"]とすることでデータベースに保存しているパスを採用しています。
ここの処理はURLの「?」に続くパラメータ部分を取り除く、という方法でもいいのですが、できるだけデータベースに保持している情報をもとに表示するという方針なので余計なことはしないようにしています。
で、ですね。これで更新リンクの先の画面をリロードすると・・・
エラー内容が変わりました。先ほど配置いただいたファイルの1行目でインクルード対象のファイルが見つからない、と言われています。
エラーには変わりないのでスッキリしませんが、実装の流れとしては正解です(・∀・)
そして、ここでですね・・・。えー・・・ゴホン・・・(。-`ω-)
私、謝らないといけないことがあります。
getContentsSelectItemsQuery()のURL部分を修正
いや、大したことではないんです。今の状態でトップページに戻っていただけますか。トップページにはブラウザ左上のサイトタイトルをクリックしてください。
・・・。
にゃにゃにゃんと・・・!!(=*´Д`=)エラーになっちゃいました・・・。
これは先ほどの修正で、トップページの時にデータベースからURLの取得に失敗するようになったからです。
でですね、次の修正をお願いします。
function.phpにgetContentsSelectItemsQuery()という関数があるでしょう。
これです。赤線部分がポイントです。
まず、なぜエラーが起きたかと言いますと、このurlを返してくれる部分、カテゴリテーブルのURLとかコンテンツテーブルのURLを連結していますが、片方がNULLの場合、もう片方もNULLの扱いになっちゃうんですね。
その証拠に、以下のクエリをphpMyAdminから実行してみてください。
SELECT contents.category_id category_id,
contents.contents_id contents_id,
category.name category_name,
contents.name contents_name,
contents.name name,
category.url category_url,
contents.url contents_url,
CONCAT(category.url , contents.url) AS url,
contents.create_date,
contents.update_date,
contents.disabled_flg
FROM org_category category left outer join
org_contents contents on category.category_id = contents.category_id
WHERE CONCAT(IFNULL(category.url, ""), IFNULL(contents.url, "")) LIKE '/'
これはトップページにアクセスしたときにgetPageInformation()関数で組み立てられるクエリです。
結果は
URLがNULLになってます。赤枠で囲みました。
ここを、たとえコンテンツのURLがNULLだったとしてもちゃんと出力されるようにします。
getContentsSelectItemsQuery()の以下の部分を
CONCAT(category.url , contents.url) AS url,
以下に置き換えてください。
CONCAT(IFNULL(category.url, \"\"), IFNULL(contents.url, \"\"))AS url,
これはNULLだったら空文字に置き換える、という処理をしています。
あとついでにもうひとつ・・・1行目が
return "contents.category_id category_id,
こうなってると思いますが、
return "category.category_id category_id,
このように直してください。凡ミスの修正です。
これでトップページをリロード!
はいキタ━━━━(゚∀゚)━━━━!!戻ってまいりました。
$page["url"]のところでちゃんと「/」が取得出来ていることを示しています。
ではでは次へ・・・(>_<)
entity_update.phpを配置し、必要な関数を追加する
先ほど渡したc.phpファイルの中身は
<?php include_once(getRoot()."/src/parts/entity_update.php"); ?>
この1行だけでした。そしてこのentity_update.phpファイルが見つからないよ!というエラーが出ていることの確認まではしました。
では、上記ファイルを置いてあげましょう。置く場所は・・・
ここです。では以下のファイルをダウンロードして置いてください。
この記事が気に入ったらチップで応援してみませんか?