Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Разные шаблоны для разных доменов
http://forum.kohanaframework.su/viewtopic.php?f=2&t=698
Страница 1 из 2

Автор:  Manyahin [ 08 июл 2013, 14:14 ]
Заголовок сообщения:  Разные шаблоны для разных доменов

С каханой раньше не работал, пришлось доделовать проект другово чувака. Мне нужно нацепить на движок, еще один шаблон для мобильной версии. Для входа на мобильную версию, нужно использовать дополнительный домен m.site.ru и соотетственно показывать другой дизайн сайта.

m.site.ru и site.ru по сути ссылаются на один и тот же сайт. Условием вывода дизайна, занимается кохана.

Я примерно разобрался как это сделать, в каждом контроллере в методе before() {} можно вставить проверку на домен, и если он соответствует мобильной версии, то подгружать другой шаблон.
Код:
   public function before()
   {
                $this->template = 'site';
      if($_SERVER['HTTP_HOST'] == 'm.site.ru') {
         $this->template = 'mobile/site';
      }
      parent::before();


Не уверен, насчет правильности такого решения, посколько придется перелопатить кучу файлов. Думал, делать эту проверку на уровне classes/controller/template.php. Добавив дополнительную переменную во все контроллеры. Примерно таким способом:

Код:
<?php

class Controller_Template extends Kohana_Controller_Template {

   public $mobile = false;

   public function before()
  {
      if($_SERVER['HTTP_HOST'] == 'm.site.ru') {
            $this->mobile = true;
         }

      parent::before();
  }
 
}


Но, такой вариант у меня не работает, переменная mobile всегда false. Ищу оптимальное решение, как сделать для одного ядра, две версии дизайна, один для сайта и один для мобильной версии.

Редирект на мобильные устройства буду делать на уровне nginx.

http://stackoverflow.com/questions/2764 ... subdomains

Автор:  WinterSilence [ 08 июл 2013, 14:32 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

а var_export($_SERVER) не судьба сделать и посмотреть? Как вариант можно еще Reques::$user_agent проверять, для авто выбора типа дизайна. готовое решение http://code.google.com/p/php-mobile-det ... ile_Detect

Автор:  Manyahin [ 08 июл 2013, 14:51 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

У меня нет проблем с определением мобильных пользователей. Моя проблема заключается в том, что я не знаю как оформить Controller Template, что бы он передовал это в дочерные контроллеры. Т.к. изменять каждый контроллер и вставлять туда проверку на наличие мобильного устройства, явный бред. Поэтому хочется загнать это уровнем повыше, в данном примере в Controller Template.

Но с тем примером, что я привел в последнем листинге, у всех классов наследуемых от Controller_template $mobile всегда false. Что похоже на ошибку, значит я неправильно назначаю эту переменную или проверяю. Почему ее не видно в наследуемых классах?

Автор:  Manyahin [ 08 июл 2013, 15:05 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

Это моя ошибка, разобрался. Оказывается у меня все контроллеры наследуются от Controller_Site. Поэтому надо было добавить проверку на домен к именно этому контроллеру в before(). А не морочить голову и создавать Controller_Template. Теперь все контроллеры видят, если сайт является мобильной версией.

Автор:  WinterSilence [ 08 июл 2013, 15:06 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

идея у Вас верная, осталось отловить ошибку

var_export($_SERVER) что возвращает?

if($_SERVER['HTTP_HOST'] == 'm.site.ru') а будет ли данная проверка работать если ввести сайт с www.?

мелкое замечание: parent::before(); старайтесь вначале before метода вызывать, а after соответственно в конце

Автор:  Manyahin [ 08 июл 2013, 15:22 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

@WinterSilence спасибо за помощь. Кстати, нет, не будет xD Надо будет поправить.

var_dump($_SERVER) вернет мне параметры сервера, запроса, хоста и домена. Это самое просто решение, что бы определить, что домен является m.site.ru. На данный момент, я так и делаю.

Поэтому в родительском контроллере Controller_Site, от которого наследуются все другие контроллеры. Я добавил пару строк в метод before().

Код:
   public function before()
   {
      if(strpos($_SERVER['HTTP_HOST'], 'm.site.ru') !== false) {
         $this->mobile = true;
      }
      parent::before();


Если я помещяю parent::before(); выше условия, то сайт падает в бесконечный луп. Поэтому оставил после.

Теперь во всех дочерних классах, которые наследуются от Controller_Site. Я делаю проверку на мобильну версию, и если это так, то подгружаю другой шаблон.

Код:
if($this->mobile) $this->template->content = View::factory('mobile/static');
   else $this->template->content = View::factory('static');


Возможно это не самое элегантное решение которое можно придумать, но оно полностью решает мою проблему с разными шаблонами для разных доменов с одним Kohana ядром.

Повторюсь, как только мобильная версия будет готова, можно будет на nginx поставить проверку на мобильных пользователей и автоматически их редектить на мобильную версию сайта. И кохана сама выведит нужный шаблон. Вроде это достаточно быстрое решение.

Будет интересно услышать другие, более элегантные решения этой проблемы.

Автор:  WinterSilence [ 08 июл 2013, 15:50 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

$position = UTF8::strpos($str, $search); http://kohanaframework.org/3.3/guide-api/UTF8#strpos чтоб уж наверняка...
var_export нужен был чтобы убедится, что в переменной именно те данные что и ожидалось т.к. где-то в коде могли быть преобразования(код все-таки не ваш).
по поводу after before это скорее правило хорошего тона в кохане, не обязательно им следовать, но желательно.

единственный альтернативный вариант, это организация отдельного приложения для мобильной версии: геморроя больше, но затраты ресурсов в разы меньше

Автор:  Manyahin [ 08 июл 2013, 16:10 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

Теперь, когда я использую ссылки вида <?=url::site(I18n::$lang.'/user/pre_register');?> в своем шаблоне под мобильное устройства. Они по прежнему ссылаются на www.site.ru.. а не m.site.ru. Полагаю, надо в родительском контроллере так же поменять url сайта? Как это сделать?

Автор:  WinterSilence [ 08 июл 2013, 16:21 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

а зачем вам безусловные ссылки? сделайте относительные т.е. вида /blabla/, хотя судя по коду http://kohanaframework.org/3.3/guide-api/URL#base если вы открываете m.site.ru/blabla/ , то ссылки на открытой странице должны быть верные, если нет то скорректируйте вызов parse_url в методе URL::base.

вообще ссылки строятся с помощью Route::url

Автор:  Manyahin [ 08 июл 2013, 17:54 ]
Заголовок сообщения:  Re: Разные шаблоны для разных доменов

Безусловные ссылки мне нужны, т.к. сайт использует i18n
Спасибо, поправил метод URL::base, теперь ориентируется от HTTP_HOST, а не от Kohana::$base_url.
Код:
// $base_url = Kohana::$base_url;
$base_url = 'http://' . $_SERVER['HTTP_HOST'] . '/';

Страница 1 из 2 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/