【freo】必要な内部情報をどうやって探すのかのメモ
freoしか書くことねぇのかよ、とか云われそうな感じですが、今いじってる最中なので備忘録としての側面が非常に強いのです。
以降、ほんとに大したこと書いてないです。
さて、もにゃもにゃいじっててふと出会う、「ここんとこのこの情報手に入らないの?」という内容の調査方法について。
私は僥倖なことに、昔(ええと、まだOracleが10gとかなりたての頃)仕事としてSQLを触ってまして、趣味と仕事の境目みたいなところでphpとsmartyもいじってますので、なんとなーーーーく、コードの中身とfreoのDB定義読んでると「まあここがこれでこうだろう」くらいのことは分かるんですが、いかんせん、phpの細かいところはどうもよくわからない。
具体的には、phpのクラスとかなんとかので -> こういうやつ出てくると、拒否反応甚だしくなるのです。
あのー、クラスってさ、なんだろう、あの、わかるんだけど、ええとつまり、無名関数をぱかすかつくるより、関連付けさせておいたらいいよねわかりやすいよねって、そういうことでいいんだろうか。そういうことにしておいてるけど。
とまれまず開くのは、「使おうとしてる機能にあたるphp」。
で、次に「使おうとしてるsmartyに割り当てられてる変数をassinされてる元の変数」。
これはぶっちゃけ、↑をlib全体にgrepかけたほうが早いけど。
たとえば、freoのテンプレートで「plugin_page_siblings のあたりで拾いたいんだよなー」となったら、「plugin_page_siblings」でgrep。
するとこのへんが出る。引っかかったら、該当ファイルのこの行にジャンプ(する機能がgrep備えたテキストエディタには大体ある)(わたしはMkEditorを愛用しています)(休題)'plugin_page_siblings' => $pages,
そしたら該当ファイルの中で、割り当て元の変数に値が入れられているところを探す。
display.page_siblings云々だと、ここですね。
$pages = array(); while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) { $pages[$data['id']] = $data; }
1行目で初期化して、3行目で都度ぶっこみ。
SQLでDBから拾ってきたデータを、「id」の値をキーにハッシュぶちこみしていることがわかります。
次に発行されたSQLを探して遡る。
ていうかまあ、大体直前です。
//ページ取得 $stmt = $freo->pdo->prepare('SELECT * FROM ' . FREO_DATABASE_PREFIX . 'pages WHERE pid = :id AND approved = \'yes\' AND (status = \'publish\' OR (status = \'future\' AND datetime <= :now1)) AND (close IS NULL OR close >= :now2) ' . $condition . ' ORDER BY sort, id'); $stmt->bindValue(':id', $pid); $stmt->bindValue(':now1', date('Y-m-d H:i:s')); $stmt->bindValue(':now2', date('Y-m-d H:i:s')); $flag = $stmt->execute(); if (!$flag) { freo_error($stmt->errorInfo()); }
この例だとSQLが SELECT * なので、楽だけどめんどいですね。カラム名探しにfreoのサイト行かないといけないから。
とりあえず、うすらぼんやりと「記事の公開日時を元に必要なページの行を全部ソート順>ID順の並びで拾う、というのは頭の片隅に置くと。
で、freoのサイトに行って、DBからほしい情報を探して、割り当て後の方でなんとかしたり、手前のほうで何とかしたりすると。
この「なんとか」は、やりたいことに因って変動するのでアレですけれども、ひとまずさわりとして。
ただまあ、大概の値はsmarty側にassignされてるから、smartyでなんとかしていいと思うなあ、freoの場合。
本来smartyは条件分岐とか細かい処理は行わない方がいいスタンスだけど、改造となるとやっぱね