ФорумПрограммированиеPHP для идиотовРасширения PHP → Новые теги к Twig

Новые теги к Twig

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 13, 2010, 2:33 д.п.

    Итак. Нужен тег генерации пагинатора.
    {% page 8 of 43  in 'index.php?page=%page%' %}

    Нужно, чтобы он сгенерировала
    Paginator::generate(8,43,'index.php?page=%page%');

    Сделал так:
    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());
    }

    }

    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")
    ;
    }
    }

    именно этот пример работает.
    Но если я сделаю к примеру так:
    {% page Current of Total  in 'index.php?page=%page%' %}

    То работать ясен хер не будет. Я не очень вкурил как происходит парсинг. Доку читал. И не смог сдеть так, как надо.
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz Авг. 13, 2010, 10:55 д.п., спустя 8 часов 21 минуту 55 секунд

    $iCurrent = $this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE)->getValue();

    тут parseExpr или как-то так должно быть
    Спустя 114 сек.
    $this->parser->getExpressionParser()->parseExpression()
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 13, 2010, 11:22 д.п., спустя 27 минут 12 секунд

    Абырвалг,
    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());
    }

    ОШибка:
    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

    Я вчера делал. А вот если сделать вот так, то:
    	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);
    дает
    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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Авг. 13, 2010, 1:28 п.п., спустя 2 часа 6 минут 12 секунд

    ну и гавно ваш твиг реальни
    Сапожник без сапог
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 14, 2010, 12:34 д.п., спустя 11 часов 6 минут 4 секунды

    ап блеять
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz Авг. 14, 2010, 12:37 д.п., спустя 2 минуты 12 секунд

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

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 14, 2010, 1:24 д.п., спустя 47 минут 17 секунд

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

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz Авг. 14, 2010, 9:51 д.п., спустя 8 часов 27 минут 41 секунду

  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 14, 2010, 10:13 д.п., спустя 21 минуту 56 секунд

    да
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 15, 2010, 1:31 д.п., спустя 15 часов 17 минут 51 секунду

    В опщем подумал я, подумал. И решил сделать через жопу.
    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());
    }

    }

    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

    Сообщения: 6 Репутация: N Группа: Кто попало

    Spritz Авг. 15, 2010, 1:36 д.п., спустя 4 минуты 54 секунды

    бугагашенька
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 15, 2010, 1:44 д.п., спустя 7 минут 29 секунд

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

    Сообщения: 113 Репутация: N Группа: Кто попало

    Spritz Авг. 18, 2010, 4:28 п.п., спустя 3 дня 14 часов 44 минуты


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


    Вот блин, тут ты с Фабьеном нормально общаешься, а вчера в аське его "тупым быдлокодером, который не умеет писать документацию" назвал. Ой, кажется я не туда пишу…
  • VaseninM

    Сообщения: 2416 Репутация: N Группа: Адекваты

    Spritz Авг. 18, 2010, 4:31 п.п., спустя 2 минуты 49 секунд

    shuranov, :D Не пизди
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz Авг. 18, 2010, 4:38 п.п., спустя 7 минут 13 секунд

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

Пожалуйста, авторизуйтесь, чтобы написать комментарий!