Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Libraries > Smarty исходный код шаблона


Автор: StachelDraht 28.9.2009, 00:50
Привет!
Подсткажите пожалуйста, как получить исходный код (source) шаблона?
В smarty есть какая-нибудь функция или надо пользоваться file_get_contents()?



Спасибо!

Автор: Ипатьев 28.9.2009, 08:22
Для чего это нужно?

Автор: StachelDraht 28.9.2009, 11:47
Хочу более менее понять этот smarty

На данный момент хочу сделать систему словаря на сайте.
Т.е. в шаблоне пишем {$dog} а во время компиляции слово переменная должна быть замена на слово на языке который выбран на сайте.
но тогда по идее надо было бы делать что то типа {$word_dog} что бы можно было искать в шаблоне все переменные начинающие на word а дальше уже регулярными выражениями... Потом поиск в таблице и вывод.

Цитата

Для чего это нужно? 

Вот наверно для этого 

Или я опять не в ту степь думаю?

Автор: capitan 28.9.2009, 15:10
если я правильно понял, то http://www.smarty.net/manual/ru/api.fetch.php

Автор: skyboy 28.9.2009, 15:20
Цитата(StachelDraht @  28.9.2009,  10:47 Найти цитируемый пост)
Т.е. в шаблоне пишем {$dog} а во время компиляции слово переменная должна быть замена на слово на языке который выбран на сайте.
но тогда по идее надо было бы делать что то типа {$word_dog} что бы можно было искать в шаблоне все переменные начинающие на word а дальше уже регулярными выражениями... 

не совсем ясно, какую роль предполагается отводить шаблонам с шаблонизатором. есть идея сделать шаблон хранилищем слов? откуда берется "компиляция"?
конечная задача - сайт-переводчик?

Автор: Ипатьев 28.9.2009, 15:21
Разумеется, не в ту.
Это, вообще, редкое извращение. Испечь булочки с изюмом, выковырять изюм и напихать кураги.
Почему нельзя нужное слово присвоить переменной заранее, еще до того, как она будет выведена в шаблон?

Автор: StachelDraht 28.9.2009, 15:44
нет, не много не так
если брать не конкретный сайт, а делать универсальную cms с многоязычной поддержкой

есть таблица в базе с полями id, eng, ger, rus, fin...

и смысл то заключается в том, что бы не присваивать в каком нибудь там index.php нужное слово переменной, а просто в шаблоне писать  к примеру {$word_dog} из чего было бы понятно что перменную которая начинается на word обробатывать как слово которое должно выводится из словаря (словарь - эта самая таблица в базе)

Автор: capitan 28.9.2009, 15:50
StachelDraht,  а не проще кидать в сессию версию сайта и делать выборку из нужного поля в базе, а не извращаться со Smarty?  Тем более структура базы это позволяет сделать.

Чтобы {$word_dog}  вывести, эту переменную все равно придется создать
Код

$smarty->assign('word_dog',$word_dog); 

Автор: Ипатьев 28.9.2009, 16:03
Автор, судя по всему, изобретает gettext. Речь о языковых константах, которые, обычно, прописаны в теле шаблона. 
Кстати, как дружить смарти с геттекстом, я не знаю. Надо подумать

capitan, в сессию язык писать нельзя. идентификатор языка должен присутствовать в адресной строке, в любой ее части

Автор: capitan 28.9.2009, 16:17
Ипатьев, Чтобы сдружить Gettext и Smarty как вариант использовать фильтр.
http://www.phpinsider.com/smarty-forum/viewtopic.php?p=42156&sid=c92c6f30428ac4b64714d64b51f0bc11#42156

По поводу "идентификатор языка должен присутствовать в адресной строке, в любой ее части" не согласен. Может потеряться, например при посте или юзер уберет все из адресной строки, оставив только домен.

Обычно для локализации используют иконки,- нажал и получил нужную локализацию. Или использовать под каждую локализацию поддомен. Тогда точно не потеряется. Хотя встречал сайты, где индефикатор есть в строке. Как пример все тот же http://php.net/

P.S.  вроде похожая тема http://forum.vingrad.ru/forum/topic-233263.html

Автор: Ипатьев 28.9.2009, 16:26
Домен - это тоже часть адресной строки. Доводы про "юзер сотрет" всегда очень смешные. точно так же он может вообще браузер закрыть. Или другой домен набрать.
Передача языка в адресе - это аксиома. Меня удивляет, что по таким очевидным вещам постоянно возникают вопросы. Одному надо 2 дня рассказывать, как SQL запросы составлять. Другому - как к файлам обращаться. Третьему на существование поисковиков глаза открывать. И ведь, что самое странное - не тем, кто вопросы задает, а тем, кто отвечает.

