店舗管理用フォームのプラグインを作る その2

今回は前回『店舗管理用フォームのプラグインを作る』の続きです。
前回で表に出す部分をやったので、今回は管理ページ(wp-admin)で使うページを作ります。
興味ない人が多い気がしますが、その際はスルーで。

広告

新しいクラス定義で作っていく

今回のものは自分にとって少しだけ分かりやすいようにファイルを別にします。

require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . "adminlist.php";
$ContactAdmin = new ContactAdmin;

管理ページの処理を書く

ではContactAdminというクラスの関数を書いていきます。

まずは

 function __construct() {
global $wpdb;
$this->table_name = $wpdb->prefix . 'ex_meta';
add_action('admin_menu', array($this, 'adminAddMenu'));
}

function adminAddMenu() {
$page = add_submenu_page("options-general.php", 'Rifromの問合せ', 'Rifromの問合せ', 'edit_themes', 'RifromContactList', array($this,'Rifrom_page'));
add_action( 'admin_print_styles-'.$page,array($this,'Rifrom_post_css'));
}

コレで専用の管理ページを作る。

各処理の分岐

function Rifrom_page() {
if(isset($_GET['RifromContact_id']) && isset($_GET['delete'])){
$this->Rifrom_delete();
}elseif(isset($_GET['RifromContact_id']) && isset($_GET['update'])){
$this->Rifrom_update();
}elseif(isset($_POST['txupdate'])){
$this->Rifrom_txupdate();
}elseif(isset($_GET['RifromContact_id'])){
$this->Rifrom_view();
}else{
$this->Rifrom_list();
}
}

前回同様に各処理の分岐条件。
削除や更新等。

一覧ページ

function Rifrom_list() {
global $wpdb;
$Rifrom_sql="SELECT * FROM ".$this->table_name." order by created desc";
$Rifrom_sql_result = $wpdb->get_results($Rifrom_sql,OBJECT);
echo <<<EOS
<div class="wrap">
<h2>Rifromの問合せリスト</h2>
<div class="RifromContact">
お問い合わせの一覧です。
<table class="wp-list-table widefat ">
<tr>
<th>ID</th>
<th>送信日</th>
<th>状態</th>
<th>お名前</th>
<th>内容</th>
<th>削除</th>
</tr>
EOS;
foreach($Rifrom_sql_result as $key=>$val){
$created = date_format(date_create($val->created), 'Y/m/d H:i');
$href="?page=RifromContactList&RifromContact_id=".$val->id;
$href_d =$href."&delete=1";
$href_cnp =$href."&update=1";
$contents = mb_strimwidth($val->contents, 0, 70, "...","UTF-8");
if($val->status == 0){
$status = "未<a href=\"{$href_cnp}\" class=\"button \">変更</a>";
}elseif($val->status == 1){
$status = date_format(date_create($val->modified), 'Y/m/d').' - 済み';
}
echo <<<EOS
<tr>
<td width=10><a href="{$href}">{$val->id}</a></td>
<td>{$created}</td>
<td>{$status}</td>
<td>{$val->title}</td>
<td>{$contents}</td>
<td ><a href="{$href_d}" class="button ">削除する</a></td>
</tr>
EOS;
}
echo <<<EOS
</table>
</div>
</div>
EOS;
}

一覧ページを作って、そこに削除ボタンや処理済みの更新ボタンを設置。

閲覧ページ

