Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

Проблема такая в 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 не очень))

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

 

Edited by patrol
Link to post
Share on other sites

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

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

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

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

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites

Конечно не можете, она ведь находится в области видимости метода 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 клиента ;)

Edited by ZeroHero
Link to post
Share on other sites

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

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

Link to post
Share on other sites

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
Edited by halfhope
Link to post
Share on other sites

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

Link to post
Share on other sites

Проще так, без прослойки. Копируешь файл 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]. Ясно?
Link to post
Share on other sites
  • 4 years later...

Пожалуйста, подскажите решение для ocstore 2.3. там index.php отличается. Куда прописать $registry->set('SxGeo', $SxGeo);  ?

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.