$smarty.get.page не передаёт данные в php
У меня есть input где я в value указал вот так >
value="{$smarty.get.page}" name="page"
Чтобы брать utm метку
http://www.example.com/index.php?page=foo
В php пишу вот так чтобы взять данные с инпута
$utm = $_GET['page'];
Что я делаю не так?
Ответы (1 шт):
Вы уже не первый вопрос задаете на одну и ту же тему, не особо понимая, что и как работает, поэтому давайте разбираться в том как вещи устроены.
Клиент с сервером общается с помощью http-запросов. Запросы могут быть разных типов. В основном используются два основных get и post. Первый предназначен для получения данных, второй для изменения.
Когда вы пишите ссылку в адресной строке или совершаете переход через <a> браузер отправляет GET запрос. Для отправки POST-запроса используются формы <form method="POST">.
Параметры url, которые указаны после ? (?param=1¶m2=2) на стороне пхп попадают в массив $_GET. Параметры формы с соответствующим методом - в массив $_POST. Все вместе доступно в массиве $_REQUEST.
Если action формы выглядит как xxx.php?param=1, а сама форма содержит некие поля, то у вас будет заполнены оба массива. в $_GET получите ['param' => 1] а в $_POST все остальные поля формы. То есть формально массивы привязаны не к типу запроса, а в $_GET мы получаем параметры из url (вне зависимости от типа запроса), а в $_POST данные формы при post-запросе.
Далее. Smarty это шаблонизатор. основная его задача - преобразовать .tpl шаблон в исполняемый пхп код. Все конструкции вида {foreach}, {if} и т.п. компилируются в обычные пхп файлы, которые доступны в папке compile. При разработке имеет смысл настроить перекомпилцию шаблона при его изменении. при этом каждый раз смарти проверяет дату изменения файла и дату компиляции шаблона, если надо - обновляет. В продакшен среде такие проверки отключают. скомпилированные шаблоны удаляют при необходимости их обновить.
Для доступа к переменным запроса смарти имеет зарезервированные переменные get/post. Например, для формы вида
<form action="?param=1" method="POST">
<input type="hidden" name="field" value="2"/>
значения переменных можно получить через {$smarty.get.param} или {$smarty.post.field}, также есть {$smarty.request.} где доступны оба значения.
Для вывода данных, полученных от пользователя, используют экранирование с помощью модификатора escape. Пример - {$smarty.get.param|escape}, в противном случае можно получить инъекцию js либо html.
На практике прямое использование smarty.get/post не шибко то распространено. Шаблоны по сути предназначены для вывода/представления данных. А параметры в основном предназначаются для обработки в бизнес-логике. Так что обычная схема работы выглядит следующим образом. В пхп коде вы получаете нужные данные запроса, передаете их в смарти с помощью метода assign, а там уже используете.
Пример:
<?php
$page = intval($_GET['page']) ?? 0;
$smarty = new Smarty();
$smarty->assign('page', $page);
$smarty->display('template.tpl');
и шаблона
<a href="?page={$page+1}">далее</a>
Если по какой-то причине у вас есть url вида ?page=1, но при этом {$smarty.get.page} дает пустой результат, значит где-то в процессе работы пхп кода массив $_GET либо $_GET['page'] были очищены. Повторюсь, что ключевым способом работы является явная передача нужных данных в шаблон через assign, либо другие способы в случае использования различных фреймворков, а не прямого использования smarty.