register_prefilter - это, видимо, то, что автор искал.

Автор: sTa1kEr 28.9.2009, 16:28
Цитата(capitan @  28.9.2009,  17:17 Найти цитируемый пост)
Ипатьев, Чтобы сдружить Gettext и Smarty как вариант использовать фильтр.

Только тут есть одна проблема, xgettext не знает этого синтаксиса, по этому нужно еще и парсер писать.

Автор: capitan 28.9.2009, 16:31
обычно я отвечаю так http://lmgtfy.com/?q=smarty+gettext

Ипатьев,  оказывается со Smarty идет block-плагин (block.t.php) для работы с gettext. В шаблоне текст под локализацию выглядит так:
Код

{t}Text to be localized{/t}


Автор: bars80080 28.9.2009, 17:29
Цитата(Ипатьев @  28.9.2009,  16:26 Найти цитируемый пост)
Передача языка в адресе - это аксиома.

почему? мне вот совершенно не очевидно. если знаете секрет, поделитесь пожалуйста

Автор: capitan 28.9.2009, 17:38
bars80080, У каждого своя позиция. Я например в сессии локализацию держу. И буду держать.

Автор: bars80080 28.9.2009, 17:49
нет, ну зачем так резко. если человек говорит что-то, то под его мнением есть какое-то основание. у Ипатьева вроде основания весомые, но я ещё стал адептом его секты и на веру воспринимать не намерян. вот и хочется узнать


во всяком случае я не знаю, где как не в куках или данных в БД (если уже зарегестрированный) хранить язык, выбранный пользователем, если он заходит на сайт. адрес входа ведь в большинстве случаев свободен от всяких переменных

Автор: solenko 28.9.2009, 17:58
Цитата(bars80080 @  28.9.2009,  16:29 Найти цитируемый пост)
мне вот совершенно не очевидно. если знаете секрет, поделитесь пожалуйста

ответ:
Цитата(Ипатьев @  28.9.2009,  15:26 Найти цитируемый пост)
ретьему на существование поисковиков глаза открывать. 



Цитата(bars80080 @  28.9.2009,  16:49 Найти цитируемый пост)
если он заходит на сайт. адрес входа ведь в большинстве случаев свободен от всяких переменных

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

Автор: StachelDraht 28.9.2009, 18:27
странно, что не вопрос то горячая тема)

может я опять неверно изъяснился и меня не поняли
вот готовый вариант того что я хочу но без использования smarty
Код

            preg_match_all("/\(word\:([0-9a-zA-Z_]*)\)/", $source, $array);
            
            $query = mysql_query("select
                `string`,
                `".$page['language']."` as `value`
            from `words`
                where `string` in ('".implode("', '", $array[1])."')");
            while($w = mysql_fetch_assoc($query)){
                $html = str_replace("{word:".$w['string']."}", $w['value'], $html);
            }

единственное в запросе может быть ошибка
Код

(word:dog)


Автор: Ипатьев 28.9.2009, 18:58
И сколько таких запросов на странице будет?

Автор: bars80080 28.9.2009, 19:01
Цитата(solenko @  28.9.2009,  17:58 Найти цитируемый пост)
Да, храниту в куках нужно, но дополнять все ссылки на сайте идеттификатором языка тоже нужно, чтобы поисковики, которые не будут вам передавать куки могли проиндексировать сайт на всех языках, а не только на дефолтном 

ну вот, по-русски, вменяемо и для детей

Автор: StachelDraht 28.9.2009, 19:01
ну скажем 20

плохо?

Автор: Ипатьев 28.9.2009, 19:18
всего 20 слов на странице? Что ж это за сайт такой, немногословный?

Автор: StachelDraht 28.9.2009, 19:43
не все же будет выводиться через так называемый словарь, только какие то определенные слова которые будут вписываться в сам шаблон, остальные вещи модулями, к примеру модуль текстовой части который тоже будет на всех языках

Автор: Ипатьев 28.9.2009, 21:25
ну, этот модуль ведь тоже будет выполнять запросы?

Автор: StachelDraht 29.9.2009, 10:53
Цитата(Ипатьев @ 28.9.2009,  21:25)
ну, этот модуль ведь тоже будет выполнять запросы?

будет

но я все таки хотел бы найти какое то решение

Автор: Ипатьев 29.9.2009, 13:42
Решение написано выше.
1. Переводить не отдельные слова, а фразы
2. Использовать готовое решение - gettext, а не изобретать свое.

Автор: StachelDraht 29.9.2009, 14:21
Ипатьев, понял, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)