WebプログラミングV

 目次へ 前へ 次へ

2016/2/1 久米

VCakePHP

6. アプリケーション作成その1

 

6.1 猫掲示板 -バリデーション(入力値のチェック)-

バリデーション by CakePHP3 CookBook

テーブル名:neko_chans

  ファイル コード例 備考
C src>Controller>
NekoChansController.php
<?php
namespace App\Controller;

use App\Controller\AppController;

class NekoChansController extends AppController{

    public function index(){
	$nekoChans = $this->NekoChans->find();
	$this->set('nekoChans', $nekoChans);
    }

    public function add(){
	$nekoChan = $this->NekoChans->newEntity();
	$this->set('nekoChan', $nekoChan);
	if($this->request->is('post')){
	    $nekoChan = $this->NekoChans->patchEntity($nekoChan, $this->request->data);
	    if($this->NekoChans->save($nekoChan)){
		return $this->redirect(['action'=>'index']);
	    }
	}
    }

}
 
M src>Model>Table>
NekoChansTable.php
<?php

namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\Validation\Validator;

class NekoChansTable extends Table{

    public function validationDefault(Validator $validator){

	$validator
	    ->notEmpty('name', '名前を記入してください。')
		
	    ->allowEmpty('tokugi')
	    ->add('tokugi', 'maxLen', 
		['rule'=>['maxLength', 20], 
		 'message'=>'20字以内で入力してください。'])
		
	    ->add('age', 'valid', 
		['rule'=>'numeric', 
		 'message'=>'数字で入力してください。'])
	    ->notEmpty('age', '数字で入力してください。');

	return $validator;
    }

}
 
V
その1
src>Template>NekoChans>
index.ctp
前ページのindex.ctpと同じ  
V
その2
src>Template>NekoChans>
add.ctp
<div>
<h3>猫ちゃんず追加</h3>
<?= $this->Form->create($nekoChan, ['novalidate' => true]) ?>
<fieldset>
    <?php
    echo $this->Form->input('name', ['label'=>'名前']);
    echo $this->Form->input('tokugi', ['label'=>'特技']);
    echo $this->Form->input('age', ['label'=>'年齢']);
    ?>
