RSS
 

HABTMの注意事項

13 7月

CakePHP1.2でloadModelを使ってモデルを用意することがあるが、
その際予期していたクラスでなく、AppModelが入ってくることがある。

ひとつの原因として、綴りミスがある。
しかし綴りは合っているのにAppModelになってしまったり、
loadModelする場所によってAppModelになったりちゃんとしたクラスが呼び出されたりする。

この原因はHABTMにある場合がある。

たとえばposts, posts_tags, tagsというテーブルがあったとする。
この時、posts_controller.phpでは自動的にposts_tagsとtagsが初期化されるのだが、
この時連結であるposts_tagsがAppModelとして初期化されていた。
そのため、以後loadModelでPostsTagを呼びだすとAppModelとして返ってきてしまい、
PostsTagに宣言してあった関数などが呼び出せなくなったりしてしまう。
(すべての環境、バージョン等でそうかは知らない)

対処法としては、PostモデルのHABTM以外にhasManyとしてPostsTagを宣言しておけば良い。
ご注意を。

 
No Comments

Posted in CakePHP

 

携帯サイトその2

05 7月

以前、CakePHPでrender関数をオーバーライドして
自動的に携帯テンプレートを振り分ける方法を紹介した。
それにも関連するが、追加のプログラムを紹介。

	function _mb_render() {
		$this->layout = 'mobile';
		$output = $this->render();

		$contents = mb_convert_encoding($this->output, 'SJIS', 'UTF-8');
		echo $contents;
		exit;
	}

例えば上記は明示的に携帯サイトの出力を行ないたい場合などに便利。
最近のrender関数は返り値で出力内容を返してくれるようなので、
上記だけで全部済んでしまう。
mobileのlayoutのメタタグにはshift_jisと書いておく必要はあるが、
基本的に全部プログラムはテンプレートはutf-8で作ることが出来る。
(ただし、別途GETやPOSTの取得は手動でshift_jisからutf-8に変更したりは必要)

他にも、上記の方法を使ったりrender関数をオーバーライドしたりすることで、
携帯サイトだけでなくPC側のopensocial用のプログラムなどにも利用出来る。

{
    'html' : $output,
    'parameters' : $parameters,
}

みたいな感じのjsonを出力すれば
アプリケーション側では受け取ったhtmlをそのままinnerHTMLにいれるだけで
楽にアプリが作成可能。

 
No Comments

Posted in CakePHP

 

cronを使う

29 6月

以前、CakePHPにて別の方法でcronを使用する方法を書いていましたが、
バージョン1.2以降はシェル機能が付いているのでそちらを利用する方が正解です。
とりあえず一例だけ載せておきます。

vendors/shells/test.php

class TestShell extends Shell {
	var $uses = array('Test');

	function main() {
		$this->Test->find('all');
		echo 'finish';
	}
}
0 0 * * * cd /dir/at/app;php cake/console/cake.php test
 
No Comments

Posted in CakePHP

 

WordPress3.0をmysql4.0で使う

29 6月

現在のWordPressの最新版である3.0をインストールしようとしたところ、
なんとmysqlのバージョンが4.0だったためインストールが出来なかった。

しかし無理やりインストールしてみたのでそれの備忘録。
とりあえず投稿などはできるようですが、正しく動くかどうかは一切保証できません。

wp-admin/install.php
150行目に$mysql_compatでバージョンをチェックしているので、次の行に

$mysql_compat = true;

として無理やりOKにする。

wp-includes/wp-db.php
同じ意味で1511行目check_database_versionの一番最初の行に

return;

をいれる。

上記でデータベースバージョンのチェックを無視。
あとはSQLをver4にあわせなければならない。
とりあえず下記を修正すればインストール、投稿あたりはいける。

wp-admin/includes/schema.php
25行目まで、$charset_collateに値を入れているため次の行に

$charset_collate = '';

で文字コード設定をなくす。

あとはON DUPLICATEというクエリを使用しているところがあるので、これを修正する。

wp-includes/functions.php
604行目をまるまる下記に置き換え。

	if ($wpdb->get_row($wpdb->prepare("SELECT * FROM `$wpdb->options` WHERE `option_name` = %s", $option))) {
		$result = $wpdb->query( $wpdb->prepare( "UPDATE `$wpdb->options` SET `option_value` = %s, `autoload` = %s WHERE `option_name` = %s", $value, $autoload, $option ) );
	} else {
		$result = $wpdb->query( $wpdb->prepare( "INSERT INTO `$wpdb->options` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, %s)", $option, $value, $autoload ) );
	}

wp-includes/taxonomy.php
使っているのかは知らないが取りあえず1777からの2行を下記に置き換え。

		if ( $values ) {
			if ($wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->term_relationships WHERE object_id = %d AND term_taxonomy_id = %d", $object_id, $tt_id))) {
				$wpdb->query("INSERT INTO $wpdb->term_relationships (object_id, term_taxonomy_id, term_order) VALUES " . join(',', $values) . " ");
			} else {
				$wpdb->query($wpdb->prepare("UPDATE $wpdb->term_relationships SET term_order = %d WHERE object_id = %d AND term_taxonomy_id = %d", $term_order, $object_id, $tt_id));
			}
		}
