【Zend Framework】【PHP】【JS】順番・順序などを設定するページを作成するには...

Yahooブログの書庫設定の表示順序みたいなものを作る

ポイント

 * SELECTタグは、「<select ・・・・ name="selectOptions[]" multiple>」のようにし、保存する際には、JavaScriptなどを利用し、全選択し、全てのデータ受け渡すようにする(selectAllOptions()に着目)
http://oshiete.goo.ne.jp/qa/3520778.html
 * 順番・順序を保存するテーブルを用意しておく

サンプル

order.php

<html>
<head>
<script type="text/javascript">
function selectAllOptions() {
	var select = document.getElementById('slct');
	
	for (var i = 0; i < select.options.length; i++) {
		select.options[i].selected = true;
	}
}

function buttonStyle(select) {
	var UpButton = document.getElementById('UPBUTTON');
	var DownButton = document.getElementById('DOWNBUTTON');
	for (var i = 0; i < select.options.length; i++) {
		if (select.options[i].selected) {
			if(i != 0) {
				UpButton.disabled = false;
			} else {
				UpButton.disabled = true;
			}
			
			if(i != (select.options.length - 1)) {
				DownButton.disabled = false;
			} else {
				DownButton.disabled = true;
			}
		}
	}
}

function optionMove(mode) {
	var select = document.getElementById('slct');
	for (var i = 0; i < select.options.length; i++) {
		if (select.options[i].selected) {
			break;
		}
	}
	
	var tmpOption = select.removeChild(select.options[i]);
	select.insertBefore(tmpOption, select.options[i + mode]);
	
	buttonStyle(select);
}
</script>
</head>
<body>
<h1>【順番】</h1>
<form name="frm" method="post" action="./editOrder.php">
<input type="button" value="上" id="UPBUTTON" disabled onclick="optionMove(-1)">
<input type="button" value="下" id="DOWNBUTTON" disabled onclick="optionMove(1)">
<input type="submit" value="保存" onclick="selectAllOptions()">
<select size="100" onchange="buttonStyle(this)" id="slct" name="selectOptions[]" multiple>
<?php
try {

require_once 'Zend/Db.php';
require_once 'Zend/Config/Ini.php';

$config = new Zend_Config_Ini('./config/db_info.ini', 'order_db');
$db = Zend_Db::factory($config->db);

$select = $db->select();
$select->from("blogCategory");
$select->join("order", "blog.id = order.blogId", "*");
$select->order('order.order');

$rows = $db->fetchAll($select);

// 文字化け対策
mb_language("Japanese");
mb_internal_encoding("UTF8");
mb_detect_order("ASCII, UTF-8, JIS, EUC-JP, SJIS");

foreach ($rows as $row) {
	// 値取得
	$blogId = $row["id"];
	$titleCategory = $row["titleCategory"];
	
	echo "<option value='" . $blogId . "'>" . $titleCategory . "</option>\n";
}

} catch (Zend_Exception $e) {
	echo nl2br($e);
	exit();
}

?>
</select>
</form>
</div>
</body>
</html>

editOrder.php

<?php
require_once 'Zend/Db.php';
require_once 'Zend/Config/Ini.php';

$config = new Zend_Config_Ini('./config/db_info.ini', 'order_db');
$db = Zend_Db::factory($config->db);

try {
// テーブルを一旦クリア
$db->beginTransaction();
$result = $db->delete("blogCategory");

// 文字化け対策
mb_language("Japanese");
mb_internal_encoding("UTF8");
mb_detect_order("ASCII, UTF-8, JIS, EUC-JP, SJIS");

$options = $_POST["options"];
$order = 1;

foreach ($selectOptions as $selectOption) {
	// 追加するデータ
	$params = array (
		'blogId' => $options,
		'order' => $order,
	);
	
	$result = $db->insert("blogCategory", $params);
	
	$order++;
}

$db->commit();
header("LOCATION:order.php");

} catch (Zend_Exception $e) {
	$db->rollBack();
	echo nl2br($e);
	exit();
}

?>