Re:

感銘高き名言は「1%のひらめきがなければ99%の努力は無駄である」(トーマス・エジソン)

タグ:CodeIgniter

※Userモデルをautoloadしてる前提
※クラスとプロパティへのアクセスサンプルが理解につながれば、っていうヒトコト


post_controller_constructorでAuthクラスのgetUserメソッドをフックする。


class Welcome extends MY_Controller {} が実行されるとき

CI_Controller -> MY_Controller -> Auth -> Welcome

class MY_Controller extends CI_Controller {
    public static $user_id = 0;
    public static $user = array();
    public $nickname = '';
    public function __construct(){
        parent::__construct();
        self::$user_id = (int)$this->input->post('user_id');
    }
}

class Auth {
    public function getUser(){
        $CI =& get_instance();
        $CI::$user = $CI->User->getUserById($CI::$user_id);
        $CI->nickname = $CI::$user['nickname'];
    }
}

class Welcome extends MY_Controller {
    public function index(){
        log_message('info', self::$user_id);
        log_message('info', var_export(self::$user, true));
        log_message('info', $this->nickname);
    }
}


110521_014856
あー一眼レフ売ってからケータイを撮るにはケータイのカメラっていう…コンデジ欲しい、P300で良いから…

ケータイだと画像を見るには有料登録しなければいけないという理不尽さに呆れ、じゃあ画像取ってきて保存しとけばいつでも見られるよね→ついでにメールで通知があれば(RSSは配信してるけど)親切じゃん、ということで仕込んでから数ヶ月。

いまも15分おきにRSSの更新チェックとデータベース化、そしてローカルへの画像保存が稼働中。

でもやっぱり、わざわざWEBに見に行くのは見たい画像だけでイイという欲求から、プレーンテキストじゃなくリッチなデコメにしてみる計画。

画像が差し込まれてるから一目瞭然!(本文はまだ未対応)


んで。

CodeIgniterのCLI、それは特に問題なかったのだが、デコメの部分だよね。

Qdmail

そんなみんなのためのQdmail、ありがとう。

でもねー、ちょっとだけはまった。docomoケータイに飛ばすと「添付ファイル削除」となり添付どころか本文すらも消失するという状態。

問題の原因の多くはガラケーの独自仕様に起因すると思ってるんだけど、とりあえずQdmailも準拠してる改行コードを変えてあげないと正常に送れなかったという結論。

デフォルトでは \r\n だけど、\n にする。


それも踏まえて、CodeIgniterでのQdmailの使い方。

/libraries/qdmail.phpとして置いて、あとは通常のライブラリロード同様

$this->load->library('Qdmail')

