как постфильтром ещё раз пропарсить аут?

predator

web designer
как постфильтром ещё раз пропарсить аут?

сабж касается языковых вставок, в которых могут быть ссылки, соответственно в них могут быть переменные смарти

переменные хранятся в БД и подставляются где нужно - но, естественно, смарти их просто посдставляет но не парсит

вот потребовалось

кто знает расскажите

ненашёл как пропарсить переменную, а не шаблон :(

хочется не писать преги а просто чтобы смарти ещё раз прошёлся по результатам первого прохода

вроде понятно всё написал :D

-~{}~ 20.04.05 02:55:

кудато нетуда я клацнул
перенесите плиз в smarty и иже с ним
 

alexhemp

Новичок
predator

А зачем так сложно-то?

Неужели нельзя либо хранить языковые данные в отдельном массиве например $lang и вставлять потом

$lang.MESSAGE1

или использовать механизм файлов конфигурации?
 

predator

web designer
они и хранятся в отдельном массиве - всё верно,
только иногда бывает в строке вот такая беда:
PHP:
<a class="nul mblue" href="{$smarty.const.USER_SEARCH_SIGN}">Browse</a>
это получается нужно одну фразу хранить как две части - левую и правую.

а если в текста непример 2-3 ссылки такого вида, или ещё что-нить - на сколько частей бить?

вот из-за этого и возник вопрос.

нехочется напрямую вызывать методы компилера - это неэстетично.

я тут ещё думал в оутфильтре или вообще в своей функции, заново создать объект смарти и пропарсить результат. Но в смарти как-то железно заведено - парсим только файлы, без гвоздей. И как там воспримутся уже обработанные куски с пхп-кодом (хотя это должно прокатить по-идее).

беда прям :)

-~{}~ 20.04.05 17:44:

с файлами конфигурации сложнее чем с БД
проект горит
в админке редактирование фраз
надо в БД хранить.
 

alexhemp

Новичок
predator

А понял, ты хочешь текст держать со ссылками такого рода тоже в базе?

Тогда тебе по сути это называется - часть шаблонов держать в базе, а часть в файловой системе.

Тогда можно попробовать штатный путь:

1. Делаем собственный ресурс-плагин
http://smarty.php.net/manual/ru/template.resources.php
там в конце пример как брать из базы тебе же нужно просто брать по ключу из глобального массива ;-)
2. Читаем все строки из базы, обрабатываем как ресурс через fetch

Примерный алгоритм:

1. Сперва читаем из базы в массив $lang
2. Потом через ресурс обрабатываем шаблоны $lang = $smarty->fetch('lang:'.$i);
(модификатор lang лезет в глобальный массив $lang за строкой)
3. Потом $smarty->assign('lang', $lang);
4. Потом уже $smarty->display('page.tpl');

Должно работать, ничего сложного...
 

predator

web designer
спасибо!
то что доктор прописал
как сделаю - сюда скину для примера :)

-~{}~ 21.04.05 02:23:

готово!
ну я намучался >:))
везде написано что ресурс регистрируется так:
PHP:
...->register_resource( 'lang', array( 'smarty...
на самом деле нужно так
PHP:
...->register_resource( 'lang:', array( 'smarty...
подумаешь сами догадаются, думали разработчики :))

кода получилось немного, но как образец сгодится:

1. наш ресурс (файл в смарти/плугинс)
PHP:
/*
 * Smarty resource
 * ------------------------------------------------------------- 
 * File: resource.lang.php
 * Type: resource
 * Name: lang
 * Purpose: Fetches templates from a Language array
 * -------------------------------------------------------------
 */
function smarty_resource_lang_source( $_strKey, &$strResult, &$objS ) {
	$strResult=$GLOBALS['arrLang'][$_strKey];
	if ( !empty( $strResult ) ) {
		return true;
	} else {
		return false;
	}
}

function smarty_resource_lang_timestamp( $_strTplName, &$intTime, &$objS ) {
	$intTime=time();
	return true;
}

function smarty_resource_lang_secure( $_strTplName, &$objS ) {
	return true;
}

function smarty_resource_lang_trusted( $_strTplName, &$objS ) {}
2. функция для обхода многомерного массива:
PHP:
	function smarty_lang_recurse( $arrData ) {
		$GLOBALS['arrLang']=$arrData;
		foreach ( $GLOBALS['arrLang'] as $k=>$v ) {
			if ( is_array( $v ) ) {
				$arrResult[$k]=$this->smarty_lang_recurse( $v );
			} else {
				$arrResult[$k]=$this->objS->fetch( 'lang:'.$k );
			}
		}
		unSet( $GLOBALS['arrLang'] );
		return $arrResult;
	}
да совсем забыл :)
до вызова этой функции нужно объявить ресурс, например вот так
PHP:
$this->objS->register_resource( 'lang:', array( 'smarty_resource_lang_source', 'smarty_resource_lang_timestamp', 'smarty_resource_lang_secure', 'smarty_resource_lang_trusted' ) );
смущает только передача массива через $GLOBALS
но использовать объект смарти ($this->objS) для передачи переменных тоже как-то не по объектно-ориентированному :))

alexhemp что скажешь насчёт последнего?
 

alexhemp

Новичок
predator

смущает только передача массива через $GLOBALS
но использовать объект смарти ($this->objS) для передачи переменных тоже как-то не по объектно-ориентированному :))
Не понимаю, что тебя смущает. Я вообще не понимаю, зачем ты выносишь обход массива языковых ресурсов в класс шаблонизатора. Это можно спокойно делать просто в скрипте.

Вот примерно:

1. Инициализировал смарти, задал все умолчания (у меня из базы читается таблица config и передается в смарти массив $config, а так-же вычисляются некоторые элементы этого массива, например если не задан HTTP_HOST в конфигурации то он берется из $_SERVER и т.п.

2. Инициализировал глобальный массив $lang

3. Зарегистрировал ресурс "lang"

4. Прошелся в цикле по этому массиву

5. Разрегистрировал ресурс "lang" (чтобы случайно не отпарсить еще раз)


шаги с 2-ого по 5-ый можно вынести в отдельный модуль просто и подключать через require_once :)
 
Сверху