</fieldset>
<?= $this->Form->button('追加') ?>
<?= $this->Form->end() ?>
</div>
create($nekoChan
を入れることにより
バリデーション発動

'novalidate' => true

はブラウザでのチェックを排除
  アクセス http://localhost/web3/caketest/neko-chans/add  

 

バリデーションいろいろ

書式      
$validator->allowEmpty(列名 ); 空の値OK    
$validator->notEmpty(列名 ); 空の値NG エラー    
$validator->add いろいろある    

addによるバリデーション

$validator->add(列名 , ルール名 , ルール );

ルール 意味    
['rule' => ['numeric']] 数字でないとエラー    
['rule' => ['maxLength', 20]] 最大文字数20字    
['rule' => ['email']] @のメール形式でないとエラー    
['rule' => ['compareWith', 'password']] passwordの値と一致しないとエラー    

 

6.2 猫LINE -ページ割り-

ページネーション PaginatorHelper by CakePHP3 CookBook

テーブル名:neko_lines

  ファイル コード例 備考
C src>Controller>
NekoLinesController.php
<?php

namespace App\Controller;

use App\Controller\AppController;

class NekoLinesController extends AppController{

    public $paginate = [
	'limit'=>5,
	'order'=>[
	    'NekoLines.id'=>'desc'
	]
    ];

    public function initialize(){
	parent::initialize();
	$this->loadComponent('Paginator');
    }

    public function index(){
	$this->set('nekoLines', $this->paginate());
    }

}
 
M src>Model>Table>
NekoLinesTable.php
 
 
V src>Template>NekoLines>
index.ctp
<h1>猫LINE</h1>
<table>
<tr><th>id</th><th>メッセージ</th></tr>
<?php foreach($nekoLines as $nekoLine): ?>
    <tr>
    <td><?= $nekoLine->id ?></td>
    <td><?= h($nekoLine->msg) ?></td>
    </tr>
<?php endforeach; ?>
</table>
<div class="paginator">
    <ul class="pagination">
        <?= $this->Paginator->prev('< ' . __('previous')) ?>
        <?= $this->Paginator->numbers() ?>
        <?= $this->Paginator->next(__('next') . ' >') ?>
    </ul>
    <p><?= $this->Paginator->counter() ?></p>
</div>
 
V webroot>css>
cake.css
.paginator {
    text-align: center;
}

.paginator ul.pagination li {
    float: none;
    display: inline-block;
}

.paginator p {
    text-align: right;
    color: rgba(0, 0 ,0 , 0.54);
}
paginatorクラスの
cssを使用する
 
デフォルトのままなら
いじらなくてよい
  アクセス http://localhost/web3/caketest/neko-lines/  


 

もうひとつの方法。若干面倒。

  ファイル コード例 備考
C src>Controller>
NekoLinesController.php
<?php

namespace App\Controller;

use App\Controller\AppController;

class NekoLinesController extends AppController{

    public $paginate = [
	'limit'=>5,
	'order'=>[
	    'NekoLines.id'=>'desc'
	]
    ];
    public $helpers = [
	'Paginator'=>['templates'=> 'paginator-templates']
    ];

    public function initialize(){
	parent::initialize();
	$this->loadComponent('Paginator');
    }

    public function index(){
	$this->set('nekoLines', $this->paginate());
    }

}
 
M src>Model>Table>
NekoLinesTable.php
 
 
V src>Template>NekoLines>
index.ctp
<h1>猫LINE</h1>
<?= $this->Paginator->first('最初') ?>
<?= $this->Paginator->prev('<前へ') ?>
<?= $this->Paginator->numbers() ?>
<?= $this->Paginator->next('次へ>') ?>
<?= $this->Paginator->last('最後') ?>
<table>
<tr><th>id</th><th>メッセージ</th></tr>
<?php foreach($nekoLines as $nekoLine): ?>
    <tr>
    <td><?= $nekoLine->id ?></td>
    <td><?= h($nekoLine->msg) ?></td>
    </tr>
<?php endforeach; ?>
</table>
 
V config>
paginator-templates.php
<?php
return [
    'prevActive' => '<span class="prev"><a rel="prev" href="{{url}}">{{text}}</a></span> | ',
    'prevDisabled' => '',
    'nextActive' => '<span class="next"><a rel="next" href="{{url}}">{{text}}</a></span> | ',
    'nextDisabled' => '',
    'first' => '<span class="first"><a rel="first" href="{{url}}">{{text}}</a></span> | ',
    'last' => '<span class="last"><a rel="last" href="{{url}}">{{text}}</a></span>',
    'number' => '<span><a href="{{url}}">{{text}}</a></span> | ',
    'current' => '<span class="current">{{text}}</span> | ',
];
デフォルトのPagenatorの
表示法はリスト形式なので
それを変更

{{var}}の記述方法は
変数のplaceholders
CakePHP3独自
PaginatorHelper
  アクセス http://localhost/web3/caketest/neko-lines/  

 

 

コラム 認証Auth使用時のはまる点

  • テーブル users は固定(変更は可だが・・)
  • 列名 username password は固定(変更は可だが・・)
  • passwordは暗号化して保存するので
    1. 一番最初だけ、だれでも登録できるように設定し、
    2. adminユーザを一つ登録し、
    3. その後、adminユーザだけが登録できるように変更する。

 

 

コラム Googleで検索する時

  • CakePHPは1.x系と2.x系で少し記述方法が違う。
  • よって、検索結果を見るときは、2.x系かどうか気にすべし。
  • また、検索条件を過去1年くらいに設定して検索するとよい。

 

 

コラム ネット公開時のメモ

■CakePHPのトップを見せなくする方法
app\View\Pages\home.ctp
<?php
header("Location: index.html");
exit();
?>
に変える

■デバック情報を非表示にする方法
app\Config\core.php
Configure::write('debug', 0);

※ただし0の場合、表構造変更が、長期間反映されなくなる。

■管理者用ページを作成する方法
app\Config\core.php
Configure::write('Routing.prefixes', array('admin'));

app\Controller\AppController.php
class AppController extends Controller{
public $components = array(
'Session',
'Auth'
);
function beforeFilter(){
if(empty($this->request->params['admin'])){
// adminルーティングではない場合、認証を通さない(allow)
$this->Auth->allow($this->request->params['action']);
}
}
}

app\Controller\RelayTeamsController.php
public function admin_edit(){
}
のようなメソッドを作れば、管理者ログインでのみ実行
http://ホスト名/cakephpフォルダ/admin/app名/edit