2013年3月21日木曜日

[cakephp 1.3] JSON出力する単純な例

  1. 拡張子でリソースの種類を判断できるよう、「{app}/config/routes.php」に Router::parseExtensions()を追加します。
  2. JSON用のデフォルトレイアウトビューファイル「{app}/views/layouts/json/default.ctp」を追加します。
  3. cake bake project すると、{app}/views/layouts に email,js,json,rss,xmlのフォルダーが 自動的に作成されるので必要はないがzipを展開しただけなら無いので作成が必要。

  4. データをJSON出力するためのビューファイル「{app}/views/posts/json/index.ctp」を作成します。
  5. コントローラーにコンポーネントRequestHandlerを追加します。
  6. debug設定が0でないとContent-Typeがtext/htmlになるようなので、 debug設定を0にしてJSONのときのContent-Typeがapplication/jsonになるようにします。 (4.と5.はapp_controller.phpに設定してしまってもよいかもしれません)
  7. JSON出力するデータをセットします。
CakePHP(1.3)でJSON出力する単純な例を参考にしました。

2013年3月18日月曜日

[cakephp 1.3] index.htmlで表示できるようにする。もしくは routes.phpにRouter::parseExtensions()を追加すると。

まず、config/routes.phpにRouter::parseExtensions();を追加します。
こうすると普通のページを表示したとき、$this->params['url']['ext']に'html'が必ず付加されるようになります。
どういうことになっているかというと、
http://example.com/top/view が http://example.com/top/view.html と同じ扱いになる。
普通 http://example.com/top/view.html とすると、function view.html(){}が無いのでエラーになるが、
Router::parseExtensions();を追加するとエラーにはならず、
http://example.com/top/view.html とすると function view(){} を実行する。

2013年2月21日木曜日

[mpdf56] PDF出力をゴシックで

1146行からはマルチバイトの修正、10466行からは小塚明朝から小塚ゴシックへの変更


mpdf.php
1146    if (preg_match('/([\-+])aCJK/i',$mode, $m)) {
1147        preg_replace('/([\-+])aCJK/i','',$mode);
1148        if ($m[1]=='+') { $this->useAdobeCJK = true; }
10465    $family='sjis';
10466    $name='KozMinPro-Regular-Acro'; 
10467    $cw=$this->SJIS_widths;


mpdf.php
1146    if (preg_match('/([\-+])aCJK/i',$mode, $m)) {
1147        // bug? preg_replace returns replaced value!
1148        //preg_replace('/([\-+])aCJK/i','',$mode);
1149        $mode = preg_replace('/([\-+])aCJK/i','',$mode);
1150        if ($m[1]=='+') { $this->useAdobeCJK = true; }
10467    $family='sjis';
10468    //$name='KozMinPro-Regular-Acro'; 
10469    $name='KozGoPro-Medium';
10470    $cw=$this->SJIS_widths;

42行からはCJKをtrueにします。270行からは標準フォントをserifからsans-serifに変更。

config.php
42
43$this->useAdobeCJK = false;        // Uses Adobe CJK fonts for CJK languages
44            // default TRUE; only set false if you have defined some available fonts that support CJK
270    'BODY' => array(
271        'FONT-FAMILY' => 'serif', 
272        'FONT-SIZE' => '11pt',


config.php
42
43$this->useAdobeCJK = true;        // Uses Adobe CJK fonts for CJK languages
44            // default TRUE; only set false if you have defined some available fonts that support CJK
270    'BODY' => array(
271        'FONT-FAMILY' => 'sans-serif', 
272        'FONT-SIZE' => '11pt',

[mac osx] ゴミ箱が機能しなくなった。

ゴミ箱にいれると即削除されるようになってしまった。
どうやら ~/.Trash のパーミッションが変わってしまったらしい。
なぜかオーナーが root になっていた。
原因がわかってしまえば対処方は簡単
sudo chown -R 自分 ~/.Trash

2013年2月18日月曜日

[cakephp 1.3] Button or Submit

<input type="button">を作りたかったんだけど $this->Form->input('button',array('type'=>'button');としても <button></button>しかできないし、困っていたんだけど、色々やってみたら 解決したので書いておく。

このように書くと
echo $this->Form->submit('送信',array('type'=>'button','div'=>false,'label'=>false));
echo $this->Form->submit('送信',array('type'=>'submit','div'=>false,'label'=>false));
echo $this->Form->button('送信',array('type'=>'button','div'=>false,'label'=>false));
echo $this->Form->button('送信',array('type'=>'submit','div'=>false,'label'=>false));
このように出力されます。
<input type="button" value="送信" />
<input type="submit" value="送信" />
<button type="button">送信</button>
<button type="submit">送信</button>

[cakephp 1.3] 本当に削除してもいいですか?

echo $this->Form->button('削除', array(
'type' => 'button',
'onClick' => "if(confirm('削除しますか?')){location.href='". $this->Html->url(array('controller' => 'estates','action'=>'delete',$result['Estate']['id'],))."';}"
));

2013年2月8日金曜日

[mysql] update 結合したテーブルの値のコピー

UPDATE  `bukken_commons` ,`bukken_sells` 
SET  `bukken_commons`.`commercial_medium` =  `bukken_sells`.`baitai` 
WHERE  `bukken_commons`.`bukken_id` =  `bukken_sells`.`bukken_id`

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()を使う。