Форум русской поддержки Joomla!® CMS
06.12.2016, 22:01:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1] 2 3  Все   Вниз
  Добавить закладку  |  Печать  
Автор

Переключение шаблонов "на лету"

 (Прочитано 19102 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« : 05.05.2014, 08:59:50 »

Возникла необходимость реализовать переключение шаблонов "на лету" на любой странице сайта: либо один шаблон, либо другой.
Для чего: либо стандартный шаблон, либо шаблон - версия сайта для слабовидящих.

Подскажите, где можно почитать/посмотреть красивый пример реализации.
Записан
Efanych
Группа развития
*****

Репутация: +602/-0
Offline Offline

Пол: Мужской
Сообщений: 4320



« Ответ #1 : 05.05.2014, 10:40:16 »

Например, параметром
site.ru/url?template=mytemplate
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #2 : 05.05.2014, 12:30:46 »

Например, параметром
site.ru/url?template=mytemplate
А при переходе по внутренним ссылкам, например, выбор другого пункта меню, как этот параметр сохранится? Необходимо, чтобы пользователь, в рамках одной сессии переключившись на другой шаблон, оставался на этом шаблоне либо до конца сессии либо до момента выбора основного шаблона.

В целом, задача. чтобы это выглядело примерно так (справа сверху ссылка "версия для слабовидящих", только без панели сверху)
« Последнее редактирование: 05.05.2014, 12:34:16 от AlekVolsk » Записан
Efanych
Группа развития
*****

Репутация: +602/-0
Offline Offline

Пол: Мужской
Сообщений: 4320



« Ответ #3 : 05.05.2014, 12:37:22 »

Я бы записал в кукисы или сессию параметр, и в зависимости от него сделал бы всё в одном шаблоне по условию...
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #4 : 05.05.2014, 12:42:28 »

Я бы записал в кукисы или сессию параметр, и в зависимости от него сделал бы всё в одном шаблоне по условию...
В куки - это может затянуться на несколько сессий, здесь не угадаешь с временем жизни.
В сессию - не умею, здесь мне нужен пример.
В шаблоне по условию - подключать нужный набор CSS?
Записан
Efanych
Группа развития
*****

Репутация: +602/-0
Offline Offline

Пол: Мужской
Сообщений: 4320



« Ответ #5 : 05.05.2014, 12:53:25 »

Цитировать
В сессию - не умею, здесь мне нужен пример.
Я не программист, мне тоже гуглить придётся, как-то так:
Задаёте переменную, которая будет меняться в зависимости от выбора пользователя $variable;
Записываете её значение в сессию
Цитировать
$session =& JFactory::getSession();
$session->set("template",  $variable);

Потом проверяете значение

if ($session->get("template")=='чему-то там') {}

И выводите что надо, CSS или нужную разметку...
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #6 : 05.05.2014, 12:55:13 »

Спс, буду пробовать. Может, кто-то из спецов в этой области откликнется.
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #7 : 05.05.2014, 13:06:51 »

Цитировать
В куки - это может затянуться на несколько сессий, здесь не угадаешь с временем жизни.
Если у куки не указывать время жизни, то она является сессионной со всеми вытекающими.
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #8 : 05.05.2014, 13:13:33 »

Есть еще прикольная штука
Код
//устанавливаем состояние
JFactory::getApplication()->setUserState('com_users.edit.user.data', array());
 
//получаем состояние
$data = JFactory::getApplication()->getUserState('com_users.edit.user.data', array());
 
//получаем состояние из реквеста, если в нем нет соотв. переменной, то берется значение из userstate, если есть в реквесте - берется оно, плюс записывается в userstate
$data = JFactory::getApplication()->getUserStateFromRequest('com_users.edit.user.data', 'filter_order', 'a.id','cmd' );
 

'com_users.edit.user.data' - это условно уникальный идентификатор ячейки хранения данных
array() - в первой строке - значение, которое записывается в userstate, во втором - значение по умолчанию.

'filter_order', 'a.id','cmd' - в третьей строке, по очереди - название переменной в реквесте, значение по умолчанию, тип переменной для фильтрации.
« Последнее редактирование: 05.05.2014, 13:16:39 от Arkadiy » Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #9 : 05.05.2014, 13:21:44 »

Принял в работу, спасибо.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #10 : 14.05.2014, 16:15:28 »

Несколько изменена задача.
Переключается не шаблон, а файл стилей: если в url присутствует параметр ?vi=1 то цепляем vi.css, если в url присутствует параметр ?vi=0 или параметр vi отсутствует вовсе, то цепляем template.css. Я могу передать по ссылке параметр, прочитать его из url, но не получается его сохранить, чтобы при бегании по меню автоматом его добавлять к url.
Смотрю в сторону .htaccess, но чего-то запутался...
Записан
Shustry
Moderator
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #11 : 14.05.2014, 16:26:02 »

Это вы так запаритесь. Ну допустим для меню можно просто шаблон модуля переопределить и дописывать параметр. Но есть же внутренние ссылки. Тогда, если идти по этому пути (автодобавление переменной окружения), то нужно плагин системный писать.
Хотя, имхо, это изврат всё. Всё так же, как выше обсуждалось, запишите параметр в кукисы или сессию, а в index.php шаблона считайте — мой совет.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #12 : 14.05.2014, 16:44:58 »

Имхо, лучше в сессию, но запарился с пониманием процесса, опух уже (сроки поджимают).

Пытаюсь:
$vi JFactory::getApplication()->input->getString('vi''');
$is_vi false;
$vi_link JURI::current().'?vi=1';
$vi_text 'Версия для слабовидящих';

$session JFactory::getSession();
if ((
$session->get("vi")!= $vi) and ($vi != '')) { $session->set("vi",  $vi); }
$vi $session->get("vi");

if (
$vi == '1') {
  
$is_vi true;
  
$vi_link JURI::current().'?vi=0';
  
$vi_text 'Стандартная версия';
}
Код
    <?php if ($is_vi) { ?>
     <link rel="stylesheet" href="templates/rsmetro/css/vi.css" type="text/css" />
   <?php } else { ?>
     <link rel="stylesheet" href="templates/rsmetro/css/template.css" type="text/css" />
   <?php } ?>
 
Все бы вроде ничего, но при клике меню "главная" или ссылку вида "/" даже при echo $vi;->1 цепляет только template.css
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #13 : 14.05.2014, 18:20:26 »

В общем, в случае, когда происходит переход на $this->baseurl, $vi всегда содержит 0, непонятно почему. Где я ошибся?
Записан
Efanych
Группа развития
*****

Репутация: +602/-0
Offline Offline

Пол: Мужской
Сообщений: 4320



« Ответ #14 : 14.05.2014, 18:43:22 »

Кажись так будет достаточно

Код
$vi = JFactory::getApplication()->input->getString('vi', '');
$session = JFactory::getSession();
if ($vi=='1' or $vi=='0') {$session->set("vi",  $vi);}
 
<?php if ($session->get("vi")=='1') { ?>
     <link rel="stylesheet" href="templates/rsmetro/css/vi.css" type="text/css" />
   <?php } else { ?>
     <link rel="stylesheet" href="templates/rsmetro/css/template.css" type="text/css" />
   <?php } ?>
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #15 : 14.05.2014, 18:55:54 »

А может быть такое, что J поднимает страницы с кэша, независимо от проверки условия? Такое ощущение, что да.
Все больше убеждаюсь во мнении, что каким-либо (хз знает, каким) способом придется жестко дописывать параметр к ури
Записан
Efanych
Группа развития
*****

Репутация: +602/-0
Offline Offline

Пол: Мужской
Сообщений: 4320



« Ответ #16 : 14.05.2014, 19:38:49 »

А кеш отключить не вариант?
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #17 : 14.05.2014, 19:43:22 »

Все это очень шатко и ненадежно. Ставьте яваскриптом куку с перезагрузкой страницы, в шаблоне ее вылавливайте и подключайте свой CSS в зависимости от нее. Надежнее не бывает. Кэш врядли.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #18 : 14.05.2014, 20:38:27 »

Тады хорошее руководство по кукам мажно?
Есть у меня пример, Федор Власенко давал, но без пол-литры сходу не разберусь, это тоже, кстати стиль шаблона, но тут с запоминанием на долгое время имени файла стилей:
Код
      $input=JFactory::getApplication()->input;
     $styleColor=$input->getCmd('style','');
     if (!empty($styleColor)) {
       $conf=JFactory::getConfig();
       $cookie_domain=$conf->get('cookie_domain','');
       $cookie_path=$conf->get('cookie_path','/');
       setcookie('styleColor',$styleColor,time()+8640000,$cookie_path,$cookie_domain);
     }else{if (isset($_COOKIE['styleColor'])) {$styleColor=$_COOKIE['styleColor'];}}
     if (!empty($styleColor)) {
       JFactory::getDocument()->addStyleSheet(JUri::base().'/templates/'.$this->template.'/css/'.$styleColor.'.css');
     }else{
       echo '<link rel="stylesheet" href="/templates/'.$this->template.'/css/ks_'.$this->params->get('ks_tpl_color').'.css" type="text/css" />';
     }
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #19 : 14.05.2014, 21:17:23 »

Попытался переделать, не работает:
Код
$conf = JFactory::getConfig();
$vi = JFactory::getApplication()->input->getString('vi', '');
if (!empty($vi)) {
 setcookie('visually_impaired',$vi,0,$conf->get('cookie_path','/'),$conf->get('cookie_domain',''));
} else {
 if (isset($_COOKIE['visually_impaired'])) {
   $vi=$_COOKIE['visually_impaired'];
 }
}
$is_vi = false;
$vi_link = JUri::current().'?vi=1';
$vi_text = 'Версия сайта для слабовидящих';
if (!empty($vi) and $vi == '1') {
 $is_vi = true;
 $vi_link = JUri::current().'?vi=0';
 $vi_text = 'Стандартная версия сайта';
}
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #20 : 14.05.2014, 21:58:44 »

Проверил в файрфоксе - кука ставится. но если параметр в URL отсутствует, кука не принимается. Сейчас в head:
      $conf JFactory::getConfig();
      
$vi JFactory::getApplication()->input->getString('vi''');
      if (
$vi != '') {
        
setcookie('visually_impaired',$vi,0,$conf->get('cookie_path','/'),$conf->get('cookie_domain',''));
      } else {
        if (isset(
$_COOKIE['visually_impaired'])) {
          
$vi $_COOKIE['visually_impaired'];
        } else {
          
$vi '0';
        }
      }
      if (
$vi == '1') {
        echo 
'<link rel="stylesheet" href="templates/rsmetro/css/vi.css" type="text/css" />';
      } else {
        echo 
'<link rel="stylesheet" href="templates/rsmetro/css/template.css" type="text/css" />';
        echo 
'<script src="templates/rsmetro/js/fixedbox.js"></script>';
      }

Я в тупике ... ;(
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #21 : 15.05.2014, 00:34:53 »

Я готов рассмотреть коммерческий вариант решения вопроса. Кто поможет?
Записан
Efanych
Группа развития
*****

Репутация: +602/-0
Offline Offline

Пол: Мужской
Сообщений: 4320



« Ответ #22 : 15.05.2014, 00:57:18 »

Повключал всё кеширование + gzip-сжатие - всё работает.

В <head>
Цитировать
<?php
$vi = JFactory::getApplication()->input->getString('vi', '');
       $session = JFactory::getSession();
if ($vi=='1' or $vi=='0') {$session->set("vi",  $vi);}
?>
 
<?php if ($session->get("vi")=='1') { ?>
      <link rel="stylesheet" href="templates/rsmetro/css/vi.css" type="text/css" />
    <?php } else { ?>
      <link rel="stylesheet" href="templates/rsmetro/css/template.css" type="text/css" />
    <?php } ?>

Ссылки
<a href="<?php echo  JURI::current().'?vi=1' ?>">Версия для слабовидящих</a>
<a href="<?php echo  JURI::current().'?vi=0' ?>">Обычная версия</a>
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #23 : 15.05.2014, 04:57:52 »

http://www.php.net/manual/ru/function.setcookie.php дока по кукам.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #24 : 15.05.2014, 09:42:25 »

Я допускаю, что я очень сильно туплю и где-то что-то пропускаю, либо по не знанию либо по невнимательность. Возможно, что-то не то подключил, что мешается, или прописываю не в том месте.
index.php

Кеш - прогрессивный, gzip включен, но все время складывается ощущение, что страницы поднимаются с кэша.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #25 : 15.05.2014, 09:48:00 »

http://www.php.net/manual/ru/function.setcookie.php дока по кукам.
Спасибо, именно это изучал для примера.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #26 : 15.05.2014, 10:07:29 »

Гипотетически, может такое быть, что в сессии сохраняется параметр для каждой страницы отдельно?
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #27 : 15.05.2014, 10:11:14 »

Кеш - прогрессивный, gzip включен, но все время складывается ощущение, что страницы поднимаются с кэша.
Во первых отключите кэш и gzip, протестируйте без них, если работает, то по одному включайте.
Записан
AlekVolsk
Профи
********

Репутация: +316/-3
Offline Offline

Пол: Мужской
Сообщений: 6457



« Ответ #28 : 15.05.2014, 10:18:23 »

Отключил и то и другое, эффект тот же.
Записан
Arkadiy
Группа развития
*****

Репутация: +431/-0
Offline Offline

Пол: Мужской
Сообщений: 5315


Крепитесь, други.


« Ответ #29 : 15.05.2014, 10:24:17 »

Ну так получается не в кэше дело. ftp в личку и адрес сайта.
Записан
Страниц: [1] 2 3  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet