Перейти к содержанию
patrol

[Решено] Не могу получить переменную из header.tpl

Рекомендуемые сообщения

Проблема такая в header.tpl есть код такой код

<body>
   <?php	
  include("SxGeo.php");
  $SxGeo = new SxGeo('SxGeoCity.dat');
  $ip = $_SERVER['REMOTE_ADDR'];
  $city = $SxGeo->get($ip);	
  $town=$city['city']['name_en'];
?>

но в  category.tpl, product.tpl я не могу вызвать переменную $town  ("Undefined variable: town"). Знания php не очень))

Подскажите как реализовать. Спасибо за помощь))

 

Изменено пользователем patrol

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала...

За такое $_SERVER['REMOTE_ADDR']

Садись кол и проблемы в безопасности будут гарантированы

Это грубейшая ошибка культуры написания кода в opencart

Opencart используйте как FW

Используются $this->request->server и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и не получится) Решением может стать написание своего класса в котором инициализируется и определяется город. В OpenCart этот класс можно внедрить как библиотеку (system/library) или хелпер (system/library/helper). в index.php его можно подключить и инциализировать, затем нужно добавить его в реестр, чтобы можно было пользоваться в контексте OpenCart. Если он (класс для определения геолокации) используется только в модулях, то можно инициализировать его только в модулях используя встроенный механизм для загрузки библиотек или хелперов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Конечно не можете, она ведь находится в области видимости метода render того объекта контроллера, в контексте которого используется (куда включается шаблон header.tpl). Используйте реестр, если вам нужно использовать её в другом контроллере. Например:

<body>
    <?php

        include("SxGeo.php");
        $SxGeo = new SxGeo('SxGeoCity.dat');
        $ip    = $_SERVER['REMOTE_ADDR'];
        $city  = $SxGeo->get($ip);    
        $this->registry->set('town', $city['city']['name_en']);

        // Обращаться к ней можно так
        var_dump($this->town);

        // Или так
        var_dump($this->registry->get('town'));

    ?>

Кстати, в $_SERVER['REMOTE_ADDR'] не всегда содержится реальный IP клиента ;)

Изменено пользователем ZeroHero

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое))) очень помогло))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так и не получится) Решением может стать написание своего класса в котором инициализируется и определяется город. В OpenCart этот класс можно внедрить как библиотеку (system/library) или хелпер (system/library/helper). в index.php его можно подключить и инциализировать, затем нужно добавить его в реестр, чтобы можно было пользоваться в контексте OpenCart. Если он (класс для определения геолокации) используется только в модулях, то можно инициализировать его только в модулях используя встроенный механизм для загрузки библиотек или хелперов.

 Спасибо за совет)Могли привести краткий пример, как это сделать? Спасибо))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Library system/library/SxGeo.php в нем одноименный класс геолокации. 

В index.php:

require_once(DIR_SYSTEM . 'library/SxGeo.php');

$SxGeo= new SxGeo('SxGeoCity.dat');
$registry->set('SxGeo', $SxGeo);

А в самом классе проще сделать конструктор, который будет обрабатывать IP и класс должен хранить город. Затем эти данные можно буде полуить в любом месте во так:

$this->SxGeo->town
Изменено пользователем halfhope

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо огромное) А можно можете расписать подробнее, извините за наглеж)))))))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проще так, без прослойки. Копируешь файл sxgeo.php в system/library/ потом в index.php после:

$request = new Request();
$registry->set('request', $request); //После занесения класса request в ресстр
Пишешь:

require_once(DIR_SYSTEM . 'library/sxgeo.php');

$SxGeo = new SxGeo('SxGeoCity.dat');
$registry->set('SxGeo', $SxGeo); 
Теперь берешь и вызываешь в любом месте движка:

$this->SxGeo->get($ip);
Вместо $_SERVER['REMOTE_ADDR] рекомендую использовать $this->request->server['REMOTE_ADDR]. Ясно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.