これでなんとなく動くようだ。
 
 

phpのcgiモードでHTTPのリクエストヘッダを取得

19 6月

リクエストヘッダを取得するにはgetallheaders()関数を使えばいいのだが、
モジュール版でしか使えない。
CGI版ではどうすればいいか調べたところ、方法があった。
RewriteRule ^(.*) – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
を.htaccessにかけば$_SERVER[HTTP_AUTHORIZATION]のようにして取得可能になる。
CakePHPだと、webroot/.htaccessに

RewriteEngine On
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

で取得可能。
RewriteCondの後だと取得できなくなる。

 
No Comments

Posted in php

 

さくらサーバーにswfmillをインストール

06 6月

さくらサーバーにswfmillをインストールした備忘録。
プランはビジネスの安い方。

swfmillをダウンロードしてインストールしますが、
最新バージョンはlite用パッチが上手くきかないので0.2.12を使う。

wget http://swfmill.org/releases/swfmill-0.2.12.tar.gz
tar xzf swfmill-0.2.12.tar.gz
cd swfmill-0.2.12
wget http://lab.klab.org/files/flash/encoding.patch
patch -p1 < encoding.patch

configureは自分のディレクトリのパスを指定。

./configure –-prefix=/home/username

エラーがでるのでソースを修正。
src/gSWFParseXML.cppの31行目

size_t r = iconv(cd, (const char**)&pin, &inbytesleft, &pout, &outbytesleft);

src/gSWFWriteXML.cppの31行目

size_t r = iconv(cd, (const char**)&pin, &inbytesleft, &pout, &outbytesleft);

libpngのバージョンが合わない場合は下記も修正。
pngは自分で用意するならチェックいらないだろう…という勝手な前提。
src/swft/readpng.cの72行目

// if (!png_check_sig(sig, )
// return 1; /* bad signature */

これでmake & make installで、phpから起動してみたらxmlが出力されたところまでは確認。
あとは未確認。

 
 

flexコンポーネントが重い

21 4月

mxmlで配置したImageコンポーネントを移動させると、かなり重い。
同じ画像でも、動的に作成したBitmapをCanvasにaddChildして動かすと
速さが全然違う。
性能のいいPCだと違いは分からないが、CPUの弱いPCだと顕著にわかる。

自分の環境で確認したところ、
Imageコンポーネントをひとつ動かすだけでも平均17fpsだったが、
Bitmapにすると設定通りの30fpsになった。
もちろん、Imageコンポーネントを動かさないで配置しているだけなら
全く問題はないようだ。
これは気を付けた方がいいかもしれない。

 
No Comments

Posted in flex

 

scripts_for_layoutとは?

21 3月

いつのまにやらlayoutにscripts_for_layoutという変数が出力されている。
これは何だろう?
viewを見てみると、addScriptというメソッドがある。
これを利用すれば良いようだが、どこで使うかが分からない。
調べてみると、各々のコンテンツの中で使えば
そのスクリプトがhead内に入るらしい。
例えば以下のように使う。
index.ctp

<h2>○○の一覧</h2>
<?php foeach… ?>
<?php endforeach ?>
<?php $this->addScript($javascript->codeBlock(’alert("alert in head!");)) ?>

すると出力時は

<html …>
<head>
 :
 :
<script type="text/javascript">alert("alert in head!");</script>
</head>
<body>
 :

という感じ。

追記となるが、上記は半分間違い。
実際にはJavascriptHelperのcodeBlock, linkメソッドやHtmlHelperのcssメソッドの引数で
その場に記述するかscripts_for_layoutsに記述するかを指定できる。
基本的にはそっちを使うべき。
ソースを見てみるとinlineがどうたらこうたらで指定するようなので一度ご確認を。

 
No Comments

Posted in CakePHP, php

 

cakephpのモデル

13 10月

モデルでreadしてもなぜかアソシエーションしているものが取れなかった。
よくよく調べてみると、モデルのファイル名を間違えて複数形にしていた。
しかしなぜかプログラムはちゃんと動いている。
つまり単純なモデルならばモデルファイルを作らなくても
良くなっているということだ。
知らないところで進化し続けているなあ。

 
No Comments

Posted in CakePHP

 

MySQL文字列の数値変換

09 9月

MySQLにて文字列を数値に変換してソートなどする際、
CASTを用いるのだが、
MySQL3などだとその関数が未対応。
これはこまった。
が、以下のようにすればいけるようだ。
SELECT * FROM table ORDER BY string_id + 0
しかも、
1011
1012
1013
1013-2
1013-3
1013-4
1014
のように、ちょっとサブ的な要素を付けている場合も、
ちゃんと-2など余分な部分はカットした状態でソートしてくれる。

 
No Comments

Posted in MySQL