Ну хорошо. Первое решение было - создать на админке поле ввода, в котором указывать маску по типу:
Город ##city##. Поиск ##object_type##. В диапазоне цен от ##price_from## до ##price_to##.а в скрипте динамически заменять ##bla_bla## на его значение.
Вот код, который это делает:
function replace_all_tags($string, $data) { $separator = '##'; if (substr_count($string, $separator)) { foreach ($data as $key=>$value) { $string = str_replace($separator.$key.$separator, $value, $string); } } return $string; }На вход передаем строку шаблон и массив с данными (ХЗ как такой массив называется, но там данные хранятся под строковыми индексами - ассоциативный массив, что ли).
Все клево! Но, бывают случаи, когда форма заполняется таким образом, что некоторые параметры - пустые, а результирующий тайтл теряет смысл. В нашем примере, если поиск будет проводиться по области, а дпиапазон цен не указан, то в тайтле мы увидим
Город . Поиск квартир. В диапазоне цен от до .Не гуд! И тут на ум пришла идея сделать шаблоны более умными, а именно добавить оператор if.
Синтаксис его придумал такой {if (<условие>) <шаблон>}, где <условие> - имя параметра наличие (или отсутствие) которого проверяется, а <текст> - подшаблон, включающий в себя конструкции типа ##<имя переменной>## и/или текст. <условие> может быть с префиксом !, что означает - что мы проверяем отсутствие параметра, или без него (наличие параметра). К примеру в примере с городом и диапазоном цен, мы могли бы выкрутитсья так:
{if (city) Город ##city##.}{if (!city) Регион ##region##.} Поиск ##object_type##. {if (price_from) В диапазоне цен от ##price_from## до ##price_to##.}
А вот метод, которым стоит обработать шаблон, чтобы обработать все if конструкции.
function process_if_constructions($pattern, $parameters) { preg_match_all('"(\{if \((!?.+?)\) (.+?)\})"', $pattern, $if_constructions); foreach ($if_constructions[2] as $index=>$condition) { $invert = (strpos($condition, '!') === 0); if ($invert) { $name = substr($condition, 1); } else { $name = $condition; } $parameter_present = (!!$parameters[$name]); if ($invert) { $parameter_present = !$parameter_present; } if ($parameter_present) { $replacement = $if_constructions[3][$index]; } else { $replacement = ''; } $pattern = str_replace($if_constructions[1][$index], $replacement, $pattern); } return $pattern; }На вход передается шаблон, и ассоциативный массив, а на выходе получаем шаблон содержащий только ##bla_bla## операторы.
Этот код можно было усложнять, но на данном этапе разработки мне хватило и этого.
Комментариев нет:
Отправить комментарий