CakePHP1.2.5 SecurityComponentでハマったときに確認するポイント
SecurityComponentを使うとすぐにblackHoleへ吸い込まれる貴方は必見です。
$form->create() $form->end() をちゃんと使っているか
SecurityComponentを使うとTokenをチェックしてくれますが、ちゃんとFormHelperを使ってTokenを発行しないことにはblackHoleへ吸い込まれてしまいます。
$form->create() $form->end() を使いましょう。
$form->submit() ではダメです!
DatabaseのTable内に存在しないField名を使っていないか
SecurityComponentではTokenを作成する際、DatabaseのTableのFieldを読み込んでHashを作っているようです。なので、それ以外のInput項目を付け加えてしまうとblackHoleへ吸い込まれてしまいます。
項目を付け加える必要がある場合は、以下のようにControllerに設定しておきましょう。
<?php public function beforeFilter() { $this->Security->disabledFields = array('hoge'); } ?>
2 way Validating a HABTM relationship
方法1 Model Tagに書く
参考: How to validate HABTM data… « nuts and bolts of cakephp
Model Tag
<?php class Tag extends AppModel { public $name = 'Tag'; public $validate = array( 'Tag' => array('rule' => array('multiple', array('min' => 1, 'max' => 3))), ); public $hasAndBelongsToMany = array('Post'); } ?>
Controller Posts
<?php class PostsController extends AppController { function add() { if(!empty($this->data)) { $this->Profile->create(); $this->Post->Tag->set($this->data); if($this->Post->Tag->validates() && $this->Post->save($this->data)) { //succsess } } $this->set('tags', $this->Post->Tag->find('list', array('fields'=>array('id', 'tag')))); } } ?>
View Posts add
<?php echo $form->create('Post', array('action'=>'add')); echo $form->inputs(array( 'title', 'post', 'Tag' => array('multiple'=>'checkbox'), ); echo $form->end('Submit'); ?>
方法2 Model Postに書く
Model Tag
<?php class Post extends AppModel { public $name = 'Post'; public $validate = array( 'Tag' => array('rule' => array('multiple', array('min' => 1, 'max' => 3))), ); public $hasAndBelongsToMany = array('Tag'); function beforeValidate() { $this->data['Tag']['Tag'] = $this->data['Post']['Tag']; return true; } } ?>
Controller Posts
<?php class PostsController extends AppController { function add() { if(!empty($this->data)) { $this->Profile->create(); if($this->Post->save($this->data)) { //succsess } } $this->set('tags', $this->Post->Tag->find('list', array('fields'=>array('id', 'tag')))); } } ?>
View Posts add
<?php echo $form->create('Post', array('action'=>'add')); echo $form->inputs(array( 'title', 'post', 'Post.Tag' => array('multiple'=>'checkbox'), ); echo $form->end('Submit'); ?>
ドキュメント勉強会に参加しました
8月6日に開催されました、ドキュメント勉強会に参加しました。
今回は、おやつ係&懇親会幹事&発表といった形で関わらせていただきました。
さて、自分自身ドキュメント経験値ゼロという状態の中
気づいたことを何点か
- ドキュメントには伝える対象によって内容が変化する
- 発注者向け
- 開発者向け
- などなど
- 使っているツールはOffice系が多い
- やはり、会社によってフォーマットが違う
- しかし、内容には共通したものが多い(当然か>
自分の発表
なんかただのツール紹介になってしまいました^^;
redmineにすべてのドキュメントをまとめていきたかったんですが、力及ばす。
もっと勉強が必要ですね…
反省点
おやつに出したみたらし団子は、持つところまでみたらしに浸かっていて、阿鼻叫喚だった。
懇親会
ちょうど悩んでいた新人教育などの話ができたことが大きかった。
内容とは関係ないですが
eventsのときは、参加者の感想ブログがトラックバックで確認できたのですが、
ATNDになるとそれができないので、勉強会まとめのサイトつくってみました。
http://studybookmark.net/
ユーザ登録やパスワード忘れ処理とかは下のプラグインつかってます
slywalker's account_manager at master - GitHub
このあたりの開発話はまたエントリー書く予定です。
CakePHP1.2.3 MediaPluginをつかってみた その2
CakePHP1.2.3 MediaPluginをつかってみたの続編
結構環境によってハマリどころが多いのでメモ
あと、プラグインのアップデートで動かなくなってしまったとこもあるので注意
Model Attachment
これがデフォルトのvalidateの設定
<?php class Attachment extends MediaAppModel { var $validate = array( 'file' => array( 'resource' => array('rule' => 'checkResource'), 'access' => array('rule' => 'checkAccess'), 'location' => array('rule' => array('checkLocation', array( MEDIA_TRANSFER, '/tmp/' ))), 'permission' => array('rule' => array('checkPermission', '*')), 'size' => array('rule' => array('checkSize', '5M')), 'pixels' => array('rule' => array('checkPixels', '1600x1600')), 'extension' => array('rule' => array('checkExtension', false, array( 'jpg', 'jpeg', 'png', 'tif', 'tiff', 'gif', 'pdf', 'tmp' ))), 'mimeType' => array('rule' => array('checkMimeType', false, array( 'image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'application/pdf' )))), 'alternative' => array( 'rule' => 'checkRepresent', 'on' => 'create', 'required' => false, 'allowEmpty' => true, )); } ?>
ここで注意しないといけないのは2点
- location
- mimeType
location
'location' => array('rule' => array('checkLocation', array( MEDIA_TRANSFER, '/tmp/' ))),
ruleの第2引数はallowディレクトリです。
ここには、upload_tmp_dirも含まれる必要があります。
見ての通り、Windows環境ではこのvalidationに引っかかりまくります。
第2引数をtrueにするとすべて許可状態になります。
mimeType
'mimeType' => array('rule' => array('checkMimeType', false, array( 'image/jpeg', 'image/png', 'image/tiff', 'image/gif', 'application/pdf' )))),
ruleの第2引数はdeny、第3引数はallowです。
image/jpegをuploadしたのに引っかかってしまいます。
(testでも失敗になってたので、そのうち修正が入るでしょうが…)
とりあえず第3引数をtrueにしときます。
CakePHP1.2.3 MediaPluginをつかってみた
2009-07-31 追記
CakePHP1.2.3 MediaPluginをつかってみた その2
最小導入方法
davidpersson's media at master - GitHub
GitHubからソースコードを持ってきて、app/pluginsフォルダ内に配置。
$ cd app $ cake schema run create media -path plugins/media/config/sql
もしくは
plugins/media/config/sql/media.sql
を元にTableを作成。
app/webroot/media フォルダ作成してパーミッションを設定
app/config/bootstrap.phpに次を追加
<?php require_once(APP.'plugins'.DS.'media'.DS.'config'.DS.'core.php'); ?>
ModelにAssociationを追加
<?php class Post extends AppModel { var $name = 'Post'; var $hasMany = array( 'Attachment' => array( 'className' => 'Media.Attachment', 'foreignKey' => 'foreign_key', 'conditions' => array('model' => 'Post'), 'dependent' => true, ), ); } ?>
ControllerのModel::save()をModel::saveAll()に変更
- if ($this->Post->save($this->data)) { + if ($this->Post->saveAll($this->data, array('validate' => 'first'))) {
ViewtにMediaPluginのelementを追加
FromHelper::create() の option に array('type' => 'file') を忘れずに
add.ctp, edit.ctp
<?php echo $form->create('Post', array('type' => 'file')); echo $form->input('id'); echo $form->input('subject'); echo $form->input('body'); echo $this->element('attachments', array('plugin' => 'media')); echo $form->end('submit'); ?>
view.ctp
hasManyでやってるので複数でてくる
<?php echo $medium->embed($medium->file('filter/s', $post['Attachment'][0])); ?>
設定
media/config/core.php の中身をみるとだいたい分かる。
画像加工の種類
- fit
- 設定サイズに収まるように縮小
- fitCrop
- 画像を最大限使用できるように、縮小した上で設定サイズでトリミング
- zoomCrop
- 画像の中心部分を設定サイズでトリミング (たぶんあってる)
保存ファイル名の変更
media/models/behaviors/transfer.php のコメントをみるとだいたい分かる。
2009-07-31 追記
CakePHP1.2.3 MediaPluginをつかってみた その2
CakePHP1.2.3 Pluginでのi18n
DebugKitの中身をみて気づいたこと
通常、i18nを使う時は
__('English');
としていますが、
Plugin内で使用するときは
以下のようにdomainにplugin nameを指定することができます。
__d('my_plugin_name', 'English');
そうすると、以下の.poファイルをApp側で読み込んで翻訳してくれます。
my_plugin_name/locale/jpn/LC_MESSAGES/my_plugin_name.po
CakePHP1.2.3 PluginのviewsをApp用に変更する方法
Theme機能を使う
AppControllerのbeforeFilter()に以下のように
<?php class AppController extends Controller { function beforeFilter() { if (isset($this->params['plugin'])) { $this->view = 'Theme'; $this->theme = $this->params['plugin']; } } } ?>
beforeRender()でもよさそうだけど、DebugKitが表示されなくなった。
以下の場所にPluginのviews内のfilesをcopyしてApp用に変更する。
my_plugin_nameはプラグイン名にする。
app/views/themed/my_plugin_name/