プログラム

Ethnaあれこれ

EthnaのプロジェクトルートディレクトリはEthna_Backend::getBaseDirメソッドで取れる。
ViewクラスやActionクラスで、

$this->backend->getBaseDir();

とすれば、「 /home/httpd/doc/ethna_root 」の様な形式で取得可能。

あと、etc/project_name-ini.phpで定義していある$configを丸ごと取りたいとき*1

$config = $this->config->config

と取るのはありなのだろうか?

*1:この様なことをするのがそもそもありえないのかもしれない。。。

{foreach}

今一度、Smarty
keyとvalue用の変数が一文字なのは考える気力が無かったからです。あしからず。


{foreach from=$array item=v key=k name=loop_name}
{$k}=>{$v} <br>
{foreachelse}
配列が空の場合。(ここでは$array)
{/foreach}

{foreachelse}ってのを知らなかった。勉強不足。反省。

勉強中

昨日、買い物に行った際に買った本で勉強中。
この本、よいですね。
暖かいコーヒー飲みながら本見ながら試しにMacのターミナルで試してみたり。
それにしても今日は寒いぞ。足が冷える。

PHP Hacks ―プロが教えるWebプログラミングテクニック

PHP Hacks ―プロが教えるWebプログラミングテクニック

PEAR::DB_DataObject

アップグレードしなきゃなぁ。メモしておく。

$ pear list-upgrades

PEAR.PHP.NET AVAILABLE UPGRADES (STABLE):
=========================================
CHANNEL PACKAGE LOCAL REMOTE SIZE
pear.php.net DB_DataObject 1.8.0 (stable) 1.8.4 (stable) 58kB
pear.php.net Mail 1.1.10 (stable) 1.1.14 (stable) 17.2kB

Ethnaで構築されたサイトを携帯で見た際のトラブル

トラブルといってもEthnaが悪いのではなく、自分がphp.iniをきちんと設定できていなかったのが悪かったのだが、


<?php
class Hoge_View_Foo extends Ethna_ViewClass
{
function preforward()
{
$foo1 = $this->session->get('foo1');
}
}
?>

とか、Smartyの中で


<input hidden={$session.foo1} name=foo1>

とかといいう感じでEthna_Sessionからセッション値を取ろうとしてもとれない。
手元の環境では問題なくて、運営する予定のサーバに持って行くとダメ。
そして、ダメな場合は携帯のブラウザのみ。PCのブラウザからであれば問題が無い。

悩む、悩む、大いに悩む。
携帯のブラウザの様にクッキーが利用できない場合は、

session.use_trans_sid 1

として、ハイパーリンクの相対URLにセッションIDを付与して解決すると思っていたのだが、それをしていてもNG。

こまったときのML頼み。ということで過去ログを見てみる。
ここにあった。

session.use_cookies 0

とすればよいとのこと。こうすると、要はセッションをURLに付与し、クッキーを利用しない。と明記するとよいみたい。

i18n

I18N (Internationalization)

  • 読み方はアイ・イチハチ・エヌ
  • 国際語化(Internationalization)の略であり、多言語・多国語対応の意味。
  • 先頭の“I”と末尾の“N”の間に18文字…。なので略してることになるらしい。(英語だと)

Ethna_ActionClassのメンバ変数

メンバ変数で与えられているインスタンス。やっと覚えてきました。
Ethna_ActionClassを継承したクラスではこれらのインスタンスにアクセスすることで簡単に利用することができる。
例えばDBにアクセスするためにはEthna_BackendオブジェクトのgetDB()メソッドを呼べばEthna_DBオブジェクトが取得できる


<?php
class ... extends Ethna_ActionClass
{
function perform()
{
$db = $this->backend->getDB();
}
}

以下、メンバ変数となっているインスタンスの一覧。もっとも、API見れば一発ですが。自分の頭の中に入れるためにも書いてみる。

  • $ae (Ethna_ActionErrorオブジェクト)
  • $af (Ethna_ActionFormオブジェクト)
    • フォーム操作
  • $backend (Ethna_Backendオブジェクト)
    • 今のところDBオブジェクトを取るのに使っているくらい。他にもいろいろあるのだろうけど。
  • $config (Ethna_Configオブジェクト)
    • etc/(プロジェクト名)-ini.php の $config = array(...) で設定されている内容へのアクセサ。
  • $session (Ethna_Sessionオブジェクト)
    • セッション管理
      • 開始: $this->session->start()
        • 引数与えるとそのセッションの有効秒数指定, 0だとクッキー。
      • 設定: $this->session->set(キー, 値)
      • 取得: $this->session->get(キー)
      • 終了(破棄) $this->session->destroy()
  • $i18n (Ethna_I18Nオブジェクト)
    • まだ使ったことがなかったり、そもそもi18nってなんだ?

Ethna_ActionForm::getHiddenVars

確認の画面とか、元に戻って再編集といった様な具合の処理をさせる際にhiddenとして変数を控える際に使える。
画面で入力を一通りユーザに行ってもらって次の画面に行って確認させた際に元に戻って再編集。とされた様な場合とか。
Ethna_ActionClassを継承しているアクションクラスで以下の処理を書く。


<?php
class Sample_Action_Index extends Ethna_ActionClass
{
// 中略

function perform() {
$hidden_vars = $this->af->getHiddenVars(null, array('form_foo1', 'form_foo2'));
$this->af->setAppNE('hidden_vars', $hidden_vars);

return null;
}
}
?>

なお、getHiddenVarsの定義は、

string getHiddenVars ([array $include_list = null], [array $exclude_list = null])

  • array $include_list: 配列が指定された場合、その配列に含まれるフォーム項目のみが対象となる
  • array $exclude_list: 配列が指定された場合、その配列に含まれないフォーム項目のみが対象となる

(Ethna APIリファレンスより)

となっている。ActionFormで宣言してある中からhiddenで抽出する対象を選ぶか、例外を選ぶかのいずれかを行うことになる。
ラジオボタンチェックボックスも対象になるので、そういったものを例外にするときや、パスワードの様に再入力が必要なものは除外する等、楽な方を選べばよいと思われる。
ActionClassでgetHiddenVarsを呼び出した後、以下の記述があるのでビュー側にhiddenで展開された文字列がアサインされる。

$this->af->setAppNE('hidden_vars', $hidden_vars);

ActionForm::SetAppNEを使うのは、入力文字列のエスケープ無しにそのまま戻すためですね。*1
Smartyのテンプレート側で次の様に書くとhidden表記が展開される。


<html>
<head>
(略)
</head>
<body>
<form>
{$app_ne.hidden_vars}
</form>
</body>
</html>

実際に通して実行されると、{$app_ne.hidden_vars}の部分に、


<html>
<head>
(略)
</head>
<body>
<form>
<input type="hidden" name="foo1" value="hoge1">
<input type="hidden" name="foo2" value="hoge2">
(以降、ActionFormで定義した数分挿入される)
</form>
</body>
</html>

といった具合にActionFormで定義され、且つEthna_ActionForm::getHiddenVarsの呼び出しの際に対象として選ばれたもの、あるいは例外として選ばれたフォーム以外の値が全て記述されることになる。
ちなみにAPIリファレンスは、これ

*1:きっと。多分。

MySQLで列の追加

いや、足すような設計するなよ。って感じもしないでもないが、やらなきゃならんのでやった。

ALTER TABLE (テーブル名) ADD (列名) (型)