これで $this->qdmail->easyDeco() とか使えるようになるよ!(ライブラリは小文字

public function __construct(){
    parent::__construct();
    $this->load->library('Qdmail');
}
public function sendmail(){
    $this->qdmail->lineFeed("\n"); // 改行コードを \n にする!
    // 以下の各変数は適宜設定
    $this->qdmail->easyDeco($to,$subject,$body,$from,$attach);
}
※postfixを利用してる場合、sendmail完全互換ではないため1186行目からの処理をコメントアウトする必要があるっぽい(ver.1.2.6b)
if(false !== @system($sendmail_path.' -d0.1 < /dev/null > /dev/null',$ret)){
    if(is_array($ret)){
        $ret = reset($ret);
    }
    $code = (int) substr($ret,0,3);
    if( 100 === $code || 111 === $code){
        $this->is_qmail = true;
    }
}

bodyの書き方とか変数の設定等々はオフィシャルをご覧ください。

ちなみに、インライン画像を2枚以上差し込む場合、attachはarrayにしてかつ第二パラメータで名前を指定しないと画像が正常に表示されなかった(1枚の場合はstringで名前はなくてもおk)。
$attach = array(
    array('/path/to/image1', 'image name1'),
    array('/path/to/image2', 'image name2')
);

これからフジテレビ関連はタイトルにハッシュタグ付けることにする。

本田アナの時だけ飛んできてたんですが、何気に松尾アナのエントリが頻繁だったり他アナの写メに本田アナが写ってたりするので全部通知!


1.7.2まではライブラリ作って実行させる必要があったけど、2.0からはそのままで利用可。

$config['uri_protocol'] = 'CLI'

としなくても、デフォルトのAUTOでGUI、CLI共にもちろん動作します。

$ php /path/to/index.php [controller] [method] [params]

/controller/welcome.php
public function hello1(){
    echo 'world';
}
public function hello2(){
    // e.g. /welcome/hello2/message/world
    $params = $this->uri->ruri_to_assoc();
    echo $params['message'];
}

$ php /path/to/index.php welcome hello1
world

$ php /path/to/index.php welcome hello2 message world
world

蛇足ながら、自分はルーティングを多様するので $this->uri->ruri_to_assoc() を利用。

MY_Controllerを継承してコンストラクタで $params = $this->uri->ruri_to_assoc() として扱ってます。

※uriを使うにはurlヘルパをロードする必要があります

1.7.xのときはライブラリを別途用意する必要があったけど、2.xからデフォルトでドライバ対応。

しかし、変更履歴とドキュメントには /config/memcached.php を置いてね!と書かれてるだけで、果たしてどう書けとw

コアソース読めよってことなのか。
読むならここ:/system/libraries/Cache/drivers/Cache_memcached.php の _setup_memcached() メソッド

検索したらフォーラムでもスレッドあったけど、$config[key] として配列を記述すればおk!

/config/memcached.php
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['server1'] = array(
    'hostname' => '192.168.1.11',
    'port' => 11211,
    'weight' => 1
);
$config['server2'] = array(
    'hostname' => '192.168.1.12',
    'port' => 11211,
    'weight' => 1
);
$config['server3'] = array(
    'hostname' => '192.168.1.13',
    'port' => 11211,
    'weight' => 1
);

# $config = array('server1' => array(…), 以下略);

key: server1 - server3 はネームスペースなのでご自由に。

シングル構成なら配列は一つで良いし、マルチプルならその台数ぶん配列を追加。

key: hostname, port, weight は設定ファイルがなければそれぞれ 127.0.0.1, 11211, 1 が使用されるので、hostname, port を最低限記述しておけばおk。


ただ、Cache_memcached.php で

extension_loaded('memcached')

と拡張ライブラリを判定して絶対無理だったんだけど、ここは

extension_loaded('memcache')

じゃないんですか?

あと、new Memcached() としてたところと、add() で第三パラメータにexpire指定されてるので有効期限も効かず…。


修正しないと機能しませんでした。

https://bitbucket.org/ellislab/codeigniter-reactor/issue/232/memcache-driver-fix

$this->load->driver('cache');
$this->cache->memcahed->set('name','nor',3600); // デフォルトだと60で消える
echo 'name: '.$this->cache->memcached->get('name');

結果:
name: nor

もし memcached だけなら、あらかじめアダプタを指定してロードする。

$this->load->driver('cache', array('adapter' => 'memcached'));
$this->cache->set('name','nor');
echo 'name: '.$this->cache->get('name');





110429_013122

こんな本を借りてきた。

webドキュメントに勝ることはないが、広く概要を理解するには本って便利だよね。電子書籍が加速してくれたら嬉しいんだけど…(そのためにiPad買ったのに)。

なんとなく眺めてたらCodeIgniter利用での構築例が後半にあった。

俺もCodeIgniterがいいと思う。


ところで2011年2月、気づいたら2.xがリリースされてたのね。

ちょうどいい機会なので、ポケットウォーズの構築も2.xにアップグレードして継続しよー。


テンプレートエンジンにSmartyを導入してた部分で、final_outputのprotectedエラーが吐き出された以外は特に変更内容どおりの改修で済んだ(コアクラスの継承クラスが /libraries → /core くらい)。

-$CI->output->final_output .= $this->fetch($template.'.html');
+$CI->output->append_output($this->fetch($template.'.html'));

初めからメソッド利用しておくべきでした。


↑このページのトップヘ