2012年12月19日水曜日

[cakephp 1.3] コンポーネントをViewから使う

こういうコンポーネントをViewからコールする
class UtilsComponent extends Object {
    function pdate($id) {
        $Picture = ClassRegistry::init('Picture');
        $tmp = $Picture->read('modified',$id);
        return $tmp['Picture']['modified'];
    }
}
同じ名前のヘルパーを作成する。このヘルパーを通してコンポーネントをコールする。
App::import('Component','Utils');
class UtilsHelper extends AppHelper {
    function __call($methodName, $args) {
        $utils = new UtilsComponent();
        return call_user_func_array(array($utils, $methodName), $args);
    }

    //もちろんこのヘルパー内に他の関数を書いてもよい。
}
上記により、UtilsHelperに存在しない関数はUtilsComponentの呼び出しに変換される
コントローラで
var $components = array('Utils'... その他のコンポーネント);
var $helpers = array('Utils', ...その他のヘルパー);
と定義しておけば、ビューからは

$this->Utils->共通コンポーネントの関数()

と呼び出すことで、コンポーネントの関数を呼び出すことができる。

[cakephp 1.3] コンポーネント内でモデルを使う

コントローラでusesしているモデルであれば

class UtilsComponent extends Object {
    private $controller;

    public function initialize(&$controller)
    {
        $this->controller = $controller;
    }

    function pdate($id) {
        //コントローラーのusesにあるもの
        $tmp = $this->controller->Picture->read('modified',$id); 
        return $tmp['Picture']['modified'];
    }
}

これでいける。
しかし、呼び出し元のコントローラでusesしていないとエラーになってしまう。
それでもう一つの方法である。controller::loadModel()を使うのだがこれは コントローラーでしか使えないみたいなので同じ動きをする ClassRegistry::init()を使う。
その場合は

class UtilsComponent extends Object {
    function pdate($id) {
        $Picture = ClassRegistry::init('Picture');
        $tmp = $Picture->read('modified',$id);
        return $tmp['Picture']['modified'];
    }
}

2012年12月17日月曜日

[cakephp 1.3] コンポーネント内でヘルパーを使う。

App::import('Helper','Html');
$html = new HtmlHelper();

[cakephp 1.3] ヘルパー内でモデルを使う

$event = ClassRegistry::getObject('Event');
$tmp = $event->read('modified', $id);
echo $tmp['Event']['modified'];

こんな感じでClassRegistry::getObject()を使う。

2012年10月23日火曜日

[cakephp 1.3] SecurityComponentを使うとすぐにblackHoleへ吸い込まれる


DatabaseのTable内に存在しないField名を使っていないか

SecurityComponentではTokenを作成する際、DatabaseのTableのFieldを読み込んでHashを作っているようです。なので、それ以外のInput項目を付け加えてしまうとblackHoleへ吸い込まれてしまいます。
項目を付け加える必要がある場合は、以下のようにControllerに設定しておきましょう。

public function beforeFilter() {
    $this->Security->disabledFields = array('hoge');
}


$this->Form->create() $this->Form->end() をちゃんと使っているか

SecurityComponentを使うとTokenをチェックしてくれますが、ちゃんとFormHelperを使ってTokenを発行しないことにはblackHoleへ吸い込まれてしまいます。

$this->Form->create() $form->end() を使いましょう。

$this->Form->submit() ではダメです!

2012年10月2日火曜日

[contos] ハードディスクの換装

今接続している250G+250Gを250G+500Gに換装する。

新しいHDは/dev/sdb に接続した。

fdisk /dev/sdb
p
1
基本パーティーションの1とした。

シリンダをstart~lastにした。

領域のシステムタイプを8eにする。



物理ボリューム登録
# pvcreate /dev/sdb1
  Writing physical volume data to disk "/dev/sdb1"
  Physical volume "/dev/sdb1" successfully created

# pvscan


  PV /dev/sdc1   VG vg_variable     lvm2 [232.83 GiB / 0    free]
  PV /dev/sda2   VG vg_fujiyama     lvm2 [232.34 GiB / 0    free]
  PV /dev/sdb1                      lvm2 [465.76 GiB]
  Total: 3 [930.93 GiB] / in use: 2 [465.17 GiB] / in no VG: 1 [465.76 GiB]


論理グループの作成
vgextend vg_variable /dev/sdb1
  Volume group "vg_variable" successfully extended

# pvscan
  PV /dev/sdc1   VG vg_variable   lvm2 [232.83 GiB / 0    free]
  PV /dev/sdb1   VG vg_variable   lvm2 [465.76 GiB / 465.76 GiB free]
  PV /dev/sda2   VG vg_fujiyama   lvm2 [232.34 GiB / 0    free]
  Total: 3 [930.93 GiB] / in use: 3 [930.93 GiB] / in no VG: 0 [0   ]

物理ボリュームコピー
# pvmove /dev/sdc1 /dev/sdb1

  /dev/sdc1: Moved: 0.1%
  /dev/sdc1: Moved: 0.2%
  /dev/sdc1: Moved: 0.4%
  /dev/sdc1: Moved: 0.5%
  /dev/sdc1: Moved: 0.6%

