Выполнение PHP-кода на страницах сайта

Вызов PHP-функций, создание классов-хелперов, установка приложений и плагинов

На страницах сайта и в темах дизайна используется язык-шаблонизатор Smarty. В этом языке есть возможность добавлять фрагменты PHP-кода с помощью тегов {php}...{/php}, но фреймворк Webasyst блокирует эту возможность, чтобы обеспечить безопасную работу сайта. Есть несколько вариантов обхода этой блокировки.

Вызов PHP-функций

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

Пример

{date('d.m.Y')}

Создание класса-хелпера

Создание и использование пользовательских хелперов описаны в документации для разработчиков.

Пример

Создайте пользовательский класс 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 ...() //еще один метод-хелпер; в этот класс можно добавлять неограниченное количество методов
    {
        ...
    }

}

Добавьте вызов метода класса в HTML-шаблоне:

{shopCustom::getExchangeRatesHtml()}
Возможность загрузки собственных классов-хелперов в облаке Webasyst недоступна. В облаке используйте другие варианты внедрения PHP-кода: вызов PHP-функций и создание приложений и плагинов.

Создание плагина или приложения

Это наиболее масштабный вариант внедрения PHP-кода на страницы сайта. Процесс написания приложений и плагинов для Webasyst описан в документации для разработчиков.

Приложение или плагин могут использовать имеющиеся программные события — хуки — в коде других приложений. Если имеющихся хуков недостаточно, то потребуется добавление вызова методов приложения или плагина в HTML-шаблоны страниц или темы дизайна.

Для того чтобы установить собственное приложение или плагин в облаке Webasyst, нужно зарегистрироваться в качестве разработчика и опубликовать свой программный продукт в магазине Webasyst. После этого продукт можно будет установить в «Инсталлере».

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

  • +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 кода не производится. Совсем.
                  Поэтому содержимое вашего файла необходимо оформить в виде хелпера и его вызывать.

                • +1
                  Victorovich Victorovich 29 июня 2017 06:37 #

                  Подскажите а как сделать, чтобы вот эта штука {shopCustom::getExchangeRatesHtml()} работала если ее вставить в Дополнительные параметры страницы. В шаблоне у меня работает, а в доп.параметрах нет.


                  • +1

                    Кажется, никак. Добавьте доп. параметр

                    show_rates=1

                    И в шаблоне темы дизайна используйте условие вида

                    {if $category.params.show_rates}{shopCustom::getExchangeRatesHtml()}{/if}
                    • +1
                      Olejeg Bolduin Olejeg Bolduin 13 октября 2017 09:01 #

                      Добрый день!

                      Подскажите как ajax'ом передать что то в этот класс wa-apps/shop/lib/classes/shopCustom.class.php, в какой-нибудь метод?

                      • +1
                        Михаил Ушенин Михаил Ушенин Webasyst 13 октября 2017 09:33 #

                        В самом простом случае оформите свой класс в виде контроллера — например, waJsonController, если нужно возвращать ответ в формате JSON. В бекенде это может сработать, потому что там не требуется настраивать правила маршрутизации.

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

                        • +1
                          Olejeg Bolduin Olejeg Bolduin 13 октября 2017 13:46 #

                          Я сделал плагин. Мне надо ajax'ом передать value инпута в метод. Не пойму как обратиться к своему методу.

                          Поместил папку wa-apps/shop/plugins/myplugin/lib/shopMyplugin.plugin.php,

                          добавил там публичный метод. Как теперь мне ajax запрос отправить в этот метод со стороны клиента. По типу: клиент нажал на кнопку и улетел ajax в этот метод с параметром value с этой же кнопки?

                        • +1
                          Леонид Вакуленко Леонид Вакуленко Webasyst 13 октября 2017 10:09 #

                          Правильно и хорошо будет сделать плагином, как Михаил описал.

                          Можно сделать очень грязный хак. Создать страницу в Магазине или Сайте с кодом {shopCustom::mymethod()}, а в методе сделать exit:

                          class shopCustom {
                              public static function mymethod() {
                                  echo json_encode(array(waRequest::param(), waRequest::get(), waRequest::post()));
                                  exit;
                              }
                          }

                          Это выведет только JSON без внешней обвязки дизайна. Вроде сработает, но ёлки ж палки... Сами через полгода не разберётесь как ваш сайт работает))

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

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