*

ペンション・民宿・プチホテル用 宿泊予約 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でプラグインを作っていて「フレームワーク使えないのかな?」と疑問を持ちました。そこ

記事を読む

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(5)メニュー階層化

今回はオリジナルプラグインの管理画面でのメニュー作成について。かなりすんなりと出来てしまったので短め

記事を読む

ペンション・民宿・プチホテル用 宿泊予約 WordPress プラグインを作る(6)初期設定画面

ここまでで、ひと通りの仕組みというか流れは理解できたような気がします。まずは初期設定画面から制作して

記事を読む

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

空室管理画面の2回目。今回は空室状況の入力欄と月が変わった時の処理を加えてみます。今回は一覧表示なの

記事を読む

WordPressのプラグインで独自のページを作る方法がわからない

Wordpressのプラグインを開発していて疑問がでてきました。プラグイン独自のページはどうすればい

記事を読む

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

Message

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

CAPTCHA


Optionally add an image (JPEG only)

Sponsored Link

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

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

【開封】SmallRig Drop-In Baseplate (Manfrotto 501PL QR Plate Compatible) 2006

引き続き SmallRig Universal Shoulder Pa

【開封】SmallRig Universal Shoulder Pad 2057

最初にお断りしておきますが、いわゆる「単なる開封」記事です。予めご了承

【雑談】URSA mini の設定確認とか安物時計を貰った話

寒くなってきましたがスッキリ晴れ渡る日曜日。久しぶりに予定もなくノビノ

URSA mini & Filmconvert アップデート祭り

いつものように雑談更新。今更お断りすることも無いとは思いますが、今回も

SONY α6300 24p 30p 60p 120pで画質比較

世間では黒金とか言うケシカラン状況になっています。 浮かれポンチ

→もっと見る




  •  

PAGE TOP ↑