OKなので
ディスクを外して再起動
# pvscan
  Couldn't find device with uuid jgBIQD-tOMR-PKr5-jvU1-YftI-vbGU-a3O6h5.
  PV unknown device   VG vg_variable   lvm2 [232.83 GiB / 232.83 GiB free]
  PV /dev/sdb1        VG vg_variable   lvm2 [465.76 GiB / 232.93 GiB free]
  PV /dev/sda2        VG vg_fujiyama   lvm2 [232.34 GiB / 0    free]
  Total: 3 [930.93 GiB] / in use: 3 [930.93 GiB] / in no VG: 0 [0   ]

しまったpvreduce するのを忘れていた。

# vgreduce vg_variable /dev/sdc1
  Couldn't find device with uuid jgBIQD-tOMR-PKr5-jvU1-YftI-vbGU-a3O6h5.
  Cannot change VG vg_variable while PVs are missing.
  Consider vgreduce --removemissing.

やっぱり駄目だ
# vgreduce vg_variable "unknown device"
  Couldn't find device with uuid jgBIQD-tOMR-PKr5-jvU1-YftI-vbGU-a3O6h5.
  Cannot change VG vg_variable while PVs are missing.
  Consider vgreduce --removemissing.

やっぱりダメ

# vgreduce --removemissing vg_variable
  Couldn't find device with uuid jgBIQD-tOMR-PKr5-jvU1-YftI-vbGU-a3O6h5.
  Wrote out consistent volume group vg_variable
# pvscan
  PV /dev/sdb1   VG vg_variable   lvm2 [465.76 GiB / 232.93 GiB free]
  PV /dev/sda2   VG vg_fujiyama   lvm2 [232.34 GiB / 0    free]
  Total: 2 [698.10 GiB] / in use: 2 [698.10 GiB] / in no VG: 0 [0   ]

なおた。

2012年9月28日金曜日

[cakephp] KtaiLibraryを単体で呼び出し

//KtaiLibraryを単体で呼び出し
//
App::import('vendor', 'ecw/lib3gk');
$this->Ktai = Lib3gk::get_instance();

2012年9月21日金曜日

[wp] ワードプレスでページIDをJavascript に渡す。


ワードプレスでページIDをJavascript に渡す。

<script type="text/javascript">
var page_id ="<?php echo $post->ID;?>";
</script>

2012年9月5日水曜日

平米、坪の換算方法

1坪 = 3.3057平米ですから、
(平米) = (坪) × 3.3057

(坪) = (平米) ÷ 3.3057
又は、

1平米 = 0.3025坪ですから、
(平米) = (坪) ÷ 0.3025

(坪) = (平米) × 0.3025

2012年8月3日金曜日

[Google Maps API V3] 情報ウインドウを出すと上が切れる

Google Maps JavaScript API V3で情報ウィンドウをマーカークリック後に表示するのではなく
マーカーと同時に表示すると情報ウィンドウが表示ウィンドウの上に上がってしまい切れてしまう。

google.maps.event.addDomListener(window, 'load', function() {
  var map = new google.maps.Map(document.getElementById('map_canvas'), {
    zoom: 12,
    center: new google.maps.LatLng(lat, lng),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });

  var infoWindow = new google.maps.InfoWindow({
    maxWidth: 300,
    content:'<p>メッセージ</p><p>メッセージ</p><p>メッセージ</p>'
  });

  var marker1 = new google.maps.Marker({
    map: map,
    position: new google.maps.LatLng(lat, lng)
  });

  google.maps.event.addListener(marker1, 'click', function(){
    infoWindow.open(map, marker1);
  });

  google.maps.event.trigger(marker1, 'click');

});

最初上記のようにしていたのだが、

このように情報ウィンドウの上が切れてしまっている。
しかし、マウスでマーカーをクリックするとちゃんと情報ウィンドウが欠けずに表示される。
ならば、ちょっとまってからクリックすればいいのかなと思って

pid = setTimeout(function(){
google.maps.event.trigger(marker1, 'click');
clearTimeout(pid);
},600);

setTimeoutを使って見たら上手く行った。

Pタグを外しても上手く行ったのだが、それはそれで困ってしまうので。

2012年8月2日木曜日

[cakephp] さくらのレンタルサーバーへcakephp 1.3のインストール

さくらのレンタルサーバーにcakephp1.3をインストールする方法

http://ユーザー名.sakura.ne.jp/cake に設置する場合。

wwwと同じ位置にcakephp1.3をcakephpという名前で展開します。

cakephp/app/webrootのhtaccessのRewriteEngine Onの次の行に

RewriteBase /cakeを追加します。

サーバーにsshでログインします。

windowsならばputty等を使い

ユーザー名とコントロールパネルのパスワードでログインできる。

ログインしたら次のコマンドを打ち込んでエンターを押して下さい。

ln -s `pwd`/cakephp/app/webroot `pwd`/www/cake

pwdを囲んでいるのは、バッククォートですのでお間違いなく
(ln -s /home/ユーザー名/cakephp/app/webroot /home/ユーザー名/www/cake)と同じ

www/cakeを独自ドメインのルートに割り当てればRewriteBase行の追加は必要ありません。