*

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(12)空室管理画面 C

公開日: : 最終更新日:2013/07/06 WordPress ,

空室情報のデータベース処理を一気に終えました。ごちゃごちゃしてきたので、もっとスッキリ書く方法が無いか模索したのですが、私の知識ではこれが精一杯。

こまかい調整は完了後に改めて試してみるということで、今回は先に進みます。

プラグインファイルのメイン部分

大きく3つの処理にわかれました。ひとつは日付や部屋タイプを変更した場合、そして空室を更新する場合と何も処理しない最初の表示となります。form の action に update と change を持たせて if で分岐。値がない場合は最初の表示となります。

wp-contents/plugins/drtehotel/drtehotel.php

//空室管理画面に表示する内容
include_once "class/rooms.php";
$rm = new ROOM();
//日付・部屋タイプ変更
if ($_POST['action']=='change') {
	$rm->rtype = $_POST['rtype'];
	$rm->rdate = $_POST['rdate'];
	$rm->stdRooms = $_POST['stdRooms'];
	$rm->refresh_table($this->table_name, $rm->rdate);
} else if ($_POST['action']=='update') {
	check_admin_referer('example');
	$rm->rtype = $_POST['rtype'];
	$rm->rdate = $_POST['rdate'];
	$rm->stdRooms = $_POST['stdRooms'];
	$rm->comments = '<div id="message" class="updated"><p>更新しました。</p></div>';
	$rm->update_rooms($this->table_name);
	$rm->delete_old($this->table_name);		// 古いデータの削除
} else {
	$rm->check_rdata();
	$rm->refresh_table($this->table_name, $rm->rdate);
}
//画面表示
$rm->load_data($this->table_name);
$rm->show_screen();

rtype プロパティへの割り当てが一回で済むような気もしますが、とりあえず後の課題としておきます。change(部屋タイプや日付の更新処理)の場合に、新しい空室情報のレコードが存在するかどうかをrefresh_table 関数で該当する月のレコードが存在するかどうかの確認処理します。内容は後ほど。

update(空室情報更新処理)の場合は delete_old 関数で古いレコードを削除しています。stdRooms で初期設定の部屋数を持ち歩いているのが気持ち悪いので、これも今後の課題としておきます。

スクリーンショット 2013-07-01 3.51.13

ROOMクラスのデータベース処理

空室更新処理です。テーブル名を引数で渡しているのは、wp_rooms のように頭に自動で追加される接頭辞(プレフィックス)に対応するためにプラグインファイル側で処理しているからです。

wp-contents/plugins/drtehotel/class/rooms.php

function update_rooms($table_name) {
	global $wpdb;
	if ( is_admin() ) {
		$last = intval($_POST['lastday']);
		$month = $_POST['month'];
		for ($i=0; $i<$last; $i++) {
			if( $i<9 )	$dd = "0" . strval($i+1); else $dd = $i + 1;
			$sd = $month . "-" . $dd;
			$rc = 'r_count' . $i;
			$rc = intval(mb_convert_kana($_POST[$rc], "a"));
			$wpdb->query( $wpdb->prepare(
				"UPDATE $table_name SET r_count = %d WHERE
				 r_season = %s AND s_date = %s" ,
					$rc, $this->rtype, $sd ));
		}
	}
}

データベース処理の時は必ず is_admin で権限の確認をするようにしてみました。$_POST[‘lastday’]で最終日、$_POST[‘month’]で 2013-06 という形式の対象となる日付を取得しています。$this->rtype は部屋の種類です。

	
function delete_old($table_name) {
	global $wpdb;
	if ( is_admin() ) {
		$startday = date("Y-m") . "-01";
		$sql = 'DELETE FROM ' . $table_name . ' s_date<"' . $startday . '"';
		$results = $wpdb->query($sql);
	}
}

削除処理は今月の1日以前(つまりもう使用しなデータ)を削除しています。

function refresh_table($table_name, $month) {
	global $wpdb;
	if ( is_admin() ) {
		$yy = mb_substr($month,0,4);		// 年の取り出し
		$mm = mb_substr($month,5,2);		// 月の取り出し
		$startday = $yy . "-" . $mm . "-01";
		$last = date('t', mktime(0,0,0, $mm, 1, $yy));
		$lastday= date('Y-m-t', mktime(0,0,0, $mm, 1, $yy));
		$sql = 'SELECT COUNT(*) FROM ' . $table_name . ' WHERE r_season= "' . $this->rtype
		 . '" AND (s_date>="' . $startday . '" AND s_date<= "' . $lastday . '" )';
		$results = $wpdb->get_var($sql);
		if ($results<20) {
			$sql = 'DELETE FROM ' . $table_name . ' WHERE r_season="' . $this->rtype
			 . '" AND (s_date>="' . $startday . '" AND s_date<= "' . $lastday . '" )';
			$results = $wpdb->query($sql);
			for ($i=0; $i<$last; $i++) {
				if( $i<9 )	$dd = "0" . strval($i+1); else $dd = $i + 1;
				$dd = $yy . "-" . $mm . "-" . $dd;
				$wpdb->query( $wpdb->prepare( 
				"INSERT INTO $table_name ( plan_id, s_date, r_count, r_season ) VALUES ( %s, %s, %d, %s )",
				strval($i+1), $dd, $this->stdRooms, $this->rtype ) );
			}			
		}
	}
}

