やっとVer2.9.2にアップしました。
以前からアップデートの表示は出ていたのですが、自動アップデートは「ダウンロードしています。」の表示から動かなくなり断念していました。
プラグインのアップデートは問題なく動いていたのに、本体のバージョンアップだけがダウンロードうまくいかずの状態でした。
ダウンロードするフォルダが違っていてパーミッションの問題が発生していたのかもしれません。
今回コードを表示するプラグインを導入しようと思い立ったのですが、どうも現状バージョンでは対応していないようなので重い腰を上げてバージョンアップしました。
まず、現状のデータベースをバックアップし、ローカルにダウンロードしておきました。またWordpress内のすべてのファイルをダウンロードしてローカルに確保。
その後、すべてのプラグイン動作を停止して、WordPressのマニュアルを参照しながら削除すべきフォルダやファイルを削除していきます。その後、ローカルにダウンロードしておいた最新版のzipファイルをFTPでアップロードした後コマンドラインから解凍しました。
その後ブラウザでwordpressのアドレス打って見るとデータベースの変更確認が出ましたのでYESで無事終了しました。
特に問題も起こらず、停止していたプラグインを有効化したら、以前と同様の動きになりました。
元ファイルとデータベースのバックアップをしっかり取っておけば、あまり心配することなくできるようです。
ワードプレスのアップグレード詳細
上記のページを参考に作業しました。
Jiro WordPress WordPress
ひとつのモデルの中で関数を作成して簡単に利用したいと思ったのですが、結果を返す際に
他のモデルも参照しなくちゃいけなくなりました。
このあたりは、アソシエーションを使ったほうが良いのかもしれませんが、データベースの作成がまずくて
うまく出来そうに無いので、モデル内の関数で他のモデルを呼び出して見ました。
$this->loadModel('ModelA');
これは、やはりダメでした。
importでmodelを呼び出して使うみたい。
App::import('Model','modelA');
$modelA = new modelA;
$modelA->find($conditions,null,$orders);
こんな感じでいいようです。さて今から検証。
検証の結果うまくいきました。上記App::import(‘model’と小文字になっていたところを訂正。
モデルの中で他のモデル呼び出すって、ちょっと邪道かなという気もします。
componentあたりに関数作成したほうがいいかもしれませんね。
また、コントローラの中でusesでたくさんのモデル定義していると使わなくてもSQLが走っているようです。
基本になるモデルひとつだけusesで定義しておくか、$uses=null;にしておいて、必要なアクションで必要なモデルを
loadModelしたほうが良い気がしますね。
まだパフォーマンスを上げる段階ではないですが、一通り動作するようになれば、次はパフォーマンス向上が大事だと思います。
現在はWindowsXPの非力なマシン上でXampp環境でのテストですが、ファンが唸ってますからねw
本番では随分昔のDellサーバーに乗せる予定です。こっちも非力ですからね。
Jiro cakePHP cakePHP, メモ
たまたま、本屋に行く機会があったのでちょっと立ち読みしてたらjQueryの本を見つけました。
基本的な使い方はWebで調べると色々出てくるのですが、この本はサンプル集が多くて「メニュー」「グリッド」「ツールチップ」などが
掲載されていたので思わず購入してしまいました。
プラグインの使い方はWebで調べるの結構面倒なんですよね。まあ、例に漏れずすべてのプロパティやアクションを紹介している
わけではないのですが、とりあえず使ってみるきっかけにはいいですよね。
それに、度忘れしちゃうことが多いので、さくっと引いてみて「ああ、そうだった。」って感じで使ってます。
Jiro cakePHP cakePHP, JavaScript, jQuery
連想配列(modelの内容をDBからとってきたもの)の配列。要は複数レコードを入れた配列なんですが、
foreachで回して、項目を変更したのだけど、元の配列自体に変更が及んでいないようで、その後saveAllしても
DBに反映されていない。
for文で直接もとの配列を書き直してみよう。
foreach ($bs as $b){
$b['model']['data'] = "test";
}
こういう風にすると「$bs」のなかみ$bs[0]['model']['data']は書き換えられなかった。
for ($i=0;$i<count($bs);$i++){
$bs[$i]['model']['data']="test";
}
こうしたらうまく書き換えてくれた。
findなどでデータベースのレコードを取得する場合の条件の書き方でくだらないミス。
$conditions = array('nenrei>' => $nenrei);
フィールド名と比較演算子の間のスペース忘れると変なことになる。
where 'nenrei>' = 1
比較演算子がフィールド名の一部と誤認識される。つーか、空白で区切らないと当たり前のことですね。ww
Jiro cakePHP cakePHP, メモ
ちょっと複雑なデータ更新が必要になってきたので、トランザクションを調べることにした。
ひとつのテーブルで更新と追加が同時発生、他のテーブルでも同様という風に二つのテーブルにまたがる処理ですが
アソシエーションでは定義できないようなもの。
まずMySQLのテーブルがMyISAMだとロールバックしても効かないので使えない。InnoDBに変更が必要となる。
show table status;
で現状の確認をする。MyISAMで作っている既存テーブルもInnoDBに変更可能。
変更するには、phpMyAdminであればテーブルの「操作」で「ストレージエンジン」を「InnoDB」に変更して実行押すだけ。
alter table 'xxxx' engine=InooDB;
が実行された。もちろんコマンドラインから、これを打ってもOKです。
さてさて、begin() commit() rollback() をどこで定義しておくか。
必要なテーブルのモデルだけで定義しておいてもいいけど面倒ですね。思い切ってapp_modelに書いとけば全部のモデルで継承してくれますから、これでいいかな。
いつものように、cake以下は触らないお約束で、cake/libs/modelのなかのapp_model.phpをapp/models以下にコピーしておいて追加します。
function begin() {
$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
$dbs->begin($this);
}
function commit() {
$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
$dbs->commit($this);
}
function rollback() {
$dbs = & ConnectionManager::getDataSource($this->useDbConfig);
$dbs->rollback($this);
}
これで、モデルの関数になるのでモデル名->begin()とかで使えます。
2つのモデルを同時更新なら
ModelA->begin();
ModelB->begin();
処理ほにゃらら
なんか問題あったら
ModelA->rollback();
ModelB->rollback();
エラー無く終了。
ModelA->commit();
ModelB->commit();
こんな具合かな。それとsavaAllを使うときの注意もあった。saveAllの外側でトランザクション開始していてもループの途中でコミットされちゃうみたいです。対策としてはパラメータを追加しておくこと。
ModelA->saveAll($datas ,array('atomic'=>false);
こんなおまじないが必須だ。
追記:どうもModelA ModelB両方にbegin() rollback() commit()を行わなくても、ModelAだけやっておけば、両方に効力があるという記述を発見。まだ未検証です。
追記:検証しました。
実行されたSQLも確認しましたが、どれかひとつのモデルでトランザクション操作しておけばOKです。
Jiro cakePHP cakePHP