kohana開発日記(installチェック)

VER3.1.1に移行するにともない、install.phpのチェックで、下記メッセージが出ている。Optional Testsではあるし、使うあてがあるわけではないので、とりあえず無視しました。

PECL HTTP Enabled 	Kohana can use the http extension for the Request_Client_External class.
cURL Enabled 	Kohana can use the cURL extension for the Request_Client_External class.

kohana開発日記:IE8標準準拠モードでdivが見えない

これも真の原因まで追い切れていませんが、とりあえずの対処までできました。

view側

        <div id="content">
            <div id="content_left">
                <?php echo $content_left ?>
            </div>
            <div id="content_right">
                <?php echo $content_right ?>
            </div>
        </div>

css

div#content_left {
    width: 52%;
    float: left;
}

div#content_right {
    width: 47%;
    float: right;
}

上記のような感じで、左右にfloatさせているとき、IE8の標準準拠モードに限って、conten_left部分が画面右まで広がって、一部を除いてcontent_right部分が画面から見えなくなりました。HTMLソースには見て取れます。

widthの割合を変えたらOK。right側とleft側に何を表示するかでも違ってきます。幅が広いものをleft側に持ってくると危ういようです。ちなみにFirefoxでもIE8互換モードでも、そんな症状は再現しません。

kohana開発日記:IE8互換モードでxajax動作しない

真の原因まで追い切れていませんが、とりあえずの対策は判明したので記載しておきます。
IE8標準準拠モードとFirefoxでは問題ないが、IE8互換モードとFirefox+IEtabではajax動作が生起しません。エラーログには下記のとおり。
Unable to find a route to match the URI: media/jsxajax_js/JSON.js

    private function _initialize_ajax_functions() {
        if( isset($this->ajax_functions) && count($this->ajax_functions) > 0 ) {
            require_once Kohana::find_file('xajax/xajax_core', 'xajax.inc');
            $xajax = new xajax();
            $xajax->configure('javascript URI', '/media/js/');

基底コントローラのxajax初期化の中で、上記の一番下の行のように、/jsの次にも/をつければ動くようになりました。何でこんなところで違いが出てしまうのでしょう。

kohana開発日記(xajaxでtableの行を増減)

可変行のtableがxajaxで実現できます。
tr要素にidをつければ、全てxajaxでコントロール可能。

行を増やす(要素を増やして、その中身を詰めるのも一度にいけます)。

        $response = new xajaxResponse();
        $response->create('author_table', 'tr', 'author_'. $id);
        $response->assign('author_'. $id, 'innerHTML', $tr_html);
        return $response;

行を減らす

        $response = new xajaxResponse();
        $response->remove('author_'. $id);
        return $response;

viewの初期状態

        <table id="author_table">
        </table>

kohana開発日記(コード値管理クラス)

どちらかというとPHPの話題になるかもしれません。

コードがあって、0は何を表わし、1は何を表わし・・・これをアプリケーションのどこからでも使いたいとき、どうすべきでしょうか。

案1:コード値テーブルを作る
案2:コード値管理クラスを作る
案3:配列にセットし、どこかで共通にrequire

実際には案1でしばらくやってみるつもりですが、案2に転んだ時の備えに作ってみました。

<?php
/**
 * コード群を管理するクラス
 *
 *@abstract
 */
abstract class Types {
    protected $inner; //array(number=>string)

    /**
    * Factory.
    *
    * @param string モデル
    * @return object
    */
    public static function factory($code) {
	$class = 'Types_'.$code;
	return new $class();
    }

    /**
     * Constructor.
     */
    public function __construct() {
        $this->inner = array();
    }

    /**
     * key-value配列を返す
     *
     * @return array
     */
    public function get_array() {
        return $this->inner;
    }

    /**
     * keyに対応するvalueを返す
     *
     * @param integer key
     * @return string value
     */
    public function get_value($number) {
        if(isset($this->inner[$number])) {
            return $this->inner[$number];
        } else {
            return NULL;
        }
    }

    /**
     * keyが正しいならTRUEを返す
     *
     * @param integer key
     * @return boolean
     */
    public function check_key($number) {
        if(isset($this->inner[$number])) {
            return TRUE;
        } else {
            return FALSE;
        }
    }
}
?>

kohana開発日記(ORMのvaluesの扱い)

ormのvaluesに渡す配列で、POSTから直接に渡すような形ではエラーになります。解析しきれていないのですが、渡した値はそのまま正直に置き換えてくれるので、UPDATEで差しつかえる様子です。

その他、項目’id’でも問題が出ます。

  • orm->saveでは、valuesで’id’を上書き(同値でも)するとinsert扱いにされてしまう
  • orm->insertでは、’id’を残すとそのままのIDをセットしてinsertしようとする

modelのアプリ用基底クラスで細工をすることにしました。

    public function values($values) {
        $params = array();
        foreach($values as $key => $value) {
            if(is_null($value)) {
            } elseif ($value == '') {
            } elseif ($key == 'id') {
            } else {
                $params[$key] = $value;
            }
        }
        return parent::values($params);
    }

うまくはいきましたが気持ち悪いです。Validationで何とかするのが本当かも。

kohana開発日記(xajaxでForm値を配列で送信)

view側

<form id ="search_form"  action="#">
      <input type="hidden" name="model" value="person">
      <label for="search_name">著者</label>
      <input type="text" name="search_name" id="search_name"
            value="<?php echo isset($search_name)?$search_name:''; ?>">
      <a class="button" href="#"
            onclick="xajax_search(xajax.getFormValues('search_form'));return false;">
      <span>検索</span></a>
</form>

controller側

    public function ajax_search(array $params) {
        if(isset($params['search_name'])){
        }
    }

検索時に、Pagenation用にキーワードをどう覚えておくかという課題がありましたが、これを使えばできそう。