Как сменить кодировку переменной в Smarty

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 17 января 2013 в 16:36
Подскажите как сменить кодировку переменной в Smarty с UTF-8 на win 1251. Делаю компанент парсю xml он в формате UTF-8 передаю в шаблон и выводятся в кракозябрах. Если без шаблона делать то в самом компоненте меняю кодирвоку так:
  1. @iconv('UTF-8', 'CP1251', $peremennaya)
C Smarty этот фокус не проходит. версия icms 1.9. Уж больно хочется шаблоны для компонента подключить. Заранее спасибо
#2 17 января 2013 в 17:08
как вариант менять кодировку еще до передачи в смарти,
если менять в тпл-ке то, брать переменные из смарти, менять кодировку и выводить.
{php}
$items = $this->get_template_vars();
@iconv('UTF-8', 'CP1251', $items['title']);
{/php}
как то так…
#3 17 января 2013 в 17:17
До передачи не получается. У меня переменная содержит массив. Который нужно через foreach вывести в tpl. Вот не получаетсян е как в смарти вписать смену кодировки (
#4 17 января 2013 в 19:03
попробуй что то вроде
{$title:'UTF-8'} или {$title:'cp1251'}
не знаю на сколько это правильно, но как то преобразовывал переменную в шабе и выдавало ерунду, пока не указал в конце через: ту кодировку в которой была сама строка!)
#5 17 января 2013 в 20:10
а что мешает массив сразу перевести в 1251
  1.  
  2.  
  3. public function conv($array) {
  4. if(!is_array($array)) {return iconv('utf-8', 'cp1251', $array);}
  5. foreach ($array as $key => $value) {
  6. $array[$key] = iconv('utf-8', 'cp1251', $value);
  7. }
  8. return $array;
  9.  
  10. }
  11.  
а потом этот массив уже в шаблон
#6 17 января 2013 в 23:48
reload,

попробуй что то вроде {$title:'UTF-8'} или {$title:'cp1251'} не знаю на сколько это правильно, но как то преобразовывал переменную в шабе и выдавало ерунду, пока не указал в конце через: ту кодировку в которой была сама строка!)

Не получается так smarty ругается на синтаксис.

forlord, так тоже не получается, у меня масив это SimpleXMLElement чтоб потятней было кусочек кода дам с вставкой вашей функции как я делал.

  1. $xml = new SimpleXMLElement($data);
  2. $xml = $model->conv($xml);
#7 17 января 2013 в 23:57
Напишите свой модификатор для Smarty есть вполне вменяемая документация на офф.сайте и конвертируйте как вам нужно…
#8 18 января 2013 в 00:26
Я бы сделал, как предложил forlord, просто xeqtr сразу не сказал, что рассматривается объект $xml. Поэтому forlord дал метод для массива. А $xml нужно рассматривать по методике работы, как сложный массив.
xeqtr, тут нужно знать ещё структуру xml документа, чтобы обращаться напрямую к свойствам объекта $xml. Если применить метод, предложенный forlord-ом к объекту любой структуры, то его нужно немного модифицировать:
  1.  
  2. public function conv($array) {
  3. if(!is_array($array)) {return iconv('utf-8', 'cp1251', $array);}
  4. foreach ($array as $key => &$value) {
  5. if(is_array($value)){
  6. $value = $this->conv($value);
  7. }else{
  8. $value = iconv('utf-8', 'cp1251', $value);
  9. }
  10. return $array;
  11. }
  12.  
Не проверял, но вроде должно работать )
#9 18 января 2013 в 02:00
файлик создать новый и назвать: modifier.convert.php скопировать в него приведенное ниже содержимое
закинуть в /includes/smarty/libs/plugins/modifier.convert.php (кодировку самого файла меняйте согласно версии)
Использование в шаблоне:
  1. {$templ_var|convert:'UTF-8':'CP1251':false}
код файла
  1.  
  2. <?php
  3. /*
  4.  * Smarty plugin
  5.  * -------------------------------------------------------------
  6.  * Файл: modifier.convert.php
  7.  * Тип: modifier
  8.  * Имя: convert
  9.  * Назначение: Конвертация из одной кодировки в другую функцией iconv или mb_convert_encoding.
  10.  * Использование в шаблоне: {$templ_var|convert:'UTF-8':'CP1251':false}
  11.  * -------------------------------------------------------------
  12.  */
  13. function smarty_modifier_convert( $string, $from = 'UTF-8', $to = 'CP1251', $mb = false )
  14. {
  15. if (!$mb){
  16. $conv_string = iconv($from, $to, $string);
  17. } else {
  18. $conv_string = mb_convert_encoding($string, $to, $from);
  19. }
  20. return $conv_string;
  21. }
  22. ?>
  23.  
#10 18 января 2013 в 03:33

Напишите свой модификатор для Smarty

• Mike •
Круто, я и не догадывался что так можно)
Оказывается Smarty удобнее чем я думал)
Спасибо…
#11 18 января 2013 в 09:06
Спасибо всем кто ответил! Сделал по методу • Mike • вы лучшее сообщестов dance
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.