Жидкий шаблон typo3: cObject в слишком большом количестве условий в viewhelper

Мне нужно поместить выбор часов в форму, поэтому я создал собственный viewhelper, который округляет минуты только до кратных 5. в setup.ts я записываю время;

lib.time = TEXT
lib.time {
    data = date:H:i
}

в шаблоне я вызываю cObject;

<nr:time value="{f:cObject(typoscriptObjectPath: 'lib.time')}" />

Я попробовал его также встроенным, который работает (завернутый в случайный ViewHelper);

<f:link.action action="form">{nr:time(value: '{f:cObject(typoscriptObjectPath: \'lib.time\')}')}</f:link.action>

теперь я добираюсь туда, где мне это нужно, в котором есть условие, и здесь я не нашел синтаксиса, который работал...;

<f:form.textfield property="date" class="date"
        value="{f:if(condition: ticket.time, then: '{ticket.time}', else: '{f:cObject(typoscriptObjectPath: \'lib.time\')}')}" />

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

PS: это TimeViewHelper.php:

class TimeViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper  {

     /**
     * @param string $value
     * @return
     */

    public function render($value) {
        $time = strtotime($value);
        $m = date('i', $time);
        $f = 5*60; // 5 minutes
        $r = $time % $f;

        $t = $time + ($f-$r);
        $new_time = ($m == 0 || $m % 5 === 0) ? $value : date('H:i', $t);
        return $new_time;
    }
}

person webMan    schedule 06.09.2016    source источник
comment
Пожалуйста, избегайте '{ticket.time}' (обертывания средств доступа к объектам с помощью TextNodes). Для получения дополнительной информации см. vimeo.com/167666466.   -  person Claus Due    schedule 07.09.2016


Ответы (2)


Вы всегда можете использовать условие f:if с синтаксисом html

<f:if condition="{ticket.time}">
  <f:then>
    <f:form.textfield property="date" class="date" value="{ticket.time}" />
  </f:then>
  <f:else>
    <f:form.textfield property="date" class="date" value="{f:cObject(typoscriptObjectPath: 'lib.time')}" />
  </f:else>
</f:if>
person Dimitri L.    schedule 06.09.2016
comment
простота убила кошку...конечно, после нескольких часов возни я больше не увидел очевидного, спасибо!! - person webMan; 06.09.2016
comment
если ответ помог, отдайте должное этому человеку и проголосуйте за него;) - person rob-ot; 06.09.2016

Вы не говорите, какую версию TYPO3 и, следовательно, Fluid вы используете. Этот ответ относится к TYPO3v8 и Fluid Standalone:

<f:form.textfield property="date" class="date"
    value="{ticket.time -> f:or(alternative: '{f:cObject(typoScriptObjectPath: \'lib.time\')}" />

Еще проще выразить, если вы сделаете себе одолжение и вместо этого назначите lib.time в качестве переменной шаблона:

<f:form.textfield property="date" class="date" value="{ticket.time ? ticket.time : variableWithDefaultTime}" />
person Claus Due    schedule 07.09.2016
comment
Я работаю с typo3 7.6.10 ... Я пытался передать его напрямую, но нашел только способ со статическими значениями ... это должны быть новые параметры в 8 ... - person webMan; 08.09.2016
comment
Я снова попытался встроить код после ваших видео ... спасибо за время, которое вы потратили на объяснение другим ... но я не смог заставить его работать ... '{ticket.date}' to ticket.date работает - person webMan; 08.09.2016