新しいブログに引っ越しました

tomotomoSnippetは新しいブログに移動しました
https://develtips.com/

2010-07-05

[CakePHP1.2]印刷用ページのルーティング

ちょっと軽い話題。

routes.phpを編集して、印刷専用のレイアウトを設定できるようにします。
具体的には
http://example.com/print/users/view/123
にアクセスした際にレイアウトのprint.ctpを適用します。


// routes.php の一番最後

/**
* 印刷用ページのルーティング
*/
Router::connect(
'/print/:controller/:action/*',
array('action'=>'index', 'print'=>1)
);

コントローラでは、$this->params['print']が使えるようになります。
AppControllerのbeforeRenderをいじってみましょう。


// app_controller.php

class AppController extends Controller
{
function beforeRender()
{
if (isset($this->params['print']) && $this->params['print']==1) {
$this->layout = 'print';
}
}
}

はい、これでコントローラの前に/printを付けるだけで
プリント用レイアウトが適用されるようになりました。
プリント用レイアウトは不要なナビゲーション関連の要素を削除する
などしておくとスッキリします。

(追記:2010/7/5)
残念ながら、プリントルーティングは完全ではないです。
pagesコントローラのルーティングなど、他にカスタムルーティングを
行っている場合は、プリントルーティングが適用されません。
個別に設定していきましょう。


// 例 routes.php
/**
* ...and connect the rest of 'Pages' controller's urls.
*/
Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display'));
// この一行を追加
Router::connect('/print/pages/*', array('controller' => 'pages', 'action' => 'display', 'print'=>1));

2010-04-21

[XAMPP]XAMPPを壊してしまったので再インストール手順

先日、ちょっとしたミスでXAMPPをぶっ壊してしまい、起動しなくなりました。
1.6.xを使ってたんですが、久しぶりに公式サイトを覗いたら1.7.3まで出てるじゃーん。アップグレードしよう。なんて、思ってアップグレードパッケージを使った後に、1.7.2-1.7.3専用だと気付くも時遅し。見事に起動しなくなりましたとさ。

そんなわけで、再インストールをしたので手順まとめ。
(環境はWindowsXP)
xamppインストールディレクトリはc:\xamppとします。

1.データのバックアップ
c:\xampp\htdocsの内、xamppフォルダ以外
c:\xampp\mysql\dataの内、自分で作ったデータベースと同じ名前のフォルダ
この2つを違う場所にコピーして、c:\xamppをすべて削除。

1.1.PCを再起動
必要かわからないけど、一応。

2.XAMPPをインストール
インストールしたいパッケージをインストール。
XAMPP1.7からはPHP5しか入ってないので、PHP4が必要なら1.6.xをインストール。(1.7を入れてから気付きました。)
ちなみに、1.6.8の日本語版は、本家からのリンクが無いので下記URLからダウンロード。
http://sourceforge.jp/projects/sfnet_xampp/downloads/XAMPP%20Windows/1.6.8/xampp-win32-1.6.8-installer.exe/

3.セキュリティ対策
MySQLにパスワードを設定してもいいんだけど、ローカルマシン以外からアクセスできないようにすればOK。
(参考)
http://www.be-webdesigner.com/technotes/server/install/xampp.htm
http://www.be-webdesigner.com/technotes/server/httpd_conf/security.htm

c:\xampp\apache\conf\httpd.conf v1.3.8ならL53あたり
[変更前]
Listen 80
[変更後]
#Listen 80
Listen 127.0.0.1:80

これで、XAMPPを起動してみればちゃんと、http://localhost/にアクセスできるはずです。

4.バックアップデータの復元
1.でバックアップしたデータを元の場所に戻す。
phpmyadminなどで確認するとちゃんとデータベースも元に戻ってます。

5.お好みでセットアップ
mod_rewriteを有効にする(v1.6.8の場合、初期では無効)
C:\xampp\apache\conf\httpd.conf
[変更前]
#LoadModule rewrite_module modules/mod_rewrite.so

[変更後]
LoadModule rewrite_module modules/mod_rewrite.so


mbstringだとか、gdだとか、cURLだとか、関数を使えるようにするには、
C:\xampp\apache\bin\php.ini
の中で該当する部分のコメントを外します。

なんとか、復活できてほっとしています。

2010-02-19

[CakePHP][eclipse]登録用ビューの$formを$dataに置換して表示用ビューを作る正規表現

データ入力用のフォームを作って、それを基にデータ表示用のビューを作るなら、$form->text('Model.field')$data['Model']['field']にすれば良いだけの話だが、何十か所もあると流石に面倒くさい。
私は開発ソフトがeclipseなので、正規表現で一発変換をしています。


// example.ctp

<?=$form->text('User.name', array('class'=>'abcd')) ?>

// 次のように変換したい...

<?=$data['User']['name'] ?>


eclipseの検索/置換で正規表現を選択し
検索
form->[a-z]+\('([\w]+)\.([\w]+)'.*\)
置換
data['$1']['$2']

とやってみてください。

正規表現

パーフェクトに置換はできませんが、作業がだいぶん楽になります。

2010-01-29

[CakePHP]ヘルパーを改造する!ただし、コアは書き換えない

CakePHP1.2のお話(最近、この一言を書き忘れていた)

