Ethna_Session

なんかプロバイダの関係かちょこちょこ接続IPが変わってて
Ethnaのセッションが上手く動いてなかった

Ethna_SessisonでREMOTE_ADDR見てるとこがあるので
最初isVallidを空でオーバライドしたんだけど
だめな場合があったので

session_start) {
if (!empty($_COOKIE[$this->session_name]) || session_id() != null) {
setcookie($this->session_name, “”, 0, “/”);
}
return false;
}
return true;
}
}
?>
のようにして
Controlerでこのセッションを利用するように記述した

Berkeley DBインストール

postfixを設定しようと思ったら

db*-develがありません

とおこられたのでインストールしてみることにする

http://www.oracle.com/technology/software/products/berkeley-db/index.html

より

db-4.x.x.tar.gzをダウンロードします。

$tar xzvf db-4.x.xtar.gz

$ cd db-4.x.x/
$ cd db-4.x.x/build_unix
$ ../dist/configure –prefix=/usr/local
$ make
$su –
#make install

cp /usr/loca/include/db.h /usr/include/

上でprefix入れてればこれいらなかったかな?

cakePHP 日本語のヴァリデーション

デフォルトのグローバル関数(?)のmaxLengthでvalidationを行うと
strlenが利用されているため
日本語の文字数が正しくカウントされない
ヴァリデーションルールはカスタマイズチェックの場合と同様に
同一モデル内に記述すれば、こちらが参照されるので
function maxLength($data, $max) {
$str = array_shift($data);
$length = mb_strlen($check,mb_detect_encoding($str));
return ($length array(
‘rule’ => array(‘maxLength’, 25),
‘message’ => ‘名前は25文字以内で入力してください。’,
),
で変更せずにOKです

OpenPNE外部認証で招待制

OpenPNEをSlavePNEにしてSOAPによる認証を行おうとしてたのですが
新規登録も受け付けなきゃならなくなりました。
SOAPなんで新規登録のフローは作り直さなきゃかなと思ってたのですが
差し当たり、管理画面の招待制の部分を有効にして更新してみました。

新規のリンクは作ってあったので
sns/?m=pc&a=page_o_public_invite
をクリックしてみても再度ログイン画面が描画されてしまいます。

DBのc_admin_configのIS_CLOSED_SNSの部分を見てもちゃんと更新はされているのですが
プログラム上ではこの値が1のままになっていました。。。

grepして探してみるとwebapp/init.inc の中に

// 外部認証の場合は招待・新規登録はできない
if (OPENPNE_AUTH_MODE == ‘slavepne’) {
// 招待用URLがPC・携帯どちらも空の場合は招待不可
if (!(defined(‘SLAVEPNE_SYOUTAI_URL_PC’) && SLAVEPNE_SYOUTAI_URL_PC) &&
!(defined(‘SLAVEPNE_SYOUTAI_URL_KTAI’) && SLAVEPNE_SYOUTAI_URL_KTAI)) {
define(‘IS_USER_INVITE’, false);
}
define(‘IS_CLOSED_SNS’, true);
}

なる記述が。。。

既存の会員情報を生かしながら、新規を募集するとややこしくなるとは思ってたのですが
それだったらSOAP等になってる場合って管理画面で変更できないようにするのがいいような……

問題解決までは行きませんでしたが、はまり注意ということで

cakePHP ビューでの日付の整形

2009-05-06 03:00:00のような日付のフォーマットを日本語表記に変えたい場合
htmlヘルパーをカスタマイズすると変換が楽になる

$cp cake/libs/view/helpers/html.php app/views/helpers/

としてhtml.phpの複製をしたのち

function dateFormat($date,$format = “Y年m月d日”) {
return date($format,strtotime($date));
}
function df($date,$format = “Y年m月d日”) {
return $this->dateFormat($date,$format);
}
function dfh($date,$format = “Y年m月d日H時”) {
return $this->dateFormat($date,$format);
}
のようにフォーマットを追加して
ビュー内では
$html->dfj($date_str);
※date_strにはタイムスタンプが入っている

参考URL
http://www.jamboree.jp/cms/archives/41
http://cakephp.blog16.jp/index.php/2008/07/01/p27

SimpleXMLObjectを配列にする

SimpleXMLを利用した場合、結果の返り値には
SimpleXMLObjectが帰ってくる
値を表示するときはそのまま表示されるが
フレームワークのviewに渡すとき等
繰り返し処理のために配列に格納する方が便利な場合が多い
そのような場合はSimpleXMLObjectの前に(string)を置いて
型キャストしてから格納することで、通常使っている配列に変換できる
(階層が深い場合や使い方によってはstringでは無くarrayにキャストしてもよい)

$ret = array();
foreach($xml->Result as $val) {
array_push($ret,(string)$val);
}

PEAR::HTML_QuickForm2の文言変更

最近は、フレームワーク全盛で、PEAR::HTML_QuickFormとかあまり使われなくなったかな
原稿を書く都合でマニュアルを見てみると
This package has been superseded, but is still maintained for bugs and security fixes. Use HTML_QuickForm2 instead.
との文字が

ということでHTML_QuickForm2を使ってみます。
基本的には前のバージョンを踏襲しているだろうと思ったのですが
違う部分が結構多いですね

簡単なサンプルということで必須項目のあるものを作ろうとしたのですが
HTML_QuickForm::setRequiredNote()
がなくなっている模様で、文言の変更が出来ませんでした

HTML_QuickForm2では
HTML_QuickForm2_Renderer::setOption()を使います。

書式は
HTML_QuickForm2_Renderer setOption( string|array $nameOrOptions, [mixed $value = null])
Sets the option(s) affecting renderer behaviour
The following options are available:
* ‘group_hiddens’ – whether to group hidden elements together or render them where they were added (boolean)
* ‘group_errors’ – whether to group error messages or render them alongside elements they apply to (boolean)
* ‘errors_prefix’ – leading message for grouped errors (string)
* ‘errors_suffix’ – trailing message for grouped errors (string)
* ‘required_note’ – note displayed if the form contains required elements (string)
こんな感じに指定できます。
$renderer->setOption(array(‘required_note’ => “*必須項目”));

検索であまり情報ひっかからなかったので
簡単なサンプルも載せておきます。

‘選択してください:’,
‘male’ => ‘男’,
‘female’ => ‘女’
);
$form = new HTML_QuickForm2(‘newsletter’);
$name = $form->addText(‘name’)->setLabel(‘お名前:’);
$name->addRule(‘required’, ‘Please provide your name.’);

$email = $form->addText(‘email’)->setLabel(‘E-Mail:’);
$newsletter = $form->addSelect(‘format’, null, array(‘options’ => $format));
$newsletter->setLabel(‘性別:’);
$form->addElement(‘submit’, null, ‘Submit!’);

$renderer = HTML_QuickForm2_Renderer::factory(‘default’);
$renderer->setOption(array(‘required_note’ => “*必須項目”));
echo $form->render($renderer);

if ($form->validate()) {
echo “

SUCCESS!

“;
}

ちなみに、ライセンスがPHPライセンスからBSDライセンスに変わってます。

sshで多段ログイン

前のエントリーでsshを簡単にする方法を書いたが(IP打たないくらいですが)
そこからさらに先のホストに接続に行く場合
ローカル接続のサーバ等、何回もsshするのが面倒なので
Host fumidai1
User root
HostName 222.111.XX.XX
IdentityFile ~/.ssh/id_ssh
Host server2
User root
ProxyCommand ssh fumidai1 nc -w 6000 %h %p
コマンドはssh server2で一つ先までログインできる
ProxyCommandを重ねればさらに先までログインできるが
IPアドレスの解決をしないといけないので
それぞれ一つ先のサーバの/etc/hostsにIPをかかなければならない
上記ではfumidai1の/etc/hostsにserver2のIPアドレスを入れる必要がある

vimの折りたたみ

:set foldmethod= で折りたたみ方式を指定できる manual indent expr marker syntax diff が指定できる markerを指定した場合 /* コメント {{{ */ . . . /* }}} */ と書いてその中でzcと打つと折りたたみzoと打つと折りたたみを開く zC/zOを再帰的に処理を行う