/** * 一括新規登録 | 一意フィールド指定型 * * 複数行からなるデータを一括登録する。 * ただし、指定したフィールドの値で重複があれば、その行の登録はしない。 * 重複とは、登録するフィールド値がDB側のフィールドに既に存在する状態のこと。 * * @param array $data recs用のデータ * @param string $unique_field 一意フィールド * @return レスポンス * - dbRes saveAllのレスポンス * - regCnt 登録件数 : 実際に登録したデータの行数 */ public function regUfAtOnce($data,$unique_field){ // データから一意フィールドの列を、一意リストとして抜き出す。 $ul=Hash::extract($data, '{n}.'.$unique_field); // 一意リストから重複調査SQL文を作成および実行し、重複リストを取得する。 $fields=array($unique_field); $conditions=array( array($unique_field => $ul), ); $option=array( 'fields'=>$fields, 'conditions'=>$conditions, ); $overList=$this->find('list',$option); // データから重複リストに該当する行を除去する。(重複分の除去) $data2 = array(); $regCnt=0;//登録行数 if(empty($overList)){ $data2 = $data; $regCnt=count($data); }else{ foreach($data as $ent){ $uv = $ent[$unique_field]; $flg=in_array($uv,$overList); if($flg==false){ $data2[] = $ent; $regCnt++; } } } // DBへ保存する $dbRes=null; if(!empty($data2)){ $this->begin();//トランザクション開始 $dbRes = $this->saveAll($data2);//複数行をまとめて削除 $this->commit(); } $res=array( 'dbRes'=>$dbRes, 'regCnt'=>$regCnt, ); return $res; }
<?php echo Configure::version(); ?>
オリジナルヘルパー
app/View/Helper に配置する。
App::uses('FormHelper', 'View/Helper');
class HogeHelper extends FormHelper {
private $_mdl=""; // モデル名
public function setModelName($modelName){
$this->_mdl = $modelName.'.';
}
public function inputKjId($fields){
echo "<div class='hoge_div'>¥n";
echo $this->input($this->_mdl.'hoge_id', array(
'id' => 'hoge_id',
'value' => $fields['hoge_id'],
'type' => 'text',
'label' => false,
'placeholder' => '-- ID --',
'style'=>'width:100px',
'title'=>'IDによる検索',
));
echo "</div>¥n";
}
}
オリジナルヘルパーの使用設定
コントローラにてオリジナルヘルパーを使用設定する。
class AnimalController extends AppController {
public $name = 'Animal';
public $uses = array('Animal');
/// オリジナルヘルパーの登録
public $helpers = array('Hoge');
...
オリジナルヘルパーの使用例
View内のctpファイルにてオリジナルヘルパーを使用する。
<h2>ネコ</h2>
HelloWorld<br>
<?php
echo $this->Form->create('Animal', array('url' => true ));
$this->Hoge->setModelName('Animal');// モデル名をセット
$this->Hoge->inputKjId($fields);// オリジナルヘルパーを使用する
?>
コントローラ
<?php
App::uses('AppController', 'Controller');
class Test2Controller extends AppController {
public $name = 'Test2';
public $uses=null;
public function change_db(){
$dbName = "hoge_db"; // ← 切り替えるデータベース名
App::uses('DbChg','Model');
$dbChg=ClassRegistry::init('DbChg');
$dbChg->changeDbName($dbName);
$res = $dbChg->query("SELECT * FROM animals");
debug($res);
}
}
モデル
<?php
App::uses('Model', 'Model');
class DbChg extends Model {
public $useTable = false;
// データベース名を指定して、DB変更する。
public function changeDbName($dbName,$DbConfig='default') {
$this->setDataSource($DbConfig);
$db = ConnectionManager::getDataSource($this->useDbConfig);
$db->reconnect(array('database' => $dbName));
}
}
// 更新ユーザーなど共通フィールドをセットする。
protected function setCommonToEntity($ent){
// 更新ユーザーの取得とセット
$update_user = $this->Auth->user('username');
$ent['update_user'] = $update_user;
// ユーザーエージェントの取得とセット
$user_agent = $_SERVER['HTTP_USER_AGENT'];
$user_agent = mb_substr($user_agent,0,255);
$ent['user_agent'] = $user_agent;
// IPアドレスの取得とセット
$ip_addr = $_SERVER["REMOTE_ADDR"];
$ent['ip_addr'] = $ip_addr;
// idが空(新規入力)なら生成日をセットし、空でないなら除去
if(empty($ent['id'])){
$ent['created'] = date('Y-m-d H:i:s');
}else{
unset($ent['created']);
}
// 更新日時は除去(DB側にまかせる)
unset($ent['modified']);
return $ent;
}
$table_name = "big_animals";
$modelName = $this->convTableToModelName($table_name);
debug($table_name);→'BigAnimal'
/**
* テーブル名からモデル名に変換する
*
* @note
* 例 big_animals → BigAnimal
*
* @param string $table_name テーブル名
* @return モデル名
*/
private function convTableToModelName($table_name){
$str = strtr($table_name, '_', ' ');
$str = ucwords($str);
$str = str_replace(' ', '', $str);
$str = mb_substr($str,0,mb_strlen($str)-1);
return $str;
}
$modelName = "BigAnimal";
$table_name = $this->convModelToTableName($modelName);
debug($table_name); // → 'big_animals'
/**
* モデル名からテーブル名に変換する
*
* @note
* 例 BigAnimal → big_animals
*
* @param string $modelName モデル名
* @return テーブル名
*/
private function convModelToTableName($modelName){
$str = preg_replace('/[A-Z]/', '_¥0', $modelName);
$str = strtolower($str).'s';
return ltrim($str, '_');
}
<?php echo $this->html->meta('icon'); ?>
bootstrap.php
CakeLog::config('debug', array(
'engine' => 'FileLog',
'types' => array('notice', 'info', 'debug'),
'file' => 'debug',
'size' => '16MB', // デフォルトは10MB
'rotate' => 10, // デフォルトは10(回)
));
CakeLog::config('error', array(
'engine' => 'FileLog',
'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
'file' => 'error',
'size' => '16MB',
'rotate' => 10,
));
ログファイル