Выполнение PHP-кода в теме дизайна

Для внесения различных мелких изменений в содержимое страниц фронтенда иногда может понадобиться использование дополнительного фрагмента PHP-кода. Поскольку выполнение PHP-кода непосредственно в HTML-шаблонах не допускается, то для достижения требуемого результата необходимо оформить PHP-код в виде пользовательского метода-хелпера и добавить вызов этого хелпера в шаблон темы дизайна. Создание и использование пользовательских хелперов описаны в документации разработчика.

Пример

Допустим, вам необходимо внедрить в произвольное место витрины Shop-Script 6 результат работы некоторого PHP-скрипта, например, отображающего курсы валют. Создайте пользовательский класс shopCustom в файле wa-apps/shop/lib/classes/shopCustom.class.php:

<?php

class shopCustom
{

    public static function getExchangeRatesHtml() //имя метода может быть произвольным
    //идентификаторы public static — обязательны
    {
        ... //произвольная логика формирования требуемого HTML-кода для отображения на витрине
        return $html; //значение, возвращаемое методом, добавляется в HTML-код страницы в том месте, где размещен его вызов
    }
    
    public static function ...() //еще один метод-хелпер; в этот класс можно добавлять неограниченное количество методов
    {
        ...
    }

}

Для того чтобы разместить блок с информацией о курсах валют (в данном примере) на витрине интернет-магазина, добавьте в нужное место исходного кода шаблона или информационной страницы вызов метода-хелпера, как показано ниже:

{shopCustom::getExchangeRatesHtml()}
Для корректной работы хелпера может потребоваться очистка кеша в «Инсталлере».

13 комментариев

  • +1

    Подскажите пожалуйста, можно ли в этой конфигурации использовать include? Например:

    <?php

    class shopCustom

    {

    public static function getUserFail()

    {

    return include "/wa-data/public/user/file.php";

    }

    }

    • +1

      include сработает, как и в любом другом месте в PHP-коде.

      Путь лучше склеить полный. Например, используя функцию
      wa()->getConfig()->getRootPath()
      которая вернёт путь к каталогу установки фреймворка (где index.php лежит). Без завершающего слеша.

      И обращаю ваше внимание, что это не очень мудрое решение хранить скрипты в wa-data, особенно в wa-data/public. Выглядит небезопасненько. Для чего это нужно?

      • +1

        Спасибо за оперативный ответ! Особой необходимости нет, нам при установке Script-Shop создали в Public папки для изображений, скриптов и документов, так и пользуемся, их лучше перенести в Protected?

        • +2

          wa-data - это правильное место для картинок и документов, но плохое место для исполняемых файлов. PHP-файлы в public можно вызвать напрямую из браузера, если знать URL - это опасно и это главная причина. В protected так не получится, и с этой точки зрения protected лучше, чем public. Но идеологически неправильно. Если нет специальных причин держать файлы именно там, лучше не держать.

          Хорошее место для вашего файла - это либо wa-config, либо wa-apps/shop/lib, рядом с вашим shopCustom.class.php

          Если в файле, например, массив с настройками, то ему самое место в wa-config. А если много сложной логики, то пусть в приложении живёт.

        • +1
          Михаил Михаил 13 июня 2016 11:37 #

          Здравствуйте. Помогите, пожалуйста, настроить правильно. Вроде бы сделал все, как описано в инструкции, но не работает.

          В каталоге wa-apps/shop/lib/classes/ создал файл shopGetIpUser.class.php с содержимым:

          <?php

          class shopGetIpUser

          {

          public static function getExchangeRatesHtml()

          {

          include ("http://*******/getip-test/tabgeo_country_v4.php");

          $ip = $_SERVER['REMOTE_ADDR'];

          $country_code = tabgeo_country_v4($ip);

          echo $country_code;

          echo "test";

          }

          }

          ?>


          Вызываю таким образом {shopGetIpUser::getExchangeRatesHtml()} , но не срабатывает, открывается пустая страница. Что не так?


          • +2
            Алексей Алексей Webasyst 13 июня 2016 19:03 #

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

            • +1
              Михаил Михаил 14 июня 2016 08:19 #
              <?php

              class shopGetIpUser

              {

              public static function getExchangeRatesHtml()

              {

              echo "test";

              }

              }

              ?>


              Если сделать так, то срабатывает.. Походу проблема в include.

              include ("http://*******/getip-test/tabgeo_country_v4.php");


              Может что-то неправильно написано? (

              • +2

                include('http://...') - это странно. Если я правильно понял, файл лежит на вашем же сервере. А если не на вашем, то в любом случае скачайте его и поместите у себя. Вместо подключения по сети подключайте локальный файл:

                include_once("getip-test/tabgeo_country_v4.php"); // путь относительно корня фреймворка, т.е. index.php

                (include_once чтобы ничего не сломалось, если файл вызывается больше одного раза)

                Вообще, дело двинулось бы гораздо быстрее, если бы вы смогли включить вывод ошибок PHP в браузер или найти файл с логами. Не надо было бы гадать на кофейной гуще, что пошло не так...

              • +1
                Виталий Виталий 31 июля 2016 18:04 #

                Добрый день!

                Нам необходимо вставить такой код на все страницы сайта

                include_once $_SERVER['DOCUMENT_ROOT'].'/clickfrogru_udp_tcp.php';

                сразу после <?php или <? на все целевые страницы.


                файл clickfrogru_udp_tcp.php залит в корень сайта


                подскажите пожалуйста в какой файл это нужно вставить, в шаблонах я не нашел это - сразу после <?php или <?

                • +1
                  Алексей Алексей Webasyst 1 августа 2016 09:18 #

                  Перечитайте тему выше - в шаблонах исполнение php кода не производится. Совсем.
                  Поэтому содержимое вашего файла необходимо оформить в виде хелпера и его вызывать.

                  Добавить комментарий

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