Маршрутизация поддомена в CakePHP с помощью HTML-помощника

#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 -то удалить, используя маршруты… Но в любом случае, я соглашусь с вашим предложением сейчас 🙂