*

ペンション・民宿・プチホテル用 宿泊予約 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 プラグインを作る(1)

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

記事を読む

WordPress用プラグインで使う宿泊予約用カレンダーをPHPで書くぜ

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作るシリーズで使う、空き部

記事を読む

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

前回までで基本的なプラグインの制作方法を簡単に学びました。今回からは空室管理の画面を作ってみます。柔

記事を読む

ワードプレス用宿泊予約プラグイン開発「空室カレンダー表示」

前回ネットで検索して見つけた calendar($year = "", $month = "") 関

記事を読む

ワードプレス用宿泊予約プラグイン開発「空室情報読み込み」

前回までに作ったカレンダーに空室状況を表示させます。最初に表示欄を作って確認してからデータベースの読

記事を読む

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

Message

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

CAPTCHA


Optionally add an image (JPEG only)

Sponsored Link

エレコム GRAPH GEAR NEO カメラバッグDGB-P01BKにジンバルを入れる

やっぱり高いけどEndurance (エンデュランス) カメラバッグの

エレコム GRAPH GEAR NEO カメラバッグDGB-P01BKが北の国から

一年中GWの美少女です。 Lowepro カメラリュック フリッ

MOZA Mini-S スマホ用スタビライザーが届いた!

1万円弱で買えるスマホ用ブラシレスジンバルの新型 MOZA Mini-

GoPro Hero7 Black用 保護ケース アルミ合金保護フレームがいいよって話

別に大した話ではありません。 最近書くことが少ないのでたまには書

期待の新製品 MOZA Mini-S スマホ用スタビライザーが発売されたみたい

教えてもらった新製品のホームページで MOZA Mini-Sが紹介され

→もっと見る




  •  

PAGE TOP ↑