Выполнение 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. После этого продукт можно будет установить в «Инсталлере».

32 комментария

  • +1
    mFrantsuz mFrantsuz 8 мая 2015 11:51 #

    Подскажите пожалуйста, можно ли в этой конфигурации использовать 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
        mFrantsuz mFrantsuz 8 мая 2015 13:01 #

        Спасибо за оперативный ответ! Особой необходимости нет, нам при установке 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
            mFrantsuz mFrantsuz 8 мая 2015 13:41 #

            Леонид, спасибо четко и ясно! Помогите пожалуйста составить правильный путь используя функцию wa()->getConfig()->getRootPath(), если файл будет размещен в wa-apps/shop/lib. Заранее спасибо!

            • +2

              return include wa('shop')->getAppPath('lib/file.php');

              подключит файл wa-apps/shop/lib/file.php

              • +1
                mFrantsuz mFrantsuz 8 мая 2015 14:18 #

                Спасибо! Поддержка 5 звезд!!! Напишите пожалуйста с Вашей корпоративной почты на адрес support@wishcraft.ru мы вышлем постоянный VIP-купон нашего магазина. Вы СУПЕР!!!

              • +1
                mFrantsuz mFrantsuz 8 мая 2015 14:16 #

                Спасибо! Поддержка 5 звезд!!! Напишите пожалуйста с Вашей корпоративной почты на адрес support@wishcraft.ru мы вышлем постоянный VIP-купон нашего магазина. Вы СУПЕР!!!

              • +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 с этой же кнопки?

                              • +2
                                Леонид Вакуленко Леонид Вакуленко 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 без внешней обвязки дизайна. Вроде сработает, но ёлки ж палки... Сами через полгода не разберётесь как ваш сайт работает))

                              • +1
                                Denis Storm Denis Storm 5 февраля 2019 12:07 #

                                Как мне добавить следующий код, если сайт на облаке? 

                                $arr = array(4000 => 0.98, 10000 => 0.97, 20000 => 0.96, 50000 => 0.95);
                                $skidka = 1;
                                foreach ($arr as $k => $v) { if ($p.price >= $k} $skidka = $v; }
                                $e = {shop_currency_html($p.price)} * $skidka;
                                echo($e);

                                • +1
                                  Михаил Ушенин Михаил Ушенин Webasyst 6 февраля 2019 08:54 #

                                  Переделайте код по правилам Smarty и добавьте его в шаблон темы дизайна:

                                  {$arr = [4000 => 0.98, 10000 => 0.97, 20000 => 0.96, 50000 => 0.95]}
                                  {$skidka = 1}
                                  {foreach $arr as $k => $v}
                                      {if $p.price >= $k}
                                          {$skidka = $v}
                                      {/if}
                                  {/foreach}
                                  {shop_currency_html($p.price) * $skidka}

                                • +1

                                  Здравствуйте, подскажите, кто-нибудь, пожалуйста, как сделать так чтобы php код сработал. Есть 3 файла главный(index.php), файл с яваскриптом, и файл php

                                  В яваскрипт файле подключается php файл вот таким образом

                                  var JSONReviewsGeneratorReference = 'путь до php файла'; Но получается php файл в шопскрипте использовать нельзя и не понимаю как тогда подключить и сделать так, чтобы скрипт сработал. Пожалуйста, подскажите кто знает.

                                  Код php файла:

                                  <?php
                                  $request_params = [
                                  'group_id' => '111',
                                  'topic_id' => '111',
                                  'need_likes' => 1,
                                  'offset' => 0,
                                  'count' => 100,
                                  'extended' => 1,
                                  'sort' => 'desc',
                                  'version' => 5.87,
                                  'access_token' => '124'
                                  ];
                                  $url = "https://api.vk.com/method/board.getComments?" . http_build_query($request_params);
                                  $wall = file_get_contents($url);
                                  echo $wall;
                                  ?>
                                • +1
                                  Рустам Турсунов Рустам Турсунов 3 апреля 2019 22:08 #

                                  Здравствуйте товарищи! )

                                  Помогите пожалуйста, делаю все так как и описано в данной теме, все посты перечитал, но ответа к сожалению так и не увидел!!!

                                  Файл: /wa-apps/site/lib/classes/siteGetIpUser.class.php

                                  Содержание файла:

                                  <?php
                                  class siteGetIpUser {
                                          public static function getIpUserHtml() {
                                          $ip = $_SERVER['REMOTE_ADDR'];
                                          return $ip;
                                      }
                                  }

                                  В index.html приложения "Сайт" пытаюсь вызвать в javascript:

                                  var yaParams = {ip: "{ siteGetIpUser::getIpUserHtml() }"};

                                  Но даже если б и не в js - все-равно отдает только html, а выполнения нету!

                                  Чистка кэша - не помогает! Подскажите что не так то?

                                  • +1
                                    Михаил Ушенин Михаил Ушенин Webasyst 4 апреля 2019 09:24 #

                                    Измените вызов в HTML-файле вот так:

                                    var yaParams = {ldelim}ip: "{siteGetIpUser::getIpUserHtml()}"{rdelim};

                                    {ldelim} и {rdelim} вставляют открывающую и закрывающую фигурные скобки в код шаблона — без их интерпретации шаблонизатором Smarty. Если писать фигурные скобки как есть, Smarty попытается интерпретировать содержимое внутри них, а у вас там не (только) код Smarty.

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

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