<?php
/**
*-----------------------------------------------------------------------------
* list DAO class
*-----------------------------------------------------------------------------
* 2014-09-01 initial version by ushizawa
*
* 一覧を扱うDAO
*/
class list_dao extends DAO {
var $tablename = "";
var $idname = "";
var $where_arr = array();
var $pageing_str = "";
/**
* (non-PHPdoc)
* @see DAO::search_query()
* search_queryのオーバーライド。不適切なSQLだったら、SQL文を表示して終了。
*/
function search_query($sql){
//echoblue($sql);
$con = parent::search_query($sql);
//echored($sql);
if(empty($con->mtst)) {
echo mysql_errno($con->dbid) . ": " . mysql_error($con->dbid) . "<br /><br />" . $sql ."<br />";
exit;
}
return $con;
}
/**
* 一覧を取得する
* @param string $cols
* @param string $tablename
* @param array $where_arr
* @param int $limit
* @return array
* ☆★$tablename JOIN等で参照しているばあい、hasFieldでは判定できない!
* 削除フラグ=0のなどの指定が必要な場合、別途指定の必要がある。
*/
function getList($cols, $tablename, $where_str="", $order_str="", $limit=30) {
// SQL
$sql = "SELECT * FROM (SELECT ". $cols ." FROM " . $tablename.")t" ;
///////////////////////////////////////////////
// WHERE
///////////////////////////////////////////////
// POSTされた検索値をセット!!
$this->setSearchWhere($tablename);
if(!empty($this->where_arr)){
if(empty($where_str)){
$where_str .= implode(" AND ", $this->where_arr);
} else {
$where_str .= " AND ".implode(" AND ", $this->where_arr);
}
}
if(!empty($where_str)){
$sql .= " WHERE ".$where_str;
}
///////////////////////////////////////////////
// 全件数を取得する
///////////////////////////////////////////////
$total_rec = parent::query($sql);
///////////////////////////////////////////////
// 並び
///////////////////////////////////////////////
if(!empty($order_str)) $sql .= " ORDER BY ".$order_str;
///////////////////////////////////////////////
// LIMIT
///////////////////////////////////////////////
if(!empty($_REQUEST['c_page'])) {
$current_page = $_REQUEST['c_page'];
$offset = ($current_page-1) * $limit;
} else {
$current_page = 1;
$offset = 0;
}
$sql .= " LIMIT ".$offset.",".$limit;
///////////////////////////////////////////////
// ページ情報・ページングHTMLタグをセット
///////////////////////////////////////////////
$this->page_str = $this->_createPaging($total_rec, $limit);
$this->page_str .= "<span class=red>" . number_format($total_rec) . "件</span> 該当しました。\n"; // 件数
$this->page_str .= $current_page . "/" . ceil($total_rec/$limit) . "ページ";
///////////////////////////////////////////////
// 結果を取得する
///////////////////////////////////////////////
$con = $this->search_query($sql);
$result = array();
for ($i = 0; $i < $con->numrows(); $i++) {
$result[] = $con->fetch();
}
return $result;
}
/**
* 検索条件をセットする
* @param array $postdata
*/
function setSearchWhere($tablename) {
if(empty($_POST)) return ;
// テーブルのカラムを取得
// $fields = parent::getFields($tablename);
foreach($_POST as $key=>$val){
if(substr($key,0,7)=="search_"){
if($key=="search_limit") continue;
// キー名
$tmp_key = str_replace("search_", "", $key);
// カラムにない項目だったらスルー
// if(!array_key_exists($tmp_key, $fields)) continue;
if(!empty($val)){
// 検索値が配列のばあい!!
//if(is_array($postdata[$key])){
if(is_array($val)){
$tmp_array = array();
foreach($val as $v){
$tmp_array[] = $tmp_key. " like '%".mb_convert_encoding($v, "EUC-JP", "UTF-8")."%'";
}
$this->where_arr[] = "(".implode(" OR ", $tmp_array).")";
} else if(strcasecmp($val, "")!=0){
$this->where_arr[] = $tmp_key . " like '%".mb_convert_encoding($val, "EUC-JP", "UTF-8")."%'";
}
}
}//
}
}
/**
* 一覧の検索ボタンを返す
* @return string $tag
*/
function getSearchBtn() {
$tag = "<input type=\"submit\" value=\"この条件で検索する\"> \n".
"<input type=\"button\" value=\"条件をクリア\" onClick=\"setReset(this.form);return false;\">\n";
return $tag;
}
/**
* 一覧のCSVボタンを返す
* @param $frm_name
* @return string $tag
*/
function getCsvBtn($frm_name="") {
if(empty($frm_name)) $frm_name = "frm";
$js = "$('export_flg').value=1; ";
$js .= "if($('back_flg')) $('back_flg').value=1; document.{$frm_name}.submit(); ";
$js .= "$('export_flg').value='';";
$tag = "<div><input type=\"hidden\" name=\"export_flg\" id=\"export_flg\">\n".
"<input type=\"button\" value=\"csvダウンロード\" onClick=\"{$js}\"></div>\n";
return $tag;
}
/**
* ページングの作成
* $current_page 現在のページ
* $total_rec 総レコード数
* $limit 1ページに表示するレコード
*/
function _createPaging($total_rec, $limit=10) {
$pager = "";
$current_page = (!empty($_REQUEST['c_page'])) ? $_REQUEST['c_page'] : 1;
$start = ($current_page - 1) * $limit;
$end = $start + $limit;
//echored($total_rec."--".$limit);
$total_page = ceil($total_rec / $limit); //総ページ数
$show_nav = 5; //表示するナビゲーションの数
//全てのページ数が表示するページ数より小さい場合、総ページを表示する数にする
if ($total_page < $show_nav) {
$show_nav = $total_page;
}
//トータルページ数が2以下か、現在のページが総ページより大きい場合表示しない
if ($total_page <= 1 || $total_page < $current_page ) return $pager;
//総ページの半分
$show_navh = floor($show_nav / 2);
//現在のページをナビゲーションの中心にする
$loop_start = $current_page - $show_navh;
$loop_end = $current_page + $show_navh;
//現在のページが両端だったら端にくるようにする
if ($loop_start <= 0) {
$loop_start = 1;
$loop_end = $show_nav;
}
if ($loop_end > $total_page) {
$loop_start = $total_page - $show_nav +1;
$loop_end = $total_page;
}
※ これ以下エラーになるので貼付けられなかった