Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 20 авг 2018, 00:05

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: 08 июл 2013, 14:14 
Не в сети
Новичок

Зарегистрирован: 07 июл 2013, 19:44
Сообщения: 15
С каханой раньше не работал, пришлось доделовать проект другово чувака. Мне нужно нацепить на движок, еще один шаблон для мобильной версии. Для входа на мобильную версию, нужно использовать дополнительный домен 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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 14:32 
Не в сети
Бывалый
Аватара пользователя

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

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 14:51 
Не в сети
Новичок

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 15:05 
Не в сети
Новичок

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 15:06 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 02 апр 2013, 16:26
Сообщения: 474
Откуда: Сергиев Посад
идея у Вас верная, осталось отловить ошибку

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

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

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

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 15:22 
Не в сети
Новичок

Зарегистрирован: 07 июл 2013, 19:44
Сообщения: 15
@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 поставить проверку на мобильных пользователей и автоматически их редектить на мобильную версию сайта. И кохана сама выведит нужный шаблон. Вроде это достаточно быстрое решение.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 15:50 
Не в сети
Бывалый
Аватара пользователя

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

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

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 16:10 
Не в сети
Новичок

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 16:21 
Не в сети
Бывалый
Аватара пользователя

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

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

_________________
Майкл Джордан играет в баскетбол. Чарльз Мэнсон убивает людей. Я пишу код. У каждого свой талант.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 08 июл 2013, 17:54 
Не в сети
Новичок

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group