CodeIgniterにはバッチモードなるものが存在するらしい。
マニュアルには詳しく載っていなかったので、実際にEmailクラスを探索してみた。
該当箇所はここ
- <?php
- function bcc($bcc, $limit = '')
- {
- if ($limit != '' && is_numeric($limit))
- {
- $this->bcc_batch_mode = TRUE;
- $this->bcc_batch_size = $limit;
- }
-
- $bcc = $this->_str_to_array($bcc);
- $bcc = $this->clean_email($bcc);
-
- if ($this->validate)
- {
- $this->validate_email($bcc);
- }
-
- if (($this->_get_protocol() == "smtp") OR ($this->bcc_batch_mode && count($bcc) > $this->bcc_batch_size))
- {
- $this->_bcc_array = $bcc;
- }
- else
- {
- $this->_set_header('Bcc', implode(", ", $bcc));
- }
- }
- ?>
引数を見てもわかるように
$bcc:カンマ区切りのメールアドレス
$limit:一度に送信するメールアドレス
を引数として渡せば、何か以下繰り返して送ってくれるっぽい。
ちょっとテストしてみた。
- <?php
- $this->load->library('email');
-
- $this->email->from('your@example.com', 'Your Name');
- $this->email->to('someone@example.com');
- $this->email->bcc('test@hoge.com,uhouho@hoge.com,megaitai@hoge.com', 1);
-
- $this->email->subject('Email Test');
- $this->email->message('Testing the email class.');
-
- $this->email->send();
- ?>
bccに指定した3つのアドレスには問題なく送信されたが、
分割して送られたのかが判断不可能だった。
(やってみて気づいたが当たり前といえば当たり前だった)
まぁ多分いけそうですね。
前回さくらのビジネスプロにCodeIgniterをインストールし、順調に開発を進めてた矢先、問題にぶつかった。
バリデーションが動かない・・・・
バリデーションにはじかれて入力画面にもどっても画面が真っ白な状態。
何故だ!とりあえず思い当たることころを再確認。
・セットしたルールに間違いはないか?
・form,urlヘルパーをロードしているか?
・phpにミスはないか?
etc・・・・
何もねー。ただ気になったのは$this->form_valiadtion->set_rulesに何もセットしないと動くことは動くということ。
いやーこうなったら根本を確認するしかないと思い、system/library/Form_Validation.phpを直接見て調査。
原因を発見・・・ここでした。
・
・
$this->CI->lang->load('form_validation');
・
・
この瞬間ピンときてsystem/language/japanese/form_valiadtion_lang.phpを確認。
記述はあっていたので、とりあえず文字コードをUTF8に変更。
動きました。文字コードの問題だったらしいです。
はずかしー。2hの稼働返せ。
最近CodeIgniterでとある団体のホームページを作ることになりました。
サーバはどうしようかな~と考えましたが、今後も大きくなりそうなのでさくらのビジネスプロに決定!
ってなわけでまずはさくらのレンタルサーバにCodeIgniterをぶち込むことから始めます。
1.CodeIgniterダウンロード
まずは下記のリンクからCodeIgniterをダウンロード(2010/11/26現在のversionは1.7.2)して解凍します。
http://codeigniter.com/downloads/
2.FTPでアップロード
さくらのレンタルサーバへ解凍したフォルダごと/home/xxxxx/www直下にアップロード。
3.Teratermでログイン
cshが使いにくすぎるのでとりあえずbashにしました。
参考:http://www.hazama.nu/t2o2/archives/002697.shtml
落ち着いたらzsh入れます。
4.Config直下のファイルを編集
さくらの環境に合わせてデータベース等の設定ファイルを編集します。
5.vimインストール
なんと(いや普通か)vimが入ってなかったので、インストールしました。
参考:http://dameninngenn.sblo.jp/article/35264757.html
※上記のサイトだとパスを通していないため、.bashrcに下記を追記。
PATH="$PATH"":$HOME/local/bin
6..htaccess設定
さくらのレンタルサーバだとURLルーティングに癖があるらしいので下記のサイトを参考に.htaccessを設定
参考:http://d.hatena.ne.jp/mcatm/20090415/1239807899
ちなみにこんな感じです。
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(index\.php|css|robots\.txt|js|images)
RewriteRule ^(.*)$ /index.php?/$1 [L]
7.動作確認
適当なcontrollerとviewを用意して動作確認。
おお!普通にいけた。
Symfonyのときはさくらに随分泣かされたのでちょっと感動。
これで開発できる環境が整ったので、一気に仕上げるぞ~
CodeIgniterにおいてURLにデフォルトで含まれるindex.phpを消すには、以下の内容を.htaccessに記述し、ドキュメントルート直下に配置すればOKです。
- RewriteEngine on
- RewriteCond $1 !^(index\.php|css|js|images)
- RewriteRule ^(.*)$ /index.php/$1 [L]
RewriteCondの値は必要に応じて適時追加してください。
sfPropelPagerはsymfonyのデフォルトORMであるpropelを用いたページャー機能だが、ちょっとおかしなところがあったのでメモ。
getNbResults()は取得した全レコード数を返す関数だが、group byを指定するとおかしくなることが判明。
group byすると何故かgroup byしていない全レコード数がセットされてしまう。
色々調べたところ、原因はsfPropelPager の中でdoCount した時にgroup by の項目をクリアしてからdoCountしているらしい。
参考:http://u2k772.blog95.fc2.com/blog-entry-15.html
ってなわけでここに書いてある通り
- <?php
- $criteria = new Criteria();
- $criteria->setDistinct();
- ・・・
- ・・・
- $criteria->addGroupByColumn(...);
- ?>
としたらきちんと取得できた。
あざっす!!
前回でsymfony(prototype)のヘルパーを用いて、ドラッグ&ドロップする機能を実装した。
あれこれ試しているうちにはまったことがあったので以下にメモ。
1.draggable_element、drop_reciving_elementは指定したい要素よりも後ろに記述しなければならない。
2.IEの場合、書き換える要素に
・drop_reciving_elementで指定している要素
・drop_reciving_element自体
を指定することは出来ない。これらを指定すると2回目以降ドラッグできなくなる。
中でも2はfirefoxとchromeでは動くのにIEだけ動かなかったのでかなりイライラしたw
要はdrop_reciving_elementで指定している要素は変更するなということらしい。
フリッカーのグルーピングのようなドラッグ&ドロップで画像を操作する機能を実装したいと思い、色々と調べてみた。
symfonyのJavascriptヘルパーの中身を調べていたら
draggable_element()
drop_receiving_element()
の2つのヘルパーで実装できることが判明。
まずはドラッグするための機能を説明する。
- <div id="product_list" class="product">
- <?php foreach($products as $id => $title): ?>
- <?php echo image_tag('product'.$id, array(
- 'id' => 'product_'.$id,
- 'alt' => $title,
- 'class' => 'products'
- )) ?>
- <?php echo draggable_element('product_'.$id, array('revert' => true)) ?>
- <?php endforeach ?>
- </div>
draggable_element(ドラッグさせたい要素のid, [オプション])
で指定した要素をドラッグ出来るようになる。
draggable_elementは次のパラメーターを受け取る。
| パラメーター |
説明 |
| revert |
trueに設定した場合、要素が放たれたときに元の位置に戻るようになる。
また任意の関数を呼び出すことも可能。 |
| ghosting |
要素をクローンして、要素が放たれても元の位置に戻らないようになる。 |
| snap |
falseに設定した場合、スナッピングされない。 |
次にドロップの機能を説明する。
- <?php forearch ($labels as $label) : ?>
- <div id="label_<?php echo $label->getId() ?>">
- <span id="count_<?php echo $label->getId() ?>">0</span>
- <span id="indicator_<?php echo $label->getId() ?>">loading now....</span>
- <?= drop_receiving_element('label_'.$label->getId(), array(
- 'url' => 'blg/add?label_id='.$label->getId(),
- 'accept' => 'product',
- 'update' => array(
- 'success' => 'count_'.$label->getId(),
- 'failure' => 'error_'.$label->getId()
- ),
- 'method' => 'GET',
- 'hoverclass' => 'label-active',
- 'script' => 'true',
- 'confirm' => '"'.$label->getLabelName().'に追加しますが、よろしいですか?"',
- 'loading' => 'Element.show("indicator_'.$label->getId().'")',
- 'complete' => 'Element.hide("indicator_'.$label->getId().'")',
- )) ?>
- </div>
drop_receiving_element(ドロップさせたい要素のid, [オプション])
で指定した要素をドロップ出来るようになる。
drop_receiving_elementは次のパラメーターを受け取る。
| パラメーター |
説明 |
| url |
ドロップされたときに実行するurl |
| accept |
ドロップさせる要素を文字列またはcssクラスで指定する。 |
| update |
更新する要素を指定する。配列を指定することで成功時と失敗時の要素を指定できる。 |
| method |
POST、GETなどを指定する。 |
| script |
trueの場合、指定したアクションでjavascriptを実行できる |
| hoverclass |
要素をドラッグしている最中(ドラッグしているがドロップはしていないとき)のcssクラスを指定する |
| confirm |
確認ダイアログに表示する文字列を指定する |
またdrop_receiving_elementに限ったことではないが、
symfonyのajaxヘルパーには以下のようなコールバックのトリガーが設定されている。
| コールバック |
説明 |
| before |
クエストが初期化される前 |
| after |
リクエストが初期化された直後で読み込まれる前 |
| loading |
ブラウザからのデータでリモートの文章が読み込まれているとき |
| loaded |
ブラウザがリモートの文章を読み込み終えたとき |
| interactive |
ユーザーが読み込みを終えずにリモートの文章とやりとりしているとき |
| success |
XMLHttpRequest が完了し、HTTP ステータスコードが 2XX のとき |
| failure |
XMLHttpRequest が完了し、HTTP ステータスコードが 2XX でないとき |
| 404 |
url が 404 ステータスを返すとき |
| complete |
XMLHttpRequest が完了したとき ( 失敗であろうと成功であろうと ) |
参考:第11章-Ajaxの統合
symfony book 日本語ドキュメント Javascriptヘルパー
symfonyでクッキーを使うには次のようにすればよい。
- <?php
-
-
- $this->getResponse()->setCookie();
-
- $this->getRequest()->getCookie();
-
-
-
- sfContext::getInstance()->getResponse()->setCookie();
-
- sfContext::getInstance()->getRequest()->getCookie();
- ?>
個人的には後者のやり方で統一するほうが好きw
普通にウェブプログラミングをしていると、ハイパーリンク内で特定のスクリプトのトリガーを引きたくなるときがある。
「戻る」や「ポップアップ」機能がその代表例とも言えるだろう。
symfonyにはjavascriptヘルパーが用意されており、これらを用いると比較簡単にリンク処理をすることができる。
- <?php
-
- echo link_to_function('戻る', 'history.back()');
-
-
- echo button_to_function('削除', 'if confirm("本当に削除してもよろしいですか?"){ do_delete(); }');
-
-
- ?>
ちなみにpear内のJavascriptHelper.phpには次のように書かれていた。
- <?php
-
-
-
-
-
-
-
-
- function link_to_function($name, $function, $html_options = array())
- {
- $html_options = _parse_attributes($html_options);
-
- $html_options['href'] = isset($html_options['href']) ? $html_options['href'] : '#';
- $html_options['onclick'] = $function.'; return false;';
-
- return content_tag('a', $name, $html_options);
- }
-
-
-
-
-
-
-
-
- function button_to_function($name, $function, $html_options = array())
- {
- $html_options = _parse_attributes($html_options);
-
- $html_options['onclick'] = $function.'; return false;';
- $html_options['type'] = 'button';
- $html_options['value'] = $name;
-
- return tag('input', $html_options);
- }
-
- ?>
ヘルパーのファイルを探索すれば、意外に便利なものが見つかるかもしれない。
プロジェクトを開発するにあたり、システムフラグなど定数を定義する必要が出てくる。
symfonyでは
- プロジェクト全体(全てのアプリケーション)で使える定数
- アプリケーション内で使える定数
- モジュール内定で使える定数
の三段階で定数を定義できる。
ちなみに定義するファイルは
- プロジェクト全体の定数定義は、プロジェクトルート/config/settings.yml(なければ作成する)
- アプリケーション内の定数定義は、アプリケーション/config/app.yml
- モジュール内の定数定義は、モジュール/config/mod.yml(なければ作成する)
となっている。
以下はプロジェクト全体の定数定義の例。
- #settings.yml
- all:
- flg:
- off: 0
- on: 1
- default: 0
と定義すると
- <?php
- sfConfig::get('sf_flg_off');
- sfConfig::get('sf_flg_on');
- sfConfig::get('sf_default');
- ?>
で値が取れる。
ちなみにsfConfig::get(‘sf_xxxxxx’)で変数を取得でき、
階層に分けている場合は_(アンダーバー)で区切る。
sfの部分は設定ファイルによって、app,modにそれぞれ変るようです。
詳しくはsymfony book 日本語ドキュメント 設定の説明を見てください。