Posts tagged app
markItUp! を CakePHP で使用するヘルパー
0jQuery を使用したブラウザで使用できる高機能マークアップエディタ markItUp! で紹介した markItUP を CakePHP で使用するヘルパーが Bakery に紹介されていました。
markItUp! jQuery universal markup editor Helper | The Bakery, Everything CakePHP : Articles
元の記事のままやってみたのですが一部うまく動作しなかった部分がありましたので、実際に私がやった手順を紹介します。
(続きを読む…)
Firefox のブックマークがなくなったときの対応方法
1今日 PC を起動したときにどうも様子がおかしかった。普段はスリープ状態にしているのに再起動されたような感じになっている。しかもディスプレイのサイズが XGA になっているし。
まあ Windows だし仕方ないなと思い、Firefox を起動すると何か変だ。アイコンを普段は小さくしているのに大きくents aなっている。しかもブックマークがきれいさっぱりなくなっている!
対応方法を検索してみると下記のページが見つかった。
Mozilla Japan ナレッジベース – ブックマークが消えてしまった
書かれている通りにやってみるがダメだ。
(続きを読む…)
WordPress テーマを作成する(2)
1前回は style.css と index.php だけを作成して最低限のブログを表示させました。なぜこれだけのファイルで表示ができるかというと選択しているテーマに必要なファイルがない場合は wp-content/thmems/default 内のファイルを使用するためです。
今回はヘッダファイルとフッタファイルを作成します。
ヘッダファイル
テーマディレクトリに header.php を作成し下記のような内容にしました。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>> <head profile="http://gmpg.org/xfn/11"> <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" /> <title><?php bloginfo('name'); ?> <?php wp_title(); ?></title> <meta name="generator" content="WordPress <?php bloginfo('version'); ?>" /> <!-- leave this for stats --> <link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" /> <link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss2_url'); ?>" /> <link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" /> <?php wp_head(); ?> </head> <body> <div id="page"> <div id="header"> <h1><a href="<?php echo get_option('home'); ?>/"><?php bloginfo('name'); ?></a></h1> <div class="description"><?php bloginfo('description'); ?></div> </div>
ゼロから書くのは大変なので default/header.php をコピーして必要最低限のみ残してみました。
フッタファイルの作成
ヘッダ同様に footer.php ファイルを作成し、下記のようにしました。
<div id="footer"> <?php bloginfo('name'); ?> Powered by <a href="http://wordpress.org/">WordPress</a><br /> <a href="<?php bloginfo('rss2_url'); ?>">Entries (RSS)</a> and <a href="<?php bloginfo('comments_rss2_url'); ?>">Comments (RSS)</a>. </div> </div> <?php wp_footer(); ?> </body> </html>
ヘッダとフッタのみのブログができました
CakePHP1.2 バリデーションで共通ルールを作成するときに便利な userDefined
0CakePHP1.2 バリデーションのルールを調べているときに気になっていた Validation クラスにある userDefined に関して調べてみました。
cake/libs/validation.php
function userDefined($check, $object, $method, $args = null) { return call_user_func_array(array(&$object, $method), array($check, $args)); }
と定義されています。
call_user_func_array は PHP の関数で、関数やクラスのメソッドをコールすることができます。
つまり独自バリデーションがこれを使用して実装できるということです。
使用方法はモデルに以下のようにバリデーションを定義します。
var $validate = array( 'field' => array('rule' => array('userDefined', 'Model', 'method_name')), ); function method_name ($data) { /* バリデーションのチェック エラーなら false 、エラーなしなら true を返す */ }
ただこれだと下記のように書けるのであまりありがたみがない。
var $validate = array( 'field' => array('rule' => array('method_name'), );
何に使えばいいのかと考えたところ、クラス名、メソッド名が指定できるのでシステムで共通のバリデーションを設定するときに使えるのではと思いました。多分これが一番うれしいところではないかと思います。
※ただ、app_model.php に共通にしたいバリデーションチェック用のメソッド名を書けばそれでいけるような気もする。
CakePHP1.2 文字コードを EUC-JP に設定する
1現在開発しているシステムが文字コードを EUC-JP で制作しなければいけないのですが、今まで CakePHP は UTF-8 でしか制作したことがなく、設定方法などメモしておきます。開発に使用しているのは CakePHP1.2 です。
データベースの文字コード
app/config/database.php
var $default = array( 'driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'port' => '', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'schema' => '', 'prefix' => '', 'encoding' => 'ujis' );
EUC のときは encoding に ujis と設定します。
ちなみに
Shift-JIS のときは sjis
UTF-8 のときは utf8
とします。
これは MySQL の SET NAMES でそのまま使用されるためです。
システムの文字コード
CakePHP1.2 では下記のように設定します。
app/config/core.php
Configure::write('App.encoding', 'euc-jp');
CakePHP 1.1 の方法はちょっとコードを調べたのですが、 core.php などにも特に設定するところがなく分かりませんでした。分かる方いらっしゃったら教えてください。
CakePHP1.2 バッチ処理
2CakePHP1.2 にシェル機能というのがあるのを知りました。下記エントリでメールからの処理を実際に行う方法が紹介されています。
メール受信からのシェル機能実行 – Writing Some Code
ちょうど CakePHP1.2で開発中のシステムで cron でのバッチ処理があるのでそれに応用してみたときのメモです。
バッチ処理で実行させるシェル機能を作成
今回は test という名前のシェル名にします。
app/vendors/shells/test.php を作成します。
< ?php class TestShell extends Shell { var $uses = array('Model'); function actionName(){ /* 実際の処理を書きます */ /* $this->uses に追加したモデルが使用できます */ $lists = $this->Model->findAll(); } } ?>
シェルスクリプト
下記のようなシェルスクリプトを作成して cron から実行させます。
#!/bin/sh cd /path/to/app ../cake/console/cake test actionName
シェルスクリプトなしで直接 cake を実行する方法もある
cake を実行するときにカレントディレクトリが app でないとだめなのですが、
-app /path/to/app
のように -app オプションで実行時に app のパスを指定することもできます。
その場合は下記のようになります。
/path/to/cake/console/cake test actionName -app /path/to/app
これを直接 cron から実行させればシェルスクリプトなしでも実行できます。
その他
vendors/shells 内のファイルですが、ファイル名が hoge_foo.php だった場合、クラス名は HogeFooShell ですが、実行するときは
cake/console/cake hoge_foo actionName
となるようです。
CakePHP PDT の補完機能をビューのヘルパーで使用する方法
1CakePHP のコーディングに PDT を使用しているのですが、ビューで補完機能を使用できるようにする方法が紹介されていました。
Eclipse PDTでCakePHP開発、まず設定すべきこと – Writing Some Code
ビューの拡張子(.ctp, .thtml) を PHP のコンテンツとして登録して、さらにビューで使用するヘルパーの各クラスのインスタンスを作るファイルをプロジェクトに作成し(場所はどこでもいいようです)PDT に教えてあげるような感じですね。
また、コントローラで使用するモデルやコンポーネントにも補完機能を使用できるようにする方法も紹介されています。
class AppController extends Controller { /** * @var Model */ var Model; /** * @var SessionComponent */ var $Session;
下記サイトも参考になりました。
Code completion in views with Eclipse PDT – cakebaker
Eclipse code completion in Views – Cake PHP | Google グループ
CakePHP jQuery を使用した Ajax ファイルアップロード
6下記ページを参考にさせていただきました。
“jQueryを使ったAjaxファイルアップロード” フォーラム – CakePHP Users in Japan
David Golding Design Blog -
上記ページでは jQuery を使用してテキストファイルをアップロードしてテキストの内容を表示するというものですが、画像をアップロードしてアップロードした画像をフォームの下に Ajax を利用して表示するというのをやってみました。
jQuery 使用準備
jquery.js と jquery.form.js を app/webroot/js/ 以下に配置します。
アップロードするビューで上記 JavaScript ファイルを読み込むため下記コードをビューに追加します。
<?php echo $javascript->link(array('jquery.js','jquery.form.js')); ?>
ビューにアップロードするフォームを作成する
今回は users コントローラの form アクションでフォームを表示します。Ajax の処理を行うのは users コントローラの upload アクションです。
views/users/form.ctp
<h1>upload test</h1> <?php echo $form->create('User',array('name'=>'uploadForm','id'=>'uploadForm','type'=>'file'));?> <?php echo $form->input('upload_file',array('label'=>'Upload Text File ','type'=>'file'));?> <?php echo $form->button('アップロード',array('onClick'=>'$('#uploadForm').ajaxSubmit({target: '#uploadFile',url: '/users/upload'}); return false;'));?> </form> <div id="uploadFile"></div>
コントローラの処理
views/users/form.ctp から「アップロード」ボタンを押すと users/upload アクションの $this->data にアップロードファイルの情報が入ってきます。ここでは mime タイプによって JPEG ファイルのみをアップロードできるようにしています。アップロード後に views/users/upload.ctp を出力します。
function upload() { if (!$this->data['User']['upload_file']) { $this->set('error','アップロードするファイルを選択してください'); $this->render('upload','ajax'); } else { if ($this->data['User']['upload_file']['type'] != 'image/jpeg') { $this->set('error','アップロードできる画像は JPEG のみです'); $this->render('upload','ajax'); } else { $filename = '/files/'.intval(rand()).'.jpg'; rename($this->data['User']['upload_file']['tmp_name'], WWW_ROOT.$filename); $this->set('filename', $filename); $this->render('upload','ajax'); } } }
Ajax が返すビューを作成する
/users/upload で処理した結果を返すビューを作成します。今回は veiws/users/upload.ctp として作成しました。ここで img タグによりアップロードしたファイルを表示しています。
<?php if (!empty($error)): ?> <p><?php echo $error;?></p> <?php else: ?> <p>Upload successful</p> <?php echo $html->image($filename); ?> <?php endif; ?>
以上で jQuery を使用して Ajax で画像のアップロードができます。
CakePHP メール送信許可フラグによってメールを一斉送信するメールビヘイビア
2Acts As Emailable | The Bakery, Everything CakePHP : Articles
メール送信許可フラグによってメールを一斉送信することができるメールビヘイビアが上記エントリで紹介されています。
ビヘイビアというのは今まで使ったことがなかったのですが、モデルに共通の振る舞いをさせるようなときに使う感じでしょうか。このメールビヘイビアはモデルにメールの一斉送信機能を付加します。
テーブル
CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) NOT NULL default '', `emailable` tinyint(4) NOT NULL default '1', `email` text NOT NULL, PRIMARY KEY (`id`) )
emailable カラムは 0 or 1 の値で、1の場合はメール送信許可です。
email カラムはメールアドレスが入ります。
モデル
app/models/user.php
< ?php class User extends AppModel { var $actsAs = array('emailable'); } ?>
モデルでメールビヘイビアを使うことを定義します。
ビヘイビア
Acts As Emailable | The Bakery, Everything CakePHP : Articles にメールビヘイビアのコードがあります。
これを app/models/behaviors/emailable.php として保存します。
ただし1点修正が必要でした。
322行目の
App::import('Component', 'EmailComponent');
を
App::import('Component', 'Email');
として保存してください。
Email コンポーネントが修正前のコードでは読み込めずにエラーになります。
メールテンプレート
< ?php echo "テストメッセージです。名前は".$username."です"; ?>
保存先ですが、どこがいいのか悩みましたが今回は app/views/emails/test_template.php としました。
テンプレート内の変数はモデルのカラム名が使用できます。
メール送信
$email_options = array('from' => 'hoge@example.com', 'subject' => 'テストです'); $template = "views/emails/test_template.php"; $this->User->send_campaign_to_emailable($template, $email_options);
これでメール送信許可している(users.emailable=1)のユーザにメールが送信されます。
そのほかに以下のようなメソッドがあります。
send_campaign_to_all($template, $email_options)
登録されているユーザ全てにメールを送信します。
send_campaign_to_non_emailable($template, $email_options)
登録されているユーザでメール送信許可していないユーザにメールを送信します。
add_emailable($id)
ID で指定したユーザの emailable=1 にします。
remove_emailable($id)
ID で指定したユーザの emailable=0 にします。
デフォルトは mail 関数でメール送信しますが、SMTP を指定して送信することもできます。
まとめ
このメールビヘイビアを今回試すことによってビヘイビアの使い方、便利さが少し理解できました。まだビヘイビアを試されていない方は一度試して見てはいかがでしょうか?
CakePHP HTML ヘルパーで出力するラジオボタンにラベルを付ける方法
2CakePHP 1.1 の HTML ヘルパーが出力するラジオボタンにはラベルが付いていないのでラジオボタン以外の文字の部分をクリックしてもチェックができません。そこで CakePHP HTML ヘルパーで出力されるタグを変更する方法 のエントリーの方法を使用してラジオボタンにラベルを付加してみました。
app/config/tags.ini.php
radio = <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>
あとは普通に $html->radio() を使用して出力すればラベルが付加されています。
CakePHP 1.2 ではラジオボタンにラベルがついた状態で出力されていました。