SSブログ
Lancers.jp

CakePHP その21 〜MobileHelper2 〜 [CakePHP]

まず、Prefixルーティングを使うとき、CakePHP1.2 RC2のHTMLヘルパーでは下記の現象が起きる。

まず、通常のリンクは下記のように書く。

$html
->link('リンクテキスト', array('controller' => 'names', 'action' => 'index', 'a' => 'A'));

そして、下記のようなHTMLが出力される。
<a href="/names/index/a:A">リンクテキスト</a>

しかし、これを下記のようにprefix付きで書くと…
php
$html
->link('リンクテキスト', array('controller' => 'names', 'action' => 'mobile_index', 'a' => 'A'));

  • 期待されるHTML
    <a href="/m/names/index/a:A">リンクテキスト</a></li>
  • 実際に出力されるHTML
    <a href="/names/mobile_index/a:A"> リンクテキスト</a></li>

これは困る。

もう一つ困ることと言えば、Paginator使うと、リンクURLにセッションIDが含まれなくなってしまう。

ので、それらを解決するために、結局MobileHelperを作成。
基本的には、Paginatorを継承させるけど、他の普通のリンクなど、携帯対応しなきゃ行けないのはついでに含ませてしまおう。


class MobileHelper extends PaginatorHelper {
    
    
//セッションIDをつけるPaginator用リンク
    
function link($title, $url = array(), $options = array()) {
        
$options = array_merge(array('model' => null, 'escape' => true), $options);
        
$model = $options['model'];
        unset(
$options['model']);

        if (!empty(
$this->options)) {
            
$options = array_merge($this->options, $options);
        }
        if (isset(
$options['url'])) {
            
$url = array_merge((array)$options['url'], (array)$url);
            unset(
$options['url']);
        }
        
$url = $this->url($url, true, $model);

        
$obj = isset($options['update']) ? 'Ajax' : 'Html';
        
        
$url = array_merge(array('page' => $this->current($model)), $url);
        
        
//ここから変更
        
if(Configure::read('mobile')){
            
$url['page'] .= '?'.session_name().'='.session_id();
        }
        
        return
$this->{$obj}->link($title, Set::filter($url, true), $options);
    }
    
//セッションIDをつける通常リンク
    
function htmlLink($title, $url = array(), $options = array()){
        
//ここから変更
        
if(Configure::read('mobile')){
            
$url = am($url, array('?'.session_name().'='.session_id()));
        }
        
$obj = isset($options['update']) ? 'Ajax' : 'Html';
        
        return
$this->{$obj}->link($title, Set::filter($url, true), $options);
    }
    
    function
image($path, $options = array()){
        
//ここから変更
        
if(Configure::read('mobile')){
            
$sid = '?'.session_name().'='.session_id();
        }
        
$obj = isset($options['update']) ? 'Ajax' : 'Html';
        return
$this->{$obj}->image($path.$sid, $options);
    }

}



いまんとこ、こんな感じで問題無くやってます。

あと、前回にMobileAppControllerに書いたredirectはやっぱ不便なんで、mobRedirectと言う名前に変更しました。AuthComponentではねた時にURLにセッションIDがついてたら変だから。気づかなかったのはまぬけ。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。