SELECT COUNT(*)を$wpdb->get_varすることでレコード数を取得しています。レコード数が少ない時はデータが無いと判断して新しいデータを追加します。20件以下の場合はデータレコードが異常と判定し、一度レコードを削除してから新規に追加しています。$this->stdRoomsは初期設定された空き部屋数。

function load_data($table_name) {
	global $wpdb;
	if ( is_admin() ) {
		$yy = mb_substr($this->rdate,0,4);		// 年の取り出し
		$mm = mb_substr($this->rdate,5,2);		// 月の取り出し
		$startday = $yy . "-" . $mm . "-01";
		$lastday= date('Y-m-t', mktime(0,0,0, $mm, 1, $yy));	
		$results = $wpdb->get_results($wpdb->prepare(
			"SELECT * FROM $table_name WHERE r_season=%s AND (s_date>=%s AND s_date<=%s) ORDER BY s_date",
		$this->rtype, $startday, $lastday ));
		//var_dump($results);
		foreach ($results as $row) {
			$this->aki[] = $row->r_count;
		}
	}
}

レコードの読み込み処理です。日付順にORDERして配列に読み込んで置きます。のちほどのHTML生成過程で配列を読み込みながらフォームを表示します。

function create_calendar() {
	$yy = mb_substr($this->rdate,0,4);		// 年の取り出し
	$mm = mb_substr($this->rdate,5,2);		// 月の取り出し
	$last = date('t', mktime(0,0,0, $mm, 1, $yy));		// 末日
	$week = array( '日', '月', '火', '水', '木', '金', '土' );
	
	$tmp = "";
	for ($i=0; $i<$last; $i++) {
		if( $i<9 )	$dd = "0" . strval($i+1);
		else $dd = $i + 1;
		$youbi = date('w', mktime(0,0,0, $mm, $dd, $yy));
		$tmp .= '<tr>';
		$tmp .= '<td>' . $yy . "年" . $mm . "月" . $dd . "日</td>";
		if( $youbi==0 )	$tmp .= '<td class="sun">' . $week[$youbi] . "曜日</td>";
		else if( $youbi==6 )	$tmp .= '<td class="sat">' . $week[$youbi] . "曜日</td>";
		else $tmp .= '<td class="week">' . $week[$youbi] . "曜日</td>";
		$tmp .= '<td>'. $this->rtype . '</td>';
		$tmp .= '<td>';
		$tmp .= '<input type="text" name="r_count' . $i . '" value="' . $this->aki[$i] . '">';
		$tmp .= '<input type="hidden" name="s_date' . $i . '" value="' . $yy . '-' . $mm . '-' . $dd . '" />';
		$tmp .= '</td>';
		$tmp .= '</tr>';
	}
	$tmp .= '<input type="hidden" name="lastday" value="' . $last . '" />';
	$tmp .= '<input type="hidden" name="month" value="' . $yy . '-' . $mm . '" />';
	return $tmp;
}

HTML 生成部分。特に難しいところは無いような気がします。

今回はちょと長かったなぁ


Sponsored Link


 
 

関連記事

WordPressのプラグイン開発を効率的にするフレームワークたち

Wordpressでプラグインを作っていて「フレームワーク使えないのかな?」と疑問を持ちました。そこ

記事を読む

新バーチャル歌姫デビュー CeVIO Creative Studio は期待して良さそう

既にサンプル曲がガンガンアップされています。噂の歌声合成ソフト CeVIO Creative Stu

記事を読む

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(1)

初心者が、あらためて WordPress のプラグインを一から作る経過報告。たぶん連載記事ですね。途

記事を読む

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(7)セキュリティ対策

ここでセキュリティ対策についてまとめて復習してみます。ネットを検索すると、さまざまな対策が紹介されて

記事を読む

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(2)

前回の物を若干変更しながら、どんどん進んでいきたいと思います。今回は管理画面の表示内容について行って

記事を読む

ご質問は掲示板へお願いいたします。

Message

メールアドレスが公開されることはありません。

CAPTCHA


Optionally add an image (JPEG only)

Sponsored Link

気になる情報・新製品発見メモ

日頃ネットをウロウロしていて記事にするほどでもない情報、記事にするほど

録音ミニスタジオ完成の図と12色のリモコンLED電球

構想10年・制作3日の自宅音声収録スタジオの完成です。 ご覧の通

録音(撮影)ミニスタジオの制作DIY

そんな訳で吸音スポンジを壁に取り付けてみた続きです。 調子に乗っ

YAMAHA MG10UXミキサー到着

2018年 物置(事務所or作業場or遊び部屋)の一角を音声収録&撮影

そしてzbrush coreをインストールしてみる話

Blenderに挫折してから一気に3Dにのめり込んでいます。 ま

録音環境を改善する!吸音パネルをDIYとか

久々に更新! すっかり更新グセが抜けてしまい、イマイチやる気が出

→もっと見る




  •  

PAGE TOP ↑