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

Blog

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

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

Comment on this article

mori
私もform-&gt;createではまっております。

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

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

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

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

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

Send comments

必須
必須  
※ メールアドレスは公開されません
任意
必須