CakePHP1.3.6:データを追加する。

前回のプログラムに、データの追加機能を追加する。初期画面は以下。

画面左下に、「登録」のリンクを張って、そこをクリックすると、以下の画面に遷移する。

また、いくつかのフィールドにバリデーション(Not empty)を実装して、エラーの場合、以下のように表示し、エラーがない場合にはデータを登録して、初期画面に遷移する。

コントローラーの作成

/add/controllersのcustomers_controller.phpにaddメソッド(アクション)を追加する。
addアクションには、

  • 入力初期画面(入力を促す画面)の表示
  • 入力後の登録処理

の2つのパターンで遷移してくるので、入力値の有無によって以下のように実装する。

<?php

class CustomersController extends AppController{
	public $name = 'Customers';
	public $layout = 'myznala';

	/**
	 * 
	 * 初期画面(一覧表示)
	 */
	function index(){
		$this->set('title_for_layout', "顧客の一覧");
		$req=null;
		if(!empty($this->data)){
			require_once '../vendors/MyConverter.class.php';
			$req = MyConverter::getRequestParams($this->data["Customer"]);
			$result = $this->Customer->find('all',	
							array('conditions' => array('Customer.name like ?' => array("%{$req["name"]}%"))));
			}else{
			$result = $this->Customer->find('all');
		}
		
		$this->set('result',$result);
	}
	
	/**
	 * 
	 * データの追加
	 */
	function add(){
		$this->set('title_for_layout', "顧客の登録");
		if(!empty($this->data)){
			$this->Customer->save($this->data);
			if($this->Customer->validates()){
				$this->redirect('.');
			}
		}
	}
		
}
?>

ビューの作成

index.ctp

初期の一覧画面は以下のように実装する。

名前で絞り込みをします。
<?php 
echo $form->create(null,array('type'=>'post','action'=>'.'));
echo $form->text('Customer.name', array('size' => 10));
echo $form->end('送信');
?>

<table>
<tr>
	<th>ID</th>
	<th>名前</th>
	<th>郵便番号</th>
	<th>住所</th>
	<th>電話</th>
	<th>携帯</th>
	<th>メール</th>
	<th>更新日</th>
</tr>
<?php 
	foreach ($result as $arr){
		echo '<tr>';
		echo "<td>{$arr['Customer']['id']}</td>";
		echo "<td>{$arr['Customer']['name']}</td>";
		echo "<td>{$arr['Customer']['zip']}</td>";
		echo "<td>{$arr['Customer']['address']}</td>";
		echo "<td>{$arr['Customer']['tel']}</td>";
		echo "<td>{$arr['Customer']['mobile']}</td>";
		echo "<td>{$arr['Customer']['mail']}</td>";
		echo "<td>{$arr['Customer']['timestamp']}</td>";
		echo '</tr>';
	}
?>
</table>

<a href="add">登録</a>

add.ctp

データ登録用の画面は以下。入力フィールドの後ろに、エラー出力を付加する。ちょっとごちゃごちゃしているのが気に入らないなぁ。

<?php 
echo $form->create(null,array('type'=>'post','action'=>'add'));
?>

<table>

<?php 
echo "<tr><th>名前</th>";
echo "<td>{$form->text('Customer.name',array('size'=>'20'))}{$form->error('Customer.name')} </td>";
echo "</tr>";
echo "<tr><th>郵便番号</th>";
echo "<td>{$form->text('Customer.zip',array('size'=>'10'))}{$form->error('Customer.zip')}</td>";
echo "</tr>";
echo "<tr><th>住所</th>";
echo "<td>{$form->text('Customer.address',array('size'=>'20'))}{$form->error('Customer.address')}</td>";
echo "</tr>";
echo "<tr><th>電話</th>";
echo "<td>{$form->text('Customer.tel',array('size'=>'15'))}{$form->error('Customer.tel')}</td>";
echo "</tr>";
echo "<tr><th>携帯</th>";
echo "<td>{$form->text('Customer.mobile',array('size'=>'15'))}</td>";
echo "</tr>";
echo "<tr><th>メール</th>";
echo "<td>{$form->text('Customer.mail',array('size'=>'40'))}{$form->error('Customer.mail')}</td>";
echo "</tr>";
echo "<tr><th>メモ</th>";
echo "<td>{$form->textarea('Customer.memo')}</td>";
echo "</tr>";
echo $form->end('送信');
?>
</table>
<a href=".">リストに戻る</a>

モデルの作成

/app/modelsのcustomer.phpは以下。

<?php 

class Customer extends AppModel {
	public $name = 'Customer';	
	
	public $validate = array(
				'name'=>array(
					'rule' => 'notEmpty',
					'message' =>'入力してください'),
				'zip'=>array(
					'rule' => 'notEmpty',
					'message' =>'入力してください'),
				'address'=>array(
					'rule' => 'notEmpty',
					'message' =>'入力してください'),
				'tel'=>array(
					'rule' => 'notEmpty',
					'message' =>'入力してください'),
				'zip'=>array(
					'rule' => 'notEmpty',
					'message' =>'入力してください'),
				'mail'=>array(
					'rule' => 'notEmpty',
					'message' =>'入力してください')
	);
}

?>

この例では、mobile(携帯の入力フィールド)にnotEmptyを設定していない。これに対して、テーブルはnot nullを設定してある。
携帯の入力フィールドに何も入力しなくても、例外が発生することなくデータが登録される。(最初の画像の3行目) 注意が必要。