#php #cakephp #mobile #cakephp-1.3 #html-helper
#php #cakephp #Мобильный #cakephp-1.3 #html-помощник
Вопрос:
У меня есть мобильная страница, запущенная на поддомене «m.mydomain.com «. Все это работает нормально, но я хотел бы удалить контроллер в URL при использовании поддомена.
m.mydomain.com/mobiles/tips
должно стать
m.mydomain.com/tips
с помощью HTML-помощника.
На данный момент ссылка выглядит следующим образом:
$html->link('MyLink', array('controller' => 'mobiles', 'action'=> 'tips'));
Я попробовал несколько возможных решений с маршрутами, а также некоторые хаки в bootstrap, но у меня это не сработало.
В CakeBakery я нашел это, но это не решает мою проблему.
У кого-нибудь есть идея по этой проблеме?
Комментарии:
1. Всякий раз, когда вы просматриваете мой ответ, пожалуйста, прокомментируйте, если он не работает, чтобы мы могли работать над окончательным ответом. Этот вопрос может помочь многим другим людям.
Ответ №1:
Сбор кода со страницы, которую вы упомянули:
Ограничение: в этой настройке у вас не может быть контроллера, вызываемого tips
или foo
В /config/routes.php
:
$subdomain = substr( env("HTTP_HOST"), 0, strpos(env("HTTP_HOST"), ".") );
if( strlen($subdomain)>0 amp;amp; $subdomain != "m" ) {
Router::connect('/tips',array('controller'=>'mobiles','action'=>'tips'));
Router::connect('/foo', array('controller'=>'mobiles','action'=>'foo'));
Configure::write('Site.type', 'mobile');
}
/* The following is available via default routes '/{:controller}/{:action}'*/
// Router::connect('/mobiles/tips',
// array('controller' => 'mobiles', 'action'=>'tips'));
// Router::connect('/mobiles/foo',
// array('controller' => 'mobiles', 'action'=>'foo'));
В вашем действии контроллера:
$site_is_mobile = Configure::read('Site.type') ?: '';
Тогда, на ваш взгляд:
<?php
if ( $site_is_mobile ) {
// $html will take care of the 'm.example.com' part
$html->link('Cool Tips', '/tips');
$html->link('Hot Foo', '/foo');
} else {
// $html will just output 'www.example.com' in this case
$html->link('Cool Tips', '/mobiles/tips');
$html->link('Hot Foo', '/mobiles/foo');
}
?>
Это позволит вам выводить правильные ссылки в ваших представлениях (немного позже я покажу вам, как написать еще меньше кода), но $html
помощник не сможет — без какого-либо волшебства — использовать маршруты действий контроллера в другой домен. Имейте в виду, что m.example.com
и www.example.com
это разные домены, что касается $html
помощника.
Теперь, если вы хотите, вы можете сделать следующее в своем контроллере, чтобы убрать некоторую логику из вашего представления:
<?php
$site_is_mobile = Configure::read('Site.type') ?: '';
if ( $site_is_mobile !== '' ) {
$tips_url = '/tips';
$foo_url = '/foo';
} else {
$tips_url = '/mobile/tips';
$foo_url = '/mobile/foo';
}
// make "urls" available to the View
$this->set($tips_url);
$this->set($foo_url);
?>
И, по вашему мнению, вам не нужно беспокоиться о проверке, осуществляется ли доступ к сайту через m.example.com/tips
или www.example.com/mobile/tips
:
<?php echo $html->link("Get some kewl tips", $tips_url); ?>
Для более продвинутой маршрутизации в CakePHP-1.3 обратитесь к статье Марка Стори о пользовательском Route classes
Дайте нам знать 😉
Комментарии:
1. Спасибо за ваше предложение о помощи! Это работает, но я искал что-то, что работало бы в обоих направлениях: www.mydomain.com/mobiles/tips и m.mydomain.com/tips . Возможно ли это с помощью html helper?
2. @chris если у вас есть контроллер мобильных устройств, он будет работать прямо из коробки, при условии, что
your_controller
он вызывается в реальностиmobiles_controller.php
3. @крис, я обновляю ответ
4. @Oerd еще раз спасибо. Итак, мне нужно иметь оператор If / Else? Нет никакого способа, чтобы маршруты в сочетании с html-помощником творили волшебство для меня, чтобы просто использовать это: $ html-> link(‘MyLink’, array(‘controller’ => ‘mobiles’, ‘action’ => ‘tips’));
5. @Oerd Даже это не то, что я искал, я выберу это решение, поскольку у меня нет других / лучших идей 🙂 Еще раз спасибо! Я подумал, что может быть решение с routes.php , поскольку здесь есть волшебство, когда, например,
Router::connect('/test', array('controller' => 'mobiles', 'action' => 'index'));
и$html->link('MyLink', array('controller' => 'mobiles', 'action'=> 'index'));
создаст эту ссылку/test
, а не/mobiles
. Итак, я подумал, что мог бы как-/mobiles
-то удалить, используя маршруты… Но в любом случае, я соглашусь с вашим предложением сейчас 🙂