[PHP][CakePHP][携帯] Router::connect と$form->create ではまった件。

CakePHP

CakePHP- 高速開発 php フレームワーク。 HomeCakePHP 1.2.5 で モバイルサイトを構築しています。
そこでViewにてformヘルパーでcreateすると、URLにprefixが勝手について困っていました。

まずは携帯サイトの構築という事で、いろいろなブログを参考にしてみました。

prefixでURLを切り分けるといいみたい。

app/config/routes.php

Router::connect('/m/:controller/:action', array('prefix' => 'mobile'));

実装してみました。
しかしPC用のViewにてformヘルパーでcreateすると、URLにprefixが勝手について困っていました。

以下みたいにすると

<?php echo $form->create('Foo', array('action' => 'bar')); ?>

できあがるHTMLが

<form prefix="" id="FooBarForm" method="post" action="/m/foo/bar">

となって、困った困った。

HTMLベタ書きしか駄目なんかな、とか思っていたんですが、答えは以下にありました。

Routes::connect設定時の$form->createや$html->linkの挙動について” フォーラム – CakePHP Users in Japan

Router::connect('/m/:controller/:action', array('prefix' => 'mobile'));

ではなくて、

Router::connect('/m/:controller/:action', array('prefix' => 'mobile', 'mobile' => true));

が正解らしい。

Viewでは以下のようにするそうです。

<?php 
// link
echo$html->link('hogefuga', array('controller' => 'users', 'action' => 'mobile_login', 'mobile' => true));
?>

フォーラムには書いてなかったけど、formの場合は

<?php 
// form
echo $form->create('User', array('action' => 'mobile_login', 'url' => array('mobile' => true ) ));
?>

でいけました。

もっと簡単に解決するには
[cakephp1.2]CakePHP1.2でprefixルーティング設定時の注意点。[携帯]

にかかれていた

app/config/routes.php

if (preg_match("/\/m\//", $_SERVER['REQUEST_URI'])) Router::connect('/m/:controller/:action/*', array('prefix' => 'mobile'));

の方法でもいいかも。力技というか。

各ブログにCakePHPで携帯サイト構築の記事を書かれている皆さんは$form->createは使わないのかなぁ。

CakePHP1.2系で携帯サイト時にはまたはまる可能性が高いので、メモしておきました。

追記
以下の記事もありました。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2057&forum=8&post_id=5074

コメント

  1. mori より:

    私もform->createではまっております。

    create(‘User’, array(‘action’ => ‘mobile_login’, ‘url’ => array(‘mobile’ => true ) ));
    ?>
    これなんですけど、
    例えば登録フォームで、

    create(‘Post’, array(‘action’ => ‘member_edit’, ‘url’ => array(‘member’ => true ) ));
    ?>
    とすると、
    新規登録時は生成されたHTMLが
    action=”/member/posts/member_edit/”
    とプレフィックスが付くのですが、
    編集時にプライマリーキーがある場合に、
    生成されたHTMLでは、
    action=”/posts/member_edit/2/member:1″
    となってしまいます。

    編集時用にrouter.phpに追加したりしないといけないのでしょうか?
    ご教授いただければ幸いです。

  2. kaburk より:

    コメントありがとうございます。

    CakePHP 1.2 のPrefix周りは、どうもまだバグというか、仕様(?)、みたいなのがまだたくさんあるみたいですね。
    結局自分が作ってた携帯サイトは時間もなかったのでformタグをべた書きにしてしまいました。

    なんだかですねぇ。

  3. showBOO より:

    同じことではまっており、検索してここにたどりつきました。
    参考になりました!
    ありがとうございました!!