Есть ли помощник просмотра Fluid для усечения URL-адреса? Если нет, то как мне его сделать?

В Fluid TYPO3 или в Fedext/vhs есть помощник, который может конвертировать

http://www.stackoverflow.com/questions/ask

в

www.stackoverflow.com

?

PS: это цель:

<f:format.raw><f:link.external uri="{item.link}">{item.just-display-the-domain}</f:link.external></f:format.raw>

РЕДАКТИРОВАТЬ (адаптируя вопрос к ответу, который я получил): если мне нужно создать помощник пользовательского представления, как мне действовать?


person Urs    schedule 10.12.2013    source источник
comment
Почему не пишешь на заказ?   -  person biesior    schedule 10.12.2013
comment
Если его нет, я попробую. Я просто вхожу в жидкость и пытаюсь найти свой путь вокруг. Должен ли это быть настраиваемый помощник представления, или есть другой способ вставить некоторый php в часть представления?   -  person Urs    schedule 10.12.2013
comment
На самом деле, теперь у нас есть две популярные ветки TYPO3 - 4.x и 6.x - правильно помечайте свои вопросы, чтобы они всегда были понятны.   -  person biesior    schedule 11.12.2013
comment
Разве тег для 6.1.x не должен быть typo3-6.1? Может быть, вы хотите создать правильный?   -  person Urs    schedule 11.12.2013


Ответы (3)


Я действительно сомневаюсь, что будет какая-либо разумная причина для добавления такого типа VH в ядро, де-факто, написание собственного VH похоже на кусок пирога (когда вы, наконец, осознаете, что это так), поэтому простые средства форматирования могут быть созданы разработчиками в их пользовательский инструмент расширяется всего за несколько минут.

Т.е. в TYPO3 4.x при условии, что у вас есть собственное расширение с ключом urs, все, что вам нужно сделать, это создать один правильный класс, содержащий метод render($params) и расширяющий класс Tx_Fluid_Core_ViewHelper_AbstractViewHelper:

/typo3conf/ext/urs/Classes/ViewHelpers/GetDomainViewHelper.php:

<?php
class Tx_Urs_ViewHelpers_GetDomainViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {

    /**
     * @param $link string Each `allowed` param need to have its line in PHPDoc
     * @return string
     */
    public function render($link) {
        $link = str_replace('http://', '', $link);
        $link = str_replace('https://', '', $link);
        $segments = explode('/', $link);
        return trim($segments[0]);
    }
}
?>

Затем в ваших шаблонах объявите его пространство имен и... все, вы можете его использовать:

{namespace urs=Tx_Urs_ViewHelpers}

<urs:getDomain link="http://stackoverflow.com/questions/20499453" />

Обратите особое внимание на регистр букв в таких вещах, как Tx_Urs_ViewHelpers... и т. д.

Дополнительные сведения см. в http://docs.typo3.org/typo3cms/ExtbaseFluidBook/8-Fluid/8-developing-a-custom-viewhelper.html

В TYPO3 вер. 6.х

Все работает примерно так же, главное изменение, конечно, новое пространство имен

/typo3conf/ext/urs/Classes/ViewHelpers/GetDomainViewHelper.php:

<?php
namespace TYPO3\Urs\ViewHelpers;

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

    /**
     * @param $link string Each `allowed` param need to have its line in PHPDoc
     * @return string
     */
    public function render($link) {
        $link = str_replace('http://', '', $link);
        $link = str_replace('https://', '', $link);
        $segments = explode('/', $link);
        return trim($segments[0]);
    }
}

В шаблонах:

{namespace urs=TYPO3\Urs\ViewHelpers}

<urs:getDomain link="http://stackoverflow.com/questions/20499453" />

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

<urs:getDomain link="{item.link}" />
person biesior    schedule 10.12.2013
comment
Ач просто забыл добавить - копирование существующих основных VH и изменение их в собственных реализациях часто позволяет сэкономить массу минут;) - person biesior; 11.12.2013
comment
Еще вопрос про пространство имен. В конструкторе расширений я выбрал пользовательское пространство имен MYFIRM\Extensionname — это тоже нормально, не так ли? Или вы бы придерживались пространства имен TYPO3? - person Urs; 11.12.2013
comment
Просто используйте {namespace urs=MYFIRM\Extensionname\ViewHelpers} (тоже в классе VH!) - person biesior; 11.12.2013
comment
Примечание: вы не должны использовать пространство имен TYPO3 в своих собственных расширениях. Очень жаль, что расширение extension_builder делает это по умолчанию, но это четко указано в руководстве по миграции пространства имен (ссылку на которое я потерял). - person Claus Due; 11.12.2013

Это немного громоздко и не очень эффективно, но должно работать и, конечно же, предотвратит необходимость в пользовательском классе ViewHelper:

With protocol:
{url -> v:iterator.explode(glue: '/') -> v:iterator.slice(length: 3) -> v:iterator.implode(glue: '/')}
Without protocol:
{url -> v:iterator.explode(glue: '/') -> v:iterator.slice(start: 2, length: 1) -> v:iterator.first()}

Где {url} может появиться откуда угодно, если он содержит полный http:// или другой префикс протокола. Строка выше, конечно, разбивает URL-адрес на части, разделенные /, затем отсекает первые три сегмента и снова объединяет те, которые используют /. Или он просто выбирает смещение 2 (которое будет полным доменом без протокола) и возвращает этот единственный элемент. Результатом должен быть URL-адрес домена ссылки, с протоколом или без него, без завершающей косой черты (которую вы можете добавлять или не добавлять самостоятельно после вырезания URL-адреса).

Привет, Клаус

person Claus Due    schedule 10.12.2013

Все ViewHelper расположены по адресу typo3/sysext/fluid/Classess/ViewHelper. Также в шапке каждого файла есть примеры. Все ViewHelper от Fedext можно просмотреть на веб-сайте.

person Merec    schedule 10.12.2013