Передача переменной php в Twig - Ошибки выбрасывания документации - PullRequest
0 голосов
/ 07 сентября 2018

ОБНОВЛЕНИЕ: 1

Я использую этот метод с помощью DarkBee

$detect = new Mobile_Detect;
class Project_Twig_Extensions extends Twig_Extension{
    public function getFunctions(){
        return array(new Twig_SimpleFunction('detectDevice', function() use($detect){
            if($detect->isMobile()){
                return true;
            } else {
                return false;
            }
        }));
    }
}

Я звоню в Twig, используя

{% if detectDevice %}

Нет передаваемых значений и условие не выполняется, поэтому, проверяя документацию, я написал другой метод на всякий случай https://twig.symfony.com/doc/2.x/advanced.html#functions

$twig = new Twig_environment($loader);
$function = new Twig_Function('detectDevice', function() use($detect){
    if($detect->isMobile()){
         return true;
    } else {
         return false;
    }
});
$twig->addFunction($function);

Что также не передает значений, мои 500 ошибок сервера успешно прекратились благодаря DarkBee, но я все еще не могу передать это должным образом в Twig.

Оригинальный вопрос

У меня огромные проблемы с установкой великолепного плагина Mobile_Detect в мой проект Opencart 3.0 (https://github.com/serbanghita/Mobile-Detect) Я вставил его и успешно проверил, является ли устройство настольным или мобильным в php.

Я узнал, чтобы передать эту проверку php в веточку, я могу добавить ее в глобальные переменные

  $twig = new Twig_Environment($loader);
  $mobTwig->addGlobal('isMobile', true);

или создайте публичную функцию, расширяющую веточку

require_once(DIR_SYSTEM . 'detect/mobiledetectlib/Mobile_Detect.php');
$detect = new Mobile_Detect;
$detectFunction = new function(){
    if($detect->isMobile()){
       return true;
    } else {
       return false;
    }
}

class Project_Twig_Extensions extends Twig_Extension{
    public function getFunctions(){
        return array(new Twig_SimpleFunction('detectDevice', '$detectFunction'));
    }
}

Обе опции возвращают 500 Internal Server Error и немедленно останавливают загрузку страницы. За последние несколько дней я не могу понять, почему. Никакое количество прибегая к помощи мне не помогло. У кого-нибудь есть понимание, почему это может происходить?

1 Ответ

0 голосов
/ 07 сентября 2018

У вас довольно много проблем в коде, который вы разместили:

  1. Аномальные функции

В PHP вы не можетесоздать new function(), чтобы определить анонимную функцию, вы просто используете этот синтаксис

$foo = function() {
    return 'foo';
}
echo $foo(); //output: foo
Передача переменных в анонимную функцию

Внутри вашей функции $detectMobile вы пытаетесь получить доступ к переменной $detect, однако эта переменная не определена в scope анонимной функции.

Чтобы правильно использовать $detect внутри вашей функции, вам нужно использовать языковую конструкцию use.

$detectFunction = new function() use($detect) {
    if ($detect->isMobile()) return true;
    else return false;
}   

Вы также можете использовать языковую конструкцию global, но это не рекомендуется

$detectFunction = new function() {
    global $detect;
    if ($detect->isMobile()) return true;
    else return false;
}   
Передача анонимной функции

Не использовать кавычки для передачи переменных экземпляров.

  • Использование new Twig_SimpleFunction('detectDevice', '$detectFunction')twig скажет запустить глобальную функцию $detectFunction

  • Использование new Twig_SimpleFunction('detectDevice', "$detectFunction") попытается преобразовать анонимную функцию в строку.Что невозможно

Единственный правильный способ передать анонимную функцию - просто передать ссылку:

new Twig_SimpleFunction('detectDevice', $detectFunction)

Теперь, если выобъединить все, что вы могли бы сделать что-то вроде этого

class Project_Twig_Extensions extends Twig_Extension{
    public function getFunctions() {
        $detect = new Mobile_Detect();

        return array(new Twig_SimpleFunction('detectDevice', function() use($detect) {
            if ($detect->isMobile()) return true;
            else return false;
        }));
    }
}

или даже лучше

class Project_Twig_Extensions extends Twig_Extension{
    protected $detect = null

    protected function getDetector() {
        if ($this->detect === null) $this->detect = new \Mobile_Detect();
        return $this->detect;
    }

    public function getFunctions() {

        return array(new Twig_SimpleFunction('detectDevice', function() {
            return $this->getDetector()->isMobile();
        }));
    }
}

На потерянной заметке, пожалуйста, убедитесь, что покажет все ошибки в то время каквы развиваетесь ..

...