checkbox
<?php e($form->checkbox('CruiseReguser.question_1.0', array('value' => '1')));?>1
<?php e($form->checkbox('CruiseReguser.question_1.1', array('value' => '2')));?>2
<?php e($form->checkbox('CruiseReguser.question_1.2', array('value' => '3')));?>3
<?php e($form->checkbox('CruiseReguser.question_1.3', array('value' => '4')));?>4
validate
'項目' => array('規則名' => array('rule' => array('チェック関数名')))'name' =>array(
'rule' => array('maxLength', 8),
'message' => '8文字を超えてます'
);ユニークのチェック
'name' => array(
'require' => array('rule' => array('notEmpty'), 'required' => true),
'unique' => array('rule' => array('isUnique'), 'message'=>'同じ名前が存在しています')
),required と allowEmpty未入力でもOK
'required' => true, 'allowEmpty' => true
未入力でもOK
'required' => false, 'allowEmpty' => true
未入力はNG
'required' => true, 'allowEmpty' => false
Text ヘルパー
public $helpers = array('html', 'text');を追加します。 1.リンクの自動生成
テキストの中からURLやメアドを探しタグでくくってくれます。
$text->autoLink('テキスト', '属性設定')2.リンクの削除テキストの中からリンクを取り除きます。
$text->stripLinks('テキスト', '属性設定')3.テキストから一部を抜粋する長いテキストの中から特定の部分だけを抜粋します。
$text->excerpt('元のテキスト', '抜粋テキスト', 文字数)4.テキストの一部をハイライト表示をするテキストの一部にハイライト表示をします。
$text->highlight('テキスト', 'ハイライする部分')
ACLComponentを使ってみる
ACLComponentはユーザーに応じて利用可能なページかどかを判定します。
1.設定ファイルの修正
[\app\config\core.php]
Configure::write('Acl.classname', 'DbAcl');
Configure::write('Acl.database', 'default');
//を削除します。
2.コマンドプロンプトの実行
・環境変数PATHの設定
> cd C:\xampp\php > set path=%path;%cd% > cd C:\xampp\htdocs\blog\cake\console > set path=%path;%cd%・スキーマの生成
> cd C:\xampp\htdocs\blog\app > cake schema generate > cake schema run create DbAcl Are you sure you want to drop the table(s)? (y/n) [n] > y Are you sure you want to create the table(s)? (y/n) [y] > y[ACOS][AROS][AROS_ACOS]という3つのテーブルが作成されます。
3.ARO情報を作成します
AROは、ユーザを管理するものです。・管理(admin) すべての機能が使える・メンバー(member) 一般メンバー・ゲスト(guest) 閲覧メンバー
JavaScript ヘルパー
Prototype JavaScript framework
script.aculo.us - web 2.0 javascript
script.aculo.us のライブラリには既に Prototype が含まれております。
「get it already!」の「Downloads page」をクリックします
「current version」の「scriptaculous-js-1.8.2.zip」をクリックしダウンロードします。
解凍をして「scriptaculous-js-1.8.2\scriptaculous-js-1.8.2\src」内の8つのファイルを
「app\webroot\js」に移動します。
/app
└/webroot
└/js
├builder.js
├controls.js
├dragdrop.js
├effects.js
├scriptaculous.js
├slider.js
├sound.js
└/unittest.js
ユニットテスト
SimpleTestは、PHPのためのユニットテストフレームワークです。
SimpleTest - Unit Testing for PHP
ここから「download」をクリックして「The current release is : SimpleTest v1.0.1.」をクリックして「simpletest_1.0.1.tar.gz」をダウンロードします。
Sanitizeライブラリの利用
Sanitizeライブラリを使用して、問題となりうるタグだけを取り除きます。
App::import('Sanitize');
Sanitize::stripAll($resukt);
| stripAll | <script>, <style>, <img> および空白文字を削除します |
| stripScripts | <script>, <style> タグを削除します |
| stripImages | <img> タグを削除します |
| stripWhitespace | 空白(改行、タブ)を削除します |
| striptTags | 第二引数で指定したタグを削除します |
テーブル名は?
バイト数チェック
$length = strlen($check);全角半角の文字数制限をする際には「mb_strlen関数」を使わないと・・
class AppModel extends Model
{
function maxLengthJP($wordvalue, $length)
{
$value = array_shift($wordvalue);
return(mb_strlen($value,mb_detect_encoding($value)) <= $length);
}
function minLengthJP($wordvalue, $length)
{
$value = array_shift($wordvalue);
return(mb_strlen($value,mb_detect_encoding($value)) >= $length);
}
}
参考サイト:独自のバリデーション関数を追加(日本語の文字数チェック)AuthComponentを使ってみる
CREATE TABLE users ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255) NOT NULL UNIQUE, password CHAR(40) NOT NULL, created DATETIME, modified DATETIME );users_controller.php
<?php
class UsersController extends AppController
{
var $name = 'Users';
var $components = array('Auth');
function beforeFilter() {
$this->Auth->loginError = "Login Error";
}
function login() {
}
function logout() {
$this->redirect($this->Auth->logout());
}
}
?>app/views/users/login.ctp <?php
if ($session->check('Message.auth')) $session->flash('auth');
echo $form->create('User', array('action' => 'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');
?>参考サイト:認証 :: 主要なコンポーネント :: マニュアル :: 1.2 Collection :: The Cookbook
Paginator でページ送り
$this->paginate = array(
'limit' => 10,
'order' => array('Model.created' => 'desc'),
);
$this->set('data', $this->paginate());$this->paginate = array( 'page' =>, //初期状態で表示されるページ 'conditions' =>, //取得条件 'fields' =>, //取得するフィールド名 'sort' =>, //ソートキーとなるフィールド 'limit' =>, //表示する項目数 'direction' =>, //並び順 'recursive' =>, //再帰的に取得する震度 );
ページ総数や現在のページを表示する
views
$PaginatorHelper->countor(array('format' => '全 %pages% ページ中の %page% ページを表示しています。'))表示 全 11 ページ中の 2 ページを表示しています。
| %pages% | 総ページ数 |
| %page% | 現在のページ |
| %current% | 現在のページに表示しているデータの件数 |
| %count% | データの総件数 |
ページ送り
views
$paginator->first("<< 先頭へ");
$paginator->prev("< 前へ", array(), null, array('class'=>'disabled'))
$paginator->next("次へ >", array(), null, array('class'=>'disabled'));
$paginator->last("最後へ >>");
PEAR::Net_UserAgent_Mobileを使って携帯電話を判別してみよう
PEAR::Net_UserAgent_Mobileを使って携帯電話を判別をしてみたいと思います。
ダウンロード:PEAR :: Package :: Net_UserAgent_Mobile
ファイル名:Net_UserAgent_Mobile-1.0.0RC1.tar
ダウンロード:PEAR
ファイル名:PEAR-1.8.1.gz
PEAR Net_UserAgent_Mobile-1.0.0RC1.tarを解凍してUserAgentフォルダにUPします。
/app
└vendors
├include_path.php <- 新規作成
├PEAR.php
├PEAR5.php
└/Net <- 新規作成
└/UserAgent <- 新規作成
├/Mobile
└Mobile.php
<?php
ini_set('include_path', dirname(__FILE__) . PATH_SEPARATOR . get_include_path());
?>mobiles_controller.php
<?php
App::import('Vendor', 'include_path');
App::import('Vendor', 'Net/UserAgent/Mobile', array('file' => 'Net' . DS . 'UserAgent' . DS . 'Mobile.php'));
class MobilesController extends AppController
{
var $name = 'Mobiles';
var $uses = null;
var $helpers = array('Mobile');
function index() {
$agent = &Net_UserAgent_Mobile::factory();
switch(true){
//DoCoMo
case ($agent->isDoCoMo()):
print "DoCoMo";
break;
//SoftBank
case ($agent->isSoftBank()):
print "SoftBank";
break;
//EzWeb
case ($agent->isEZweb()):
print "EzWeb";
break;
default:
print "PC";
break;
}
}
}
?>出力時の文字コードをShift-JISへ変換します。
/app/views/helpers/mobile.php
<?php
class MobileHelper extends Helper
{
function afterRender() {
$out = ob_get_clean();
$out = mb_convert_kana($out, "rak", "UTF-8");
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
ob_start();
echo $out;
}
}
?>docmo
getSerialNumber() ・・・ 端末製造番号(uid)の取得
getCardID() ・・・ FOMAカード製造番号の取得
参考サイト:Net_UserAgent_MobileをcakePHP1.2RC2で使う
Stable1.2リリース
1月1日にリリースするのかなと思ってましたが。
ダウンロード
アドレス:http://cakephp.org/
ファイル:1[1].2.0.7962.zip (08/12/26)
コンポーネントの作成
自作のコンポーネントは/app/controllers/componentsにUPします。
file_behavior.php
<?php
class FileBehaviorComponent extends Object
{
var $controller = true;
//他のコンポーネントを利用する
var $components = array('Session');
function メソッド名 ( 引数 ){
//メソッドのロジックを記述します。
//モデルの読み込み
$model = & new Member();
$data = $model->findAll();
}
}
?>
コントローラに追加
作成した自作のコンポーネントをコントローラで使えるようにします。
var $components = array('FileBehavior');
$this->FileBehavior->メソッド名();アソシエーション
CREATE TABLE users( id int unsigned auto_increment primary key, name varchar(30) NOT NULL, created datetime default NULL, modified datetime default NULL ); CREATE TABLE posts( id int unsigned auto_increment primary key, user_id int, comment text, created datetime default NULL, modified datetime default NULL );usersテーブルのみの場合のSQLは(条件なし)
SELECT `User`.`id`, `User`.`name`, `User`.`created`, `User`.`modified` FROM `users` AS `User` WHERE 1 = 1
1対1のアソシエーション hasOne です。
user.php
<?php
class User extends AppModel
{
public $name = 'Users';
public $hasOne = array(
'Posts' => array(
'className' => 'Posts',
'foreignKey' => 'user_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
)
);
}
?>SQLは SELECT `User`.`id`, `User`.`name`, `User`.`created`, `User`.`modified`, `Posts`.`id`, `Posts`.`user_id`, `Posts`.`comment`, `Posts`.`created`, `Posts`.`modified` FROM `users` AS `User` LEFT JOIN `posts` AS `Posts` ON (`Posts`.`user_id` = `User`.`id`) WHERE 1 = 1
1対多のアソシエーション hasMany です。
user.php
<?php
class User extends AppModel {
var $name = 'User';
var $hasMany = array(
'Post' => array(
'className' => 'Post',
'foreignKey' => 'user_id',
'dependent' => false,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'exclusive' => '',
'finderQuery' => '',
'counterQuery' => ''
)
);
}
?>users_controller.php $this->set('user_data', $this->User->find('all'));
save()直後にIDを取得
$this->Post->create();
$this->Post->save($this->data);
$last_id = $this->Post->getLastInsertID()
PEAR::Calendarを使ってカレンダーを作ろう
参考サイト:creative@interactive » CakePHPとカレンダー表示(2)
ダウンロード
アドレス:PEAR :: Package :: Calendar
ファイル名:Calendar-0.5.4.tar
Calendar-0.5.4.tarを解凍してCalendarフォルダにUPします。
/app
└vendors
└PEAR <- 新規作成
├include_path.php <- 新規作成
└Calendar
include_path.php
<?php
define('CALENDAR_ROOT', dirname(__FILE__). DIRECTORY_SEPARATOR.'PEAR'.DIRECTORY_SEPARATOR.'Calendar'.DIRECTORY_SEPARATOR);
?>
calendars_controller.php
<?php
App::import('Vendor', 'include_path');
App::import('Vendor', 'Calendar_Month_Weekdays', array('file'=>'PEAR'.DIRECTORY_SEPARATOR.'Calendar'.DIRECTORY_SEPARATOR.'Month'.DIRECTORY_SEPARATOR.'Weekdays.php'));
class CalendarsController extends AppController {
public $name = 'Calendars';
function index(){
$Month = new Calendar_Month_Weekdays( date('Y'), date('m'), 0 );
$Month->build();
$this->set('month', $Month);
}
}
?>
index.ctp
<?php
while ($Day = $month->fetch()) {
if ($Day->isFirst()) {
echo "<tr>\n";
}
if ($Day->isEmpty()) {
echo "<td> </td>\n";
}
else {
echo "<td>" . $Day->thisDay() . "</td>\n";
}
if ($Day->isLast()) {
echo "</tr>\n";
}
}
?>
GoogleMapを利用する
[lng]と[lat]に緯度経度[address]に住所を入力します。
デーブルの作成
CREATE TABLE points (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
lng FLOAT,
lat FLOAT,
address TEXT,
created DATETIME NOT NULL,
modified DATETIME NOT NULL
);
points_controller.php
<?php
class PointsController extends AppController {
var $name = 'Points';
var $helpers = array('Html', 'Javascript');
function index($id = null){
$this->set('id', $id);
}
function getjson($id = null){
$this->layout = "ajax";
Configure::write("debug", 0);
$params = array(
'conditions' => array('Point.id' => $id)
);
$points = $this->Point->find('first', $params);
if(!empty($points['Point']['address'])){
$code = mb_detect_encoding($points['Point']['address']);
if($code != "UTF-8"){
$points['Point']['address'] = mb_convert_encoding($points['Point']['address'], 'UTF-8', $code);
}
}
$this->set("points" ,$points);
}
}
?>
index.ctp
<div id="map" style="width:400px; height:400px"></div>
<script type="text/javascript">
//<![CDATA[
if (GBrowserIsCompatible()) {
var zpoint = 16;
var map = new GMap2(document.getElementById("map"));
map.addControl(new GLargeMapControl());
map.addControl(new GMapTypeControl());
map.disableDoubleClickZoom();
var geocoder = new GClientGeocoder();
GDownloadUrl("<?php echo $html->url('/points/getjson/'.$id)?>", function(data){
var points = eval("(" + data + ")");
if(points.Point.lat !=null && points.Point.lng !=null){
createMarker(new GLatLng(points.Point.lat, points.Point.lng));
}
else if(points.Point.address !=null){
var address = points.Point.address;
if(geocoder){
geocoder.getLatLng(address, createMarker);
}
}
});
function createMarker(point){
map.setCenter(point, zpoint);
var marker = new GMarker(point);
map.addOverlay(marker);
}
}
//]]>
</script>
getjson.ctp
<?php echo $javascript->object($points)?>
getjson.ctpの表示される内容は、
{"Point":{"id":"1","lng":"139.745","lat":"35.6586","address":null,"created":"2009-12-10 00:00:00","modified":"2009-12-10 00:00:00"}}となります。
DBを使わずにFormHelperを使用するときは
FormHelperを使うと、DBに接続しに行ってしまいます。
のでモデルに
<?php
class Contact extends AppModel
{
var $useTable = false;
var $_schema = array('id' => array('type' => 'integer'));
}
?>
参考サイト
formヘルパーをテーブルなしモデルで使用するとエラーの回避方法CakePHP1.2b - CPA-LABテクニカル
共通で使える変数
[変数の書き込み] /app/config/bootstrap.php
Configure::write('prefectures', array(
1 => '北海道',
2 => '青森県',
3 => '岩手県',
4 => '宮城県',
));[変数の読み込み]
$prefectures_data = Configure::read('prefectures');ディレクトリ構造を変更する
解凍後下記のように変更します。
cake_1.2.0.7692-rc3
├/cake <- cakeディレクトリを作成して移動
├/docs
├/vendors
├.htaccess
├index.php
└/app <- cakeディレクトリに移動
└/ webroot
└/ webroot
├index.php <- public_htmlフォルダに移動
└.htaccess <- public_htmlフォルダに移動
移動後
/public_html
├index.php
└.htaccess
/cake
├/app
├/docs
├/vendors
├/cake
├.htaccess
└index.php
/public_html/index.phpファイルの編集を致します
サーバは 「/home/user2/cake」 「/home/user2/public_html」
if (!defined('ROOT')) {
//define('ROOT', dirname(dirname(dirname(__FILE__))));
define('ROOT', DS. 'home' .DS. 'user2' .DS. 'cake');
}
if (!defined('APP_DIR')) {
//define('APP_DIR', basename(dirname(dirname(__FILE__))));
define('APP_DIR', 'app');
}
if (!defined('CAKE_CORE_INCLUDE_PATH')) {
define('CAKE_CORE_INCLUDE_PATH', ROOT);
}
データベースを使わない
<?phpこれによりモデルを使わないのでデータデースに接続されません。
class UsersController extends AppController {
var $uses = null;
}
?>
モデル側の設定で使わない場合
<?php
class User extends Model {
var $useTable = false;
}
?>
Model::find
find($type, $params);
$type は 「all」, 「list」, 「first」, 「count」 のいずれかです。
$type = 'all';
$params = array(
'conditions' => array('Model.field' => $thisValue), //条件
'recursive' => -1, //int 検索の実行条件
'fields' => array('Model.field1', 'Model.field2'), //カラム名
'order' => 'Model.created', //順序
'limit' => n, //int
'page' => n //int
);
$data = $this->Model->find($type, $params);
文字列チェック
UTF-8での文字列チェックを行います
app/config/core.php
define( 'VALID_KATAKANA', '/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6])+$/' );全角ひらがな
define( 'VALID_HIRAGANA', '/^(?:\xE3\x81[\x81-\xBF]|\xE3\x82[\x80-\x93])+$/' );app_model.php
static $error = array( 'katakana' => '全角カタカナで入力して下さい', 'hiragana' => '全角ひらがなで入力して下さい', );
var $validate = array(
'katakana' => array('rule' => VALID_KATAKANA, 'required' => true),
'hiragana' => array('rule' => VALID_HIRAGANA, 'required' => true),
);
FormHelper::select()
HtmlHelper::select(name, $data, null, null, array(''=>'--'));
Controller
$categories_data = $this->Category->find('list');
$this->set('categories_data', $categories_data);
views $form->select(
'category_id',
$categories_data,
null,
array('multiple' => 'multiple'),
array(''=>'--')
);
findで何も指定しないとカラムの1番目と2番目を表示します。 $params = array(
'fields' => array('Category.id', 'Category.name'),
);
$categories_data = $this->Category->find('list', $params);
FormHelper::dateTime()
オプションの'monthNames' => falseで、月のセレクトタグが数値で表示されます。
$attr = array(
'minYear' => 2006,
'maxYear' => date('Y'),
'separator' => ' / ',
'monthNames' => false
);
$form->dateTime(
'time_limit',
'YMD',
'NONE',
date('Y-m-d'),
$attr,
false
);
HtmlHelper::link()
HtmlHelper::link(title, url, 要素の属性, 移動前の確認メッセージ);
$html->link(
"削除",
array('controller'=> 'categories', 'action'=>'delete', $id),
array('class'=>'list'),
"削除されますがよろしいですか?"
);
画像にリンク
$html->link(
$html->image(
'common02.gif',
array('alt'=>'', 'border'=>'0')
),
'/business/',
null,
null,
false
);
FormHelper::create()
FormHelper::create('モデル名' ,array());
<?php e($form->create('Contact', array('action'=>'entry', 'method'=>'post', 'name'=>'form1')))?>Model,View,Controllerをディレクトリに整理する方法
$controllerPathsを設定することで、「admins」「users」フォルダに分けることができます。
app/config/bootstrap.php
$controllerPaths = array(
ROOT.DS.APP_DIR.DS.'controllers'.DS.'admins'.DS,
ROOT.DS.APP_DIR.DS.'controllers'.DS.'users'.DS,
ROOT.DS.APP_DIR.DS.'controllers'.DS,
);
$viewPaths = array(
ROOT.DS.APP_DIR.DS.'views'.DS.'admins'.DS,
ROOT.DS.APP_DIR.DS.'views'.DS.'users'.DS,
ROOT.DS.APP_DIR.DS.'views'.DS,
);
view::デフォルトのテンプレートの編集
↓
app/views/layouts/default.ctp
にコピーし編集します。
<?php echo $content_for_layout; ?> <?php echo $cakeDebug; ?>ビューには、大きく分けて
・ビューテンプレート
・レイアウトがあります。
「レイアウト」を用意して、その中で「ビューテンプレート」を表示します。
public $autoLayout = fslse;と記述するとレイアウト機能は使われなくなります。
public $autoRender = fslse;と記述するとビュー機能は使われなくなります。
- プロフィール
Author:MONOKo
FC2ブログへようこそ!
- 最新記事
- 最新コメント
- 最新トラックバック
- カテゴリ
- 検索フォーム
- RSSリンクの表示
- ブロとも申請フォーム

- QRコード





