Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 24 Май, 2012, 10:31:43

Страниц: [1] 2
Печать
Автор Тема: Новые теги к Twig  (Прочитано 1039 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SpartakuS    ↓ 
13 Август, 2010, 02:33:26
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

Итак. Нужен тег генерации пагинатора.
Text
{% page 8 of 43  in 'index.php?page=%page%' %}
Нужно, чтобы он сгенерировала
PHP
Paginator::generate(8,43,'index.php?page=%page%');
Сделал так:
PHP
class Twig_Paginator_TokenParser extends Twig_TokenParser {
   
    public function getTag() {
        return 'page';
    }
 
    public function parse(Twig_Token $token) {
        $lineno = $token->getLine();
        $iCurrent = $this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE)->getValue();
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'of');
        $iTotal = $this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE)->getValue();
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'in');
        $sLink$this->parser->getStream()->expect(Twig_Token::STRING_TYPE)->getValue();
        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
 
        return new Twig_Paginator_Node($iCurrent, $iTotal, $sLink, $lineno, $this->getTag());
    }
 
}
PHP
class Twig_Paginator_Node extends Twig_Node {
  protected $iCurrent;
  protected $iTotal;
  protected $sLink;
 
  public function __construct($iCurrent, $iTotal, $sLink, $lineno, $sTag)
  {
    parent::__construct();
 
    $this->iCurrent = $iCurrent;
    $this->iTotal = $iTotal;
    $this->sLink = $sLink;
  }
 
  public function compile($compiler)
  {
    $compiler
      ->addDebugInfo($this)
      ->write('Paginator::generate("')
      ->raw($this->iCurrent)
      ->raw('", "')
      ->raw($this->iTotal)
      ->raw('", "')
      ->raw($this->sLink)
      ->raw('")')
      ->raw(";\n")
    ;
  }
}
именно этот пример работает.
Но если я сделаю к примеру так:
Text
{% page Current of Total  in 'index.php?page=%page%' %}
То работать ясен хер не будет. Я не очень вкурил как происходит парсинг. Доку читал. И не смог сдеть так, как надо.
Записан


цска ебаное гавно.
Абырвалг    ↓ 
13 Август, 2010, 10:55:21 , спустя 8 часов 21 минуту 55 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6094
Сила слова: 1.31

PHP
$iCurrent = $this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE)->getValue();
тут parseExpr или как-то так должно быть
Спустя 1 минуту 54 секунды добавил
PHP
$this->parser->getExpressionParser()->parseExpression()
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
SpartakuS    ↓ 
13 Август, 2010, 11:22:33 , спустя 27 минут 12 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

Абырвалг,
PHP
public function parse(Twig_Token $token) {
        $lineno = $token->getLine();
        $iCurrent = $this->parser->getExpressionParser()->parseExpression();
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'of');
        $iTotal = $this->parser->getExpressionParser()->parseExpression();
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'in');
        $sLink$this->parser->getExpressionParser()->parseExpression();
        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
        dump($iCurrent);
        return new Twig_Paginator_Node($iCurrent, $iTotal, $sLink, $lineno, $this->getTag());
    }
ОШибка:
Text
Fatal error: Uncaught exception 'Twig_SyntaxError' with message 'Unexpected token "Twig_Token::BLOCK_END_TYPE" of value "" ("Twig_Token::NAME_TYPE" expected with value "in") in body.tpl at line 4' in /home/socengine.ru/www/core/engines/twig/data/TokenStream.php:127
Я вчера делал. А вот если сделать вот так, то:
PHP
    public function parse(Twig_Token $token) {
        $lineno = $token->getLine();
        $iCurrent = $this->parser->getExpressionParser()->parseExpression();
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'of');
        $iTotal = $this->parser->getExpressionParser()->parseExpression();
        //$this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'in');
        //$sLink =  $this->parser->getExpressionParser()->parseExpression();
        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
        dump($iTotal);
        return new Twig_Paginator_Node($iCurrent, $iTotal, $sLink, $lineno, $this->getTag());
    }
var_dump ($iTotal);
дает
Text
Twig_Node_Expression_Compare Object
(
    [nodes:protected] => Array
        (
            [expr] => Twig_Node_Expression_Name Object
                (
                    [nodes:protected] => Array
                        (
                        )
 
                    [attributes:protected] => Array
                        (
                            [name] => Total
                        )
 
                    [lineno:protected] => 4
                    [tag:protected] =>
                )
 
            [ops] => Twig_Node Object
                (
                    [nodes:protected] => Array
                        (
                            [0] => Twig_Node_Expression_Constant Object
                                (
                                    [nodes:protected] => Array
                                        (
                                        )
 
                                    [attributes:protected] => Array
                                        (
                                            [value] => in
                                        )
 
                                    [lineno:protected] => 4
                                    [tag:protected] =>
                                )
 
                            [1] => Twig_Node_Expression_Constant Object
                                (
                                    [nodes:protected] => Array
                                        (
                                        )
 
                                    [attributes:protected] => Array
                                        (
                                            [value] => /%page%
                                        )
 
                                    [lineno:protected] => 4
                                    [tag:protected] =>
                                )
 
                        )
 
                    [attributes:protected] => Array
                        (
                        )
 
                    [lineno:protected] => 0
                    [tag:protected] =>
                )
 
        )
 
    [attributes:protected] => Array
        (
        )
 
    [lineno:protected] => 4
    [tag:protected] =>
)
 

с утра проснулся. Может на свежую голову че вкурю.
Записан


цска ебаное гавно.
phpdude    ↓ 
13 Август, 2010, 01:28:45 , спустя 2 часа 6 минут 12 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20789
Сила слова: 1.65

