$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 шт):

Автор решения: teran

Вы уже не первый вопрос задаете на одну и ту же тему, не особо понимая, что и как работает, поэтому давайте разбираться в том как вещи устроены.

Клиент с сервером общается с помощью http-запросов. Запросы могут быть разных типов. В основном используются два основных get и post. Первый предназначен для получения данных, второй для изменения.

Когда вы пишите ссылку в адресной строке или совершаете переход через <a> браузер отправляет GET запрос. Для отправки POST-запроса используются формы <form method="POST">.

Параметры url, которые указаны после ? (?param=1&param2=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.

→ Ссылка