function Rifrom_view() {

global $wpdb;
$Rifrom_sql="SELECT * FROM ".$this->table_name." where id = ".$_GET['RifromContact_id'];
$Rifrom_sql_result = $wpdb->get_results($Rifrom_sql,OBJECT)[0];
echo <<<EOS
<div class="wrap">
<h2>Rifromの問合せの詳細</h2>
<table class="form-table">
EOS;
$val = $Rifrom_sql_result;
$created = date_format(date_create($val->created), 'Y/m/d H:m');
$modified = date_format(date_create($val->modified), 'Y/m/d');
$contents = $val->contents;
echo <<<EOS
<form method="post" action="" class="form-horizontal">
<input type="hidden" name="txupdate" value="1"/>
<tr>
<th>ID:</th><td>{$val->id}</td>
<input type="hidden" name="formid" value="{$val->id}"/>
</tr>
<tr>
<th>送信日:</th><td>{$created}</td>
</tr>
<tr>
<th>最終更新日:</th><td>{$modified}</td>
</tr>
<tr>
<th>お名前:</th><td>{$val->title}</td>
</tr>
<tr>
<th>メールアドレス:</th><td>{$val->mailaddress}</td>
</tr>
<tr>
<th>電話番号:</th><td>{$val->tel}</td>
</tr>
<tr>
<th>内容:</th><td><textarea name="Rifrom_contents" id="i_c" style="width: 100%; height: 200px;">{$contents}</textarea>
<button type="submit" class="btn btn-primary">更新</button></td>
</tr>
</table>
</div>
EOS;
}

閲覧ページではテキストエリアに内容を入れておいて、更新出来るようにしておく。

削除、更新等の処理

function Rifrom_delete() {
global $wpdb;
$Rifrom_sql="DELETE FROM ".$this->table_name." where id = ".$_GET['RifromContact_id'];

$wpdb->query($Rifrom_sql);
$this->Rifrom_list();
}
function Rifrom_update() {
global $wpdb;
$wpdb->update( $this->table_name,
array('status' => 1 , 'modified'=>current_time('mysql')), array('id' => $_GET['RifromContact_id'])
);
$this->Rifrom_list();
}
function Rifrom_txupdate(){
global $wpdb;
$upid = $_POST['formid'];
$contents = $_POST['Rifrom_contents'];
$href = "?page=RifromContactList&RifromContact_id=".$upid;
$hrefliast = "?page=RifromContactList";
$wpdb->update( $this->table_name,
array('contents' => $contents , 'modified'=>current_time('mysql')), array('id' => $upid)
);
echo <<<EOS
<h2>更新しました</h2>
<a href="{$href}" class="button">戻る</a>
<a href="{$hrefliast}" class="button">一覧に戻る</a>
EOS;
}

削除ボタンでデータ削除。
変更ボタンで状態を更新日付きで変更。
テキストエリア下の更新ボタンで内容更新。

cssを設定する

function Rifrom_post_css($headers){
echo <<<EOS
<style type="text/css">
div.RifromContact table th{
background :#999;
color:#eee;
}
</style>
EOS;
}

cssを設定するならこんな感じ。

プリント用ページを設置

前回の関数の中にプリント用のページに飛ぶ部分がありますので、そのページを設置。

if(isset($_POST['Rifrom_title'])){
$Rifrom_title = $_POST['Rifrom_title'];
}

面倒なので全部書かないけど、フォームから受け取ってhtmlを書けば良い。
pdf等に出来れば優秀なんでしょうけどpdf化は面倒そうなのでhtmlで書いてcssで調整したほうが全然早い。

全体の流れを画像で

全体の流れを画像で見るとこんな感じ。

入力フォーム
入力フォーム
チェック画面
チェック画面
印刷ページ
印刷ページ
管理ページ一覧
管理ページ一覧
管理ページ閲覧
管理ページ閲覧

こんな感じの流れです。

テスト用としてテーマのデモページに設置しておきました。
管理ページには入れませんがフォーム等は見れますので宜しければどうぞ。

店舗用管理フォーム テスト

おまけ

せっかくデータベースで管理するようにしたので、普通のお問合せフォームの内容もデータベースに保管すると何かと良いと思います。
ココでは書いてませんが、同じような事をやれば保存は簡単。

過去にプラグイン更新時のエラーでお客様のアドレスが分からなくなってしまってメールを遅れない事がありました。
人間ですから何かミスが起こります。

そのミスが起こった時の為に機械を使ってサポートさせるとより良い結果を残せるかも知れませんね。

ちなみに・・・ もっと良い書き方があるんのでしょうがこんなもんでゴメンなさい。
自分が使う為だけに書いていたので、公開する気も無いので参考程度にどうぞ。

ではでは。

広告

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です