携帯サイトを作っていると既存のHtmlHelperでは不十分だと思い、
思い切って、HtmlHelperを書き変えてやろうという事に。

ただし、コア(LIBS/views/helpers/html.php)は書き換えない方針で!

試しに、コアのHtmlHelperをAPP内にコピーしてみる。

// app/views/helpers/html.php

// メソッド内のどこかで
echo 'new helper';


// app/controllers/example_controller.php

// 普通に定義してやる
var $helpers=array('Html');


ページにアクセスしてみると、new helperが表示されました。

結論:
ヘルパーを改造する際は
LIBS/views/helpers/someone.php

APP/views/helpers/someone.php
にコピーするだけ。

ってことは、コンポーネントも同じ事が出来るのか?

2010-01-26

EclipseにJStyleプラグインをインストールする

JStyleプラグインって何?
http://mergedoc.sourceforge.jp/index.html#/jstyle.html
Eclipse のエディタで全角空白、半角空白、タブ、改行(LF、CRLF、CR)を表示可能にするプラグインです。
他に太字を通常文字と同じ幅で表示するオプションがあります。


コードインデントがタブなのか、半角スペースなのか、ぱっと見で分からなくて不便だったのでインストールしました。

JStyleからダウンロードしたファイルを、/eclipseインストールフォルダ/plugins/にコピーして、-cleanオプションを付けてeclipseを起動すれば、インストール完了。
Windowsならコマンドプロンプトから起動すればOK!

C:\(eclipseインストールフォルダ)>eclipse.exe -clean


JStyleの設定は、[ウィンドウ]->[設定]->[一般]->[JStyle]から変更できます。

2010-01-22

[CakePHP]モバイルヘルパーを改善する

CakePHPで携帯サイトを制作するには、文字コードの変換、カタカナの変換が必要です。
それを実行するためのヘルパーは既に
コントローラの afterFilter で文字コードを変換する方法で紹介されています。

もう一つ改良して、ビューの行頭のインデントを削除したいと思います。


class MobileHelper extends Helper {
function afterRender() {
$out = ob_get_clean();
// 次の一行を追加
$out = preg_replace('/\n[\s]+/', "\n", $out);
$out = mb_convert_kana($out, "rak", "UTF-8");
$out = mb_convert_encoding($out, "SJIS", "UTF-8");
ob_start();
echo $out;
}
}

preg_replace('/\n[\s]+/', "\n", $out)で、改行した後のインデント(タブ、半角スペース、改行)を改行コードに置換しています。
置き換え後の文字は必ず、”(ダブルクオート)で囲ってください。
’(シングルクオート)だとちゃんと改行コードになってくれません。

これで、十数バイトの容量節約になると思います。

2010-01-18

[CakePHP]Javascriptヘルパーを拡張したい

CakePHP1.2で外部Javascriptファイルを読み込むのに、Javascriptヘルパーを使って出力しますが、元のヘルパーだと、charset属性を指定できません。


View:
$javascript->link('http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX', false);


Html:
<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX"></script>


という事で、さっさとヘルパーを拡張することにしました。
CakePHP Formヘルパの拡張 その1日本語日付選択プルダウンを参考にすると、継承元のクラス名は必ずしもAppHelperでなくて良いようだ。

これなら必要な機能だけ拡張、または上書きすれば良さそう。
という事で、早速Javascriptヘルパーのlinkメソッドをコピーして、ちょちょっと書きなおしたコードがコレ。
// APP/views/helpers/ex_javascript.php

class ExJavascriptHelper extends JavascriptHelper
{
function link($url, $inline = true, $attr = array())
{
// (省略)

$htmlattributes = '';
foreach ($attr as $k => $v) {
$htmlattributes .= ' '.$k.'="'.$v.'"';
}

//$out = $this->output(sprintf($this->tags['javascriptlink'], $url));
$out = $this->output(sprintf('<script type="text/javascript" src="%s"%s></script>', $url, $htmlattributes));

// (省略)
}
}

第3引数にHTML属性を指定できるようにしました。


これでよし!と思ったら一つ問題が・・・
コントローラで、元のJavascriptヘルパーも併せてセットしないと動かないことが発覚。
var $helpers = array('Javascript','ExJavascript');


継承してるのに2つともインスタンス化しちゃうのはなんだかなぁ
ということで、先ほどのコードをちょっと書き換えます。

// APP/views/helpers/ex_javascript.php

// まずは元のJavascriptヘルパーファイルを読み込む
require_once CAKE.'libs'.DS.'view'.DS.'helpers'.DS.'javascript.php';

class ExJavascriptHelper extends JavascriptHelper
{
function link($url, $inline = true, $attr = array())
{
// (省略)

$htmlattributes = '';
foreach ($attr as $k => $v) {
$htmlattributes .= ' '.$k.'="'.$v.'"';
}

#$out = $this->output(sprintf($this->tags['javascriptlink'], $url));
$out = $this->output(sprintf('<script type="text/javascript" src="%s"%s></script>', $url, $htmlattributes));

// (省略)
}
}


Controller:
var $helpers = array('ExJavascript');


View:
$exJavascript->link('http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX', false, array('charset'=>'UTF-8'));


Html:
<script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX" charset="UTF-8"></script>


期待通りの動きが実現できました。

人気のエントリー