プログラム

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 (列名) (型)

PEAR::HTTP_Request

このパッケージを用いると以下の処理がPHPスクリプトから行える。

このパッケージは、HTTP リクエストを実行するための簡単な方法を提供します。 GET/POST/HEAD/TRACE/PUT/DELETE、Basic認証、プロキシ、プロキシ認証、SSL、 ファイルアップロードなどをサポートします。

PEARのHTTP_Requestを利用してWeb上のアップロードスクリプトに対してファイルのアップロードをする処理は以下の様にかける。

  • 下のプログラムでは/Users/sample/foo.doc というファイルを foo_upload.doc という名前で送信


<?php
require_once "HTTP/Request.php";

$http_req =& new HTTP_Request("http://(アップロードする先のURL)");
$result = $http_req->addFile("foo_upload.doc", "/Users/sample/foo.doc");

if (PEAR::isError($result)) {
print $result->getMessage();
}
else{
$response = $http_req->sendRequest();
if (!PEAR::isError($response)) {
print $http_req->getResponseBody();
}
}
?>


なるほど、これを使えばかなりごにょごにょできそうな気がしてきた。

PHPとMySQLの接続エラー@MacOS

ちゃんとAppleのサイトに書いてあった。最初に見つけなきゃいけません。

MySQLPHP を同じ Mac OS X Server 10.4 で実行しているときに、PHPMySQL に接続できなくなることがあります。PHP は、同じホスト上の MySQL サーバと通信する場合に通信用のソケットファイルを使用し、これを「/tmp/mysql.sock」で探します。Mac OS X Server 10.4 では、MySQL はこのソケットファイルを「/var/mysql/mysql.sock」に作成します。

ということで、修正後、無事解決。
PHP.iniでMySQL接続時に使うソケットファイルの位置を教えてあげればよい。

ちょっとしたこと

PHPでコードを組んでいて、

foo.php

<ファイルここまで>

app/action/ の中のとあるファイル

<ファイルここまで>

そうすると以下の様なwarningが表示される。

##########[1640](WARNING): global.session_start(\class\Ethna_Session.php:86): [PHP] E_WARNING: session_start(): Cannot send session cache limiter - headers already sent (output started at ###..php:275) in C:\php-Win32\PEAR\pear\Ethna\class\Ethna_Session.php on line 86

ヘッダを既に送っただの。とある。
なぜ出力の文を書いていないのに、出力したのか悩むこと数十分。
requireしている対象のプログラムの末端の行に空白の改行が入っていることに気づく。

消してみた。

問題なく通る様になった...。なるほど、改行コードが出力されたことになってしまう?のかな。ということで解決。

MacOS上のApache等のメモ。
Vineなどの様にすぐ位置が頭に浮かばないので。。。
てか、記憶力が悪くなっただけ、っていう気もしなくはないけど。

  • /Library/WebServer/Documents
    • wwwサーバのDocumentRoot
  • /private/etc/httpd/httpd.conf

そして、14時現在。
MacOS上で動かしているMySQLPEAR::DBで接続できずエラーになる。

project[628](WARNING): global.mysql_connect(:): [PHP] E_WARNING: mysql_connect(): Can't connect to local MySQL server through socket '/var/mysql/mysql.sock' (2) in /usr/lib/php/DB/mysql.php on line 237

ふと気づけば、ご飯を食べていないのでここで一旦終了。
何故、ここで引っかかってしまうかなぁ。非常に悔しい。

MySQLのVARCHAR型とCHAR型

ここより。
基礎が抜けているのでこの違いが明確に理解していなかった。
こういうところが周りに人がいない故の弊害。
簡単に解釈すると、

  • CHAR型で宣言すると、とにかくテーブルの作成の際に行った宣言の通りの長さが取られる。
  • VARCHAR型だと、任意長になるので、レコードに登録している文字列長に左右される。

MacOSX10.4.6 でのphp.iniの位置

全くの初期状態では、

/private/etc/php.ini.default

があるので、これをコピーして編集すればいいんですかね。