ну и гавно ваш твиг реальни
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
SpartakuS    ↓ 
14 Август, 2010, 12:34:49 , спустя 11 часов 6 минут 4 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

ап блеять
Записан


цска ебаное гавно.
Абырвалг    ↓ 
14 Август, 2010, 12:37:01 , спустя 2 минуты 12 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6094
Сила слова: 1.31

блин, ну посмотри как уже готовые теги сделаны. Я ща не могу сесть и писать теги тебе, я в дорогу собираюсь уже :P
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
SpartakuS    ↓ 
14 Август, 2010, 01:24:18 , спустя 47 минут 17 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

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


цска ебаное гавно.
Абырвалг    ↓ 
14 Август, 2010, 09:51:59 , спустя 8 часов 27 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6094
Сила слова: 1.31

http://www.twig-project.org/book/04-Extending-Twig читал?
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
SpartakuS    ↓ 
14 Август, 2010, 10:13:55 , спустя 21 минуту 56 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

да
Записан


цска ебаное гавно.
SpartakuS    ↓ 
15 Август, 2010, 01:31:46 , спустя 15 часов 17 минут 51 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

В опщем подумал я, подумал. И решил сделать через жопу.
PHP
class Twig_Paginator_TokenParser extends Twig_TokenParser {
   
    public function getTag() {
        return 'page';
    }
 
    public function parse(Twig_Token $token) {
        $lineno = $token->getLine();
        $oStream = $this->parser->getStream();
        if ($oStream->test(Twig_Token::NUMBER_TYPE)) {
            $iCurrent['num'] = $oStream->expect(Twig_Token::NUMBER_TYPE)->getValue();
        } else {
            $iCurrent['name'] = $oStream->expect(Twig_Token::NAME_TYPE)->getValue();
        }
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'of');
        if ($oStream->test(Twig_Token::NUMBER_TYPE)) {
            $iTotal['num'] = $oStream->expect(Twig_Token::NUMBER_TYPE)->getValue();
        } else {
            $iTotal['name'] = $oStream->expect(Twig_Token::NAME_TYPE)->getValue();
        }
        $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, 'in');
        if ($oStream->test(Twig_Token::STRING_TYPE)) {
            $sLink['str'] = $oStream->expect(Twig_Token::STRING_TYPE)->getValue();
        } else {
            $sLink['name'] = $oStream->expect(Twig_Token::NAME_TYPE)->getValue();
        }
        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
 
        return new Twig_Paginator_Node($iCurrent, $iTotal, $sLink, $lineno, $this->getTag());
    }
 
}
PHP
class Twig_Paginator_Node extends Twig_Node {
  protected $iCurrent;
  protected $iTotal;
  protected $sLink;
 
  public function __construct($iCurrent, $iTotal, $sLink, $lineno, $sTag)
  {
    parent::__construct();
 
    $this->iCurrent = $iCurrent;
    $this->iTotal = $iTotal;
    $this->sLink = $sLink;
  }
 
  public function compile($compiler)
  {
    $sCode = 'Paginator::generate(';
    $sCode .= (isset($this->iCurrent['num'])) ? '"' . $this->iCurrent['num'] . '"' : '$context["' . $this->iCurrent['name'] . '"]';
    $sCode .= ', ';
    $sCode .= (isset($this->iTotal['num'])) ? '"' . $this->iTotal['num'] . '"' : '$context["' . $this->iTotal['name'] . '"]';
    $sCode .= ', ';
    $sCode .= (isset($this->sLink['str'])) ? '"' . $this->sLink['str'] . '"' : '$context["' . $this->sLink['name'] . '"]';
    $sCode .= ");\n";
    $compiler
      ->addDebugInfo($this)
      ->write($sCode)
    ;
  }
}
Записан


цска ебаное гавно.
fabpot    ↓ 
15 Август, 2010, 01:36:40 , спустя 4 минуты 54 секунды
НЕ ХУЕТА! ХУЕТА!


Карма: 2
Сообщений: 6
Сила слова: 33.33

бугагашенька
Записан
SpartakuS    ↓ 
15 Август, 2010, 01:44:09 , спустя 7 минут 29 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

fabpot, будь мужиком, блеять. Опиши в документации, как делать не через жопу такие теги.
Спустя 1 минуту добавил
Записан


цска ебаное гавно.
shuranov    ↓ 
18 Август, 2010, 04:28:24 , спустя 3 дня 14 часов 44 минуты 15 секунд
НЕ ХУЕТА! ХУЕТА!


Карма: 7
Сообщений: 112
Сила слова: 6.25


fabpot, будь мужиком, блеять. Опиши в документации, как делать не через жопу такие теги.
Спустя 1 минуту добавил

Вот блин, тут ты с Фабьеном нормально общаешься, а вчера в аське его "тупым быдлокодером, который не умеет писать документацию" назвал. Ой, кажется я не туда пишу...
Записан
SpartakuS    ↓ 
18 Август, 2010, 04:31:13 , спустя 2 минуты 49 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

shuranov, :D Не пизди
Записан


цска ебаное гавно.
Sinkler    ↓ 
18 Август, 2010, 04:38:26 , спустя 7 минут 13 секунд
НЕ ХУЕТА! ХУЕТА!

Похуй, пляшем!
Группа: Джедаи

Карма: 73
Сообщений: 6804
Сила слова: 1.07

бля, я ж вроде отписывался от всех тем с фабьеном
Записан

Страниц: [1] 2
Печать
 

Перейти в:  

Этот топик скрыли: Nyaah