2013-08-04 2 views
0

У меня есть плагин/функция, которую я использую для определения того, является ли устройство мобильным/планшетом/рабочим столом.Smarty объект экземпляра объекта внутри плагина

например:

<img src="/path/to/images/foo{if detect_device == 'desktop'}-highres{/if}.jpg"

Плагин

<?php 
/* 
* Smarty plugin 
* ------------------------------------------------------------- 
* File:  function.detect_device.php 
* Type:  function 
* Name:  detect_device 
* Purpose: Simple plugin to access Mobile_Detect methods from within templates 
* Examples: 
* {if detect_device == 'tablet'} - return string either: mobile/tablet/desktop 
* {if detect_device action='isAndroidOS'} - boolean 
* {if detect_device action='isiOS'} - boolean 
* ------------------------------------------------------------- 
*/ 
function smarty_function_detect_device($params, &$smarty) 
{ 
    // Include and instantiate the class. 
    require_once 'Mobile_Detect/Mobile_Detect.php'; 
    $detect = new Mobile_Detect; 

    // Access specific method 
    if(!empty($params)){ 
     foreach($params as $param){ 
      if(method_exists($detect, $param)){ 
       return $detect->$param(); 
      } 
     } 
    } else { 
     // Simple device type 
     switch (true) { 
      case $detect->isMobile() : return 'mobile'; 
      case $detect->isTablet() : return 'tablet'; 
      default     : return 'desktop'; 
     } 
    } 
} 
?> 

Q1. Почему так никогда не бывает {if detect_device == 'desktop'}, но когда я {detect_device|@var_dump}, он возвращает строку «рабочий стол» (длина = 7)? Я думаю, что меня просто путают с типом плагина, который я должен использовать, так как теперь я хочу передать параметр плагину, должен ли я использовать модификатор? Я бы предпочел этот синтаксис {if $detect_device|isiOS}, но это пытается проверить, является ли isiOS модификатором вместо параметра.

Q2. Есть ли способ кэшировать объект Mobile_Detect, чтобы он выполнял только вычисления пользовательского агента один раз?

Mobile обнаружить скрипт: https://github.com/serbanghita/Mobile-Detect

ответ

0

Как вы уже догадались сами, синтаксис {detect_device} отличается {if detect_device == 'desktop'}. Первая функция вызывает функцию «обнаружение устройства», а последняя сравнивает строковый литерал detect_device со значением.

Если вы хотите использовать модификатор, правильный способ это (manual):

{'isiOS'|detect_device} 

Что касается кэширования результатов, вы не должны хранить объект Mobile_Detect, а его результат (строка браузера). Для этого вы можете использовать обычные методы PHP для сохраняющихся значений: вы можете использовать переменное пространство $GLOBALS или, если вы используете сеансы, сохранять результат в сеансе (который будет отличаться, если пользователь подписывается с использованием другого браузера) , То же самое касается файлов cookie.

Подход к сеансу/файлу cookie лучше в том, что он будет кэшировать результат на протяжении всего сеанса пользователя (или дольше), а не только на загрузку одной страницы

0

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

<img src="/path/to/images/foo{if $detect_device == 'desktop'}-highres{/if}.jpg" 
Смежные вопросы