Има ли Fluid viewhelper за съкращаване на URL? Ако не, как да направя такъв?

Във Fluid на TYPO3 или във Fedext/vhs има ли viewhelper, който може да конвертира

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

в

www.stackoverflow.com

?

ПС: това е целта:

<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]);
    }
}
?>

След това във вашия templae декларирайте неговото пространство от имена и... това е всичко, можете да го използвате:

{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 ver. 6.x

Нещата работят доста подобно, основната промяна разбира се е новото пространство на имената

/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
Ach просто забравих да добавя - копирането на съществуващи основни VH и модифицирането им в собствени реализации често позволява спестяване на тонове минути;) - person biesior; 11.12.2013
comment
Още един въпрос относно пространството на имената. В инструмента за създаване на разширения избрах персонализирано пространство от имена MYFIRM\Extensionname - това също е добре, нали? Или бихте се придържали към TYPO3 Namespace? - 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