Posts tagged IE
OpenPNE コンテンツをセンター寄せにする
0OpenPNE のデザインは左寄せなのですが、これをセンター寄せに変更したいという要望がありました。
最初は CSS に
.ext_sub_container { width: 720px;margin: 0px auto; }
を追加してみたのですが、やはり IE ではうまく表示できません。
そこでテンプレートを見直すと
inc_header.tpl 339行目
<div align="left">
というを
<div align="center">
に変更したらうまく行きました。
ちなみに OpenPNE テンプレートのカスタマイズ でも書きましたが
/openpne/webapp/modules/pc/templates/inc_header.tpl を
/opnepne/webapp_ext/modules/pc/templates/inc_header.tpl に
コピーしてからカスタマイズすると元のファイルを残したままカスタマイズできるのでお勧めです。
その場合は /openpne/config.php の
define('USE_EXT_DIR', false);
を
define('USE_EXT_DIR', true)
に変更するのをお忘れなく。
CakePHP findAll で INNER JOIN する方法
1開発中の CakePHP の案件でどうしても INNER JOIN する必要があり、かといって SQL を直接書くのは他のコンポーネントとの兼ね合いでできるだけ避けたい(というより無理)な状況だったので、絶対何か方法があるだろうと思いソースを調べたのでメモしておきます。
/cake/libs/model/model_php5.php の findAll メソッドに
$queryData = array('conditions' => $conditions, 'fields' => $fields, 'joins' => array(), 'limit' => $limit, 'offset' => $offset, 'order' => $order );
というのがあり、’joins’ に 空の配列を入れている。
この ‘joins’ の使い方を調べたら、
array( "type" => "INNER", "alias" => "", "table" => INNER JOIN するテーブル, "conditions" => INNER JOIN の ONに指定する条件, );
という配列を入れると INNER JOIN してくれるようです。
ただ、findAll の中で joins に空配列を入れているので、findAll を実行するときのパラメータに joins を指定しても無視されてしまう。
そこで、モデルの beforeFind メソッドを使用することにした。このメソッドは findAll の実行する前に呼ばれるメソッドです。
findAll を実行するモデルに次の beforeFind を定義
function beforeFind(&$queryData) { $queryData["joins"][] = array( "type" => "INNER", "alias" => "", "table" => "`model_name`", "conditions" => array("model_name.field=model_name2.field2"), ); return true; }
これで実行された SQL を確認すれば INNER JOIN されれいます。
OpenPNE ユーザID からユーザ情報を取得するグローバル関数
1OpenPNE をカスタマイズしていてユーザID からユーザのニックネームなど簡単に取得できないかと調べてみると、色々なグローバル関数がありました。
openpne/webapp/lib/db/member.php 内で各種定義されています。
ユーザ情報のよく使う部分のみを取得する
- 関数名
- db_member_c_member4c_member_id_LIGHT($c_member_id)
- 引数
- int $c_member_id ユーザID
- 戻り値
- array ユーザ情報
引数はユーザ IDで、ユーザ情報が連想配列で戻されます。
array( 'c_member_id' => 'ユーザID', 'nickname' => 'ニックネーム', 'image_filename' => '画像ファイル名' )
ニックネームはそのままテンプレートで表示できます。
画像ファイル名は以前のエントリの「OpenPNE 画像の保存、表示方法」や「OpenPNE 画像を色々なサイズで表示する」を参考に表示させることができます。
ユーザ情報を取得する
bool $is_secure `c_member_secure`の項目を取得するかどうか
bool $with_profile `c_member_profile`の項目を取得するかどうか
string $public_flag プロフィール項目を取得する場合の公開設定(public, friend, private)
その他
まだまだ色々な関数があります。興味ある方はソースを調べてみるとよいかと思います。
CakePHP 保存したデータをすぐに find したい場合キャッシュを OFF にする
1CakePHP で保存したデータをすぐにfind するとキャッシュが効いている為に保存したばかりのデータを取得することができません。
その場合はキャッシュを OFF にすることにより新しいデータを取得することができます。
$this->Model->cacheQueries = false;
ホスト名にアンダスコア(アンダバー)を使用すると IE でクッキーを設定できなくなる
4test_hoge.example.com のようにアンダスコアをホスト名に使用すると IE ではクッキーを受け付けなくなります。
ホスト名ではアンダスコアは使用できない文字なので IE では受け付けないようになっているようです。
これは結構はまり解決までに時間がかかってしまったのでメモしておきます。
Firefox ではアンダスコアの入ったホスト名でもクッキーを受け付けます。
ホスト名を設定してくれたサーバ管理者に聞いても知らなかったようなので、はまる人多いのではないかと思います。
実は結構常識だったりしますか?
CakePHP findAll の条件に NOT IN 演算子を使う
0前回の投稿の「CakePHP findAll の条件に IN 演算子を使う」のつづきで、NOT IN 演算子を使用するときに少し調べたのでメモしておきます。
$this->model->findAll('field NOT IN (1, 2, 3)');
または、
$this->model->findAll(array('NOT' => array('field' => array(1, 2, 3))));
で出来ました。
CakePHP findAll の条件に IN 演算子を使う
1CakePHP の findAll の条件に IN 演算子には下記のように条件を指定すればOKです。
$this->model->findAll(array('field IN (1,2,3)'));
または、
$params = array(1,2,3); $this->model->findAll(array('field' => $params));
配列で渡せば勝手に IN 演算子を使用してくれるんですね。
OpenPNEでのSmarty の覚書
1「OpenPNE PHP で作成したプログラムを組み込む」で書いたように、
/openpne/webapp_ext/modules/pc/page/hoge_foo.php に
class pc_page_hoge_foo extends OpenPNE_Action { function execute($requests) { // ここに処理を書く } }
のようにすると ?m=pc&a=page_hoge_foo でアクセスできるようになります。
このときにどうやって Smarty に値を渡すのか少し戸惑ったのでメモしておきます。
Smarty タグ
通常は 「{」「}」 ですが、OpenPNE では 「({」「})」 です。
assign
$smarty->assign("var", $var);
のようにして Smarty に値を渡したいときは execute メソッド内で
$this->view->set("var", $var);
とすればOK。
display
$smarty->display("hoge_foo.tpl");
は自動的にやってくれます。
default_modifiers (escape)
また、OpenPNE の smarty オブジェクトはオブジェクト生成時に
$smarty->default_modifiers に escpae 修飾子が設定されているので、
テンプレート変数に HTML タグが設定されていて HTMLタグを出力したい場合は
({$var|smarty:nodefaults})
とすれば、escape 処理されずに出力されます。
私は HTML_QuickForm をよく使うので、form タグ関係を出したいことがありますので、その場合に使用しています。
CakePHP HTML ヘルパーで textarea を出力する
1CakePHP の HTML ヘルパーでテキストエリアを出力するには下記のように書きます。
<?php echo $html->textarea("Model/field", array("cols"=>20, "rows"=>5, "value"=>"hoge")); ?>
checkbox や radio などと違って第2引数に HTML 属性値がくることに注意が必要です。
array("value"=>"hoge")
などと書くことにより初期値を入れることができます。
CakePHP HTMLヘルパーで checkbox を表示する
1HTMLヘルパーで checkbox を表示するには下記のように書きます。
<?php echo $html->checkbox('Model/field', null, array('value'=>1)); ?>
出力される HTML は下記のようになります。
(実際は1行で出力されますが改行入れています)
<input type="hidden" name="data[Model][field]" value="0" id="ModelField_" / <input type="checkbox" name="data[Model][field]" value="1" id="ModelField" />
checkbox と同じ名前の hidden を勝手に作ってくれるのでチェックされていなくても必ず $this->data["Model"]["field"] には値が帰ってくるのでうれしいかも。
ちなみに第2引数は checkbox では使用されていませんでした。
他のメソッドと統一するためにあるのでしょう。
第3引数に
array('checked'=>1) or array('checked'=>true) or array('checked'=>'checked')
などとするとデフォルトでチェックが入ります。
ちなみに HTML_QuickForm のように勝手に label タグで囲んではくれないので、チェックボックスの後ろに書かれた項目名などをクリックしてもチェックされるようにしたければ自分で label タグを書く必要があります。checkbox の ID は ModelField のようになるので、
<label for="ModelField"><?php echo $html->checkbox('Model/field', null, array('value'=>1)); ?>項目名</label>
とすれば「項目名」のテキストをクリックしてもチェックすることができるようになります。