Вызов PHP-функций
Некоторые PHP-функции можно выполнять на страницах и в шаблонах дизайна. Для этого вызов функции нужно заключить в фигурные скобки.
Пример
{date('d.m.Y')}
Создание класса-хелпера
Кроме стандартных функций PHP, в шаблонах Smarty можно также использовать вызовы методов собственных 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 ...() //еще один метод-хелпер; в этот класс можно добавлять неограниченное количество методов { ... } }
Добавьте вызов метода класса в шаблоне Smarty:
{shopCustom::getExchangeRatesHtml()}
В облаке Webasyst возможность загрузки собственных классов-хелперов недоступна.
Создание плагина или приложения
Это наиболее масштабный вариант внедрения PHP-кода на страницы сайта. Процесс написания приложений и плагинов для Webasyst описан в документации для разработчиков.
Приложение или плагин могут использовать имеющиеся программные события (хуки) — в коде других приложений. Если имеющихся хуков недостаточно, то потребуется добавление вызова методов приложения или плагина в HTML-шаблоны страниц или темы дизайна.
Для того чтобы установить собственное приложение или плагин в облаке Webasyst, нужно зарегистрироваться в качестве разработчика и опубликовать свой программный продукт в магазине Webasyst. После этого продукт можно будет установить в «Инсталлере».
35 комментариев
Подскажите пожалуйста, можно ли в этой конфигурации использовать include? Например:
<?php
class shopCustom
{
public static function getUserFail()
{
return include "/wa-data/public/user/file.php";
}
}
include сработает, как и в любом другом месте в PHP-коде.
Путь лучше склеить полный. Например, используя функцию
wa()->getConfig()->getRootPath()
которая вернёт путь к каталогу установки фреймворка (где index.php лежит). Без завершающего слеша.
И обращаю ваше внимание, что это не очень мудрое решение хранить скрипты в wa-data, особенно в wa-data/public. Выглядит небезопасненько. Для чего это нужно?
Спасибо за оперативный ответ! Особой необходимости нет, нам при установке Script-Shop создали в Public папки для изображений, скриптов и документов, так и пользуемся, их лучше перенести в Protected?
wa-data - это правильное место для картинок и документов, но плохое место для исполняемых файлов. PHP-файлы в public можно вызвать напрямую из браузера, если знать URL - это опасно и это главная причина. В protected так не получится, и с этой точки зрения protected лучше, чем public. Но идеологически неправильно. Если нет специальных причин держать файлы именно там, лучше не держать.
Хорошее место для вашего файла - это либо wa-config, либо wa-apps/shop/lib, рядом с вашим shopCustom.class.php
Если в файле, например, массив с настройками, то ему самое место в wa-config. А если много сложной логики, то пусть в приложении живёт.
Леонид, спасибо четко и ясно! Помогите пожалуйста составить правильный путь используя функцию wa()->getConfig()->getRootPath(), если файл будет размещен в wa-apps/shop/lib. Заранее спасибо!
return include wa('shop')->getAppPath('lib/file.php');
подключит файл wa-apps/shop/lib/file.php
Спасибо! Поддержка 5 звезд!!! Напишите пожалуйста с Вашей корпоративной почты на адрес support@wishcraft.ru мы вышлем постоянный VIP-купон нашего магазина. Вы СУПЕР!!!
Здравствуйте. Помогите, пожалуйста, настроить правильно. Вроде бы сделал все, как описано в инструкции, но не работает.
В каталоге 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()} , но не срабатывает, открывается пустая страница. Что не так?
Проверьте Логи сервера, возмождно там ошибки указаны.
Если нет то тогда уже проверять по шагам на каком части у вас ошибка.
class shopGetIpUser
{
public static function getExchangeRatesHtml()
{
echo "test";
}
}
?>
Если сделать так, то срабатывает.. Походу проблема в include.
include ("http://*******/getip-test/tabgeo_country_v4.php");
Может что-то неправильно написано? (
include('http://...') - это странно. Если я правильно понял, файл лежит на вашем же сервере. А если не на вашем, то в любом случае скачайте его и поместите у себя. Вместо подключения по сети подключайте локальный файл:
(include_once чтобы ничего не сломалось, если файл вызывается больше одного раза)
Вообще, дело двинулось бы гораздо быстрее, если бы вы смогли включить вывод ошибок PHP в браузер или найти файл с логами. Не надо было бы гадать на кофейной гуще, что пошло не так...
С этим разобрался, спасибо за помощь!
Добрый день!
Нам необходимо вставить такой код на все страницы сайта
include_once $_SERVER['DOCUMENT_ROOT'].'/clickfrogru_udp_tcp.php';
сразу после <?php или <? на все целевые страницы.файл clickfrogru_udp_tcp.php залит в корень сайта
подскажите пожалуйста в какой файл это нужно вставить, в шаблонах я не нашел это - сразу после <?php или <?
Перечитайте тему выше - в шаблонах исполнение php кода не производится. Совсем.
Поэтому содержимое вашего файла необходимо оформить в виде хелпера и его вызывать.
Подскажите а как сделать, чтобы вот эта штука {shopCustom::getExchangeRatesHtml()} работала если ее вставить в Дополнительные параметры страницы. В шаблоне у меня работает, а в доп.параметрах нет.
Кажется, никак. Добавьте доп. параметр
И в шаблоне темы дизайна используйте условие вида
Добрый день!
Подскажите как ajax'ом передать что то в этот класс wa-apps/shop/lib/classes/shopCustom.class.php, в какой-нибудь метод?
В самом простом случае оформите свой класс в виде контроллера — например, waJsonController, если нужно возвращать ответ в формате JSON. В бекенде это может сработать, потому что там не требуется настраивать правила маршрутизации.
Во фронтенде просто так не получится — нужно редактировать правила маршрутизации того приложения, в составе которого вы разместите файл с классом контроллера. Править оригинальный код — плохая практика, потому что каждое обновление будет удалять ваши исправления. Поэтому лучше оформить свой контроллер в составе плагина, в котором можно сформировать собственные правила маршрутизации для фронтенда для тех URL, на которые вы будете отправлять AJAX-запросы.
Я сделал плагин. Мне надо ajax'ом передать value инпута в метод. Не пойму как обратиться к своему методу.
Поместил папку wa-apps/shop/plugins/myplugin/lib/shopMyplugin.plugin.php,
добавил там публичный метод. Как теперь мне ajax запрос отправить в этот метод со стороны клиента. По типу: клиент нажал на кнопку и улетел ajax в этот метод с параметром value с этой же кнопки?
Вопросы, связанные с программированием, публикуйте, пожалуйста, на форуме для разработчиков.
Правильно и хорошо будет сделать плагином, как Михаил описал.
Можно сделать очень грязный хак. Создать страницу в Магазине или Сайте с кодом {shopCustom::mymethod()}, а в методе сделать exit:
Это выведет только JSON без внешней обвязки дизайна. Вроде сработает, но ёлки ж палки... Сами через полгода не разберётесь как ваш сайт работает))
Как мне добавить следующий код, если сайт на облаке?
Переделайте код по правилам Smarty и добавьте его в шаблон темы дизайна:
Здравствуйте, подскажите, кто-нибудь, пожалуйста, как сделать так чтобы php код сработал. Есть 3 файла главный(index.php), файл с яваскриптом, и файл php
В яваскрипт файле подключается php файл вот таким образом
var JSONReviewsGeneratorReference = 'путь до php файла'; Но получается php файл в шопскрипте использовать нельзя и не понимаю как тогда подключить и сделать так, чтобы скрипт сработал. Пожалуйста, подскажите кто знает.
Код php файла:
Нужно оформить ваши файлы в виде плагина для Shop-Script.
А как-нибудь просто обработку php кода как описано в этой статье сделать нельзя? https://support.webasyst.ru/17...
Если ваш JavaScript-код отправляет запросы на сервер, которые должны обрабатываться вашим PHP-файлом, то такой PHP-файл нужно оформить в виде контроллера, а контроллер может существовать только в составе плагина. По крайней мере, если речь идёт о работе вашего кода на витрине, а не в бекенде. Насколько я понимаю, речь идёт именно о витрине.
Здравствуйте товарищи! )
Помогите пожалуйста, делаю все так как и описано в данной теме, все посты перечитал, но ответа к сожалению так и не увидел!!!
Файл: /wa-apps/site/lib/classes/siteGetIpUser.class.php
Содержание файла:
В index.html приложения "Сайт" пытаюсь вызвать в javascript:
Но даже если б и не в js - все-равно отдает только html, а выполнения нету!
Чистка кэша - не помогает! Подскажите что не так то?
Измените вызов в HTML-файле вот так:
{ldelim} и {rdelim} вставляют открывающую и закрывающую фигурные скобки в код шаблона — без их интерпретации шаблонизатором Smarty. Если писать фигурные скобки как есть, Smarty попытается интерпретировать содержимое внутри них, а у вас там не (только) код Smarty.
Проблема то не в этом, а в том что код не отрабатывает, страница этот код отдает как html.
Сделал как вы написали - все тоже самое...
Повторюсь: чистка кэша не помогает!
Задайте вопрос на форуме поддержки — возможно, вы получите больше полезных советов.
Как в полном описании товара вывести такую конструкцию?
1. Чтобы выполнять PHP-функции в описаниях товаров, в файле wa-config/apps/shop/config.php добавьте непустое значение для параметра can_use_smarty.
Чтобы не редактировать этот файл вручную с шансами ошибиться, удобнее использовать для этого бесплатный плагин.
2. Очистите кеш в приложении «Настройки».
3. Используйте материал данной статьи: в статическом методе класса-хелпера добавьте вызов нужного вам PHP-кода.
4. Добавьте вызов своего метода в HTML-редакторе описания товара:
Подскажите я создал свой класс, и поместил его куда рекомендуется wa-apps/shop/lib/classes
Далее я вывел его {shopmyhelper::myHelper()} На странице, а как вызвать его в форме? например у меня там реализация добавления строки в текстовый файл. То как вызвать его в форме что бы выполнился запрос один раз по запросу а не при загрузке страницы.
Для выполнения кода по запросу хелперы не годятся — для этих целей нужно использовать контроллеры. Чтобы добавить в приложение новый контроллер, нужно оформить его в виде плагина. Подробнее о разработке плагинов для приложений Webasyst.