Как связать слово с хэш-тегом в тексте (например, это #случайное слово) с помощью TWIG?


Вот как выглядит мой HTML-код:

<div class="post-content">
    <p>
       {{post.content}}
    </p>
</div>

Есть ли какой-либо фильтр, который я могу использовать, чтобы связать любое слово с хэш-тегом в содержимом публикации с помощью TWIG? Или я должен использовать JavaScript для этой работы?

Author: lokiloq, 2013-12-26

2 answers

Вы можете использовать тот же метод на основе регулярных выражений, который использует этот плагин jQuery linkify, только реализованный на PHP вместо JavaScript.

Возможно, вам придется немного подправить это, но это должно выглядеть примерно так (шаблон для плагина TWIG на основе http://symfony.com/doc/current/cookbook/templating/twig_extension.html):

class LinkifyExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            'linkify' => new \Twig_Filter_Method($this, 'linkifyFilter', array('pre_escape' => 'html', 'is_safe' => array('html'))),
        );
    }

    public function linkifyFilter($text)
    {
        $pattern = "/\B#(\w+)/";
        $replacement = "<a href=\"HASHTAG_BASE_URL/$1\">#$1</a>";
        return preg_replace($pattern, $replacement, $text);
    }

    public function getName()
    {
        return 'linkify_extension';
    }
}

После того, как вы зарегистрировали свое расширение, вы можете использовать его следующим образом:

{{post.content | linkify}}
 4
Author: Moshe Katz, 2013-12-26 19:48:50

Вы можете использовать расширение ветки с помощью метода, который свяжет ваше слово с хэш-тегом

Сначала создайте расширение:

class PostExtension extends \Twig_Extension {

    protected $loader;
    protected $controller;

    public function __construct(FilesystemLoader $loader)
    {
        $this->loader = $loader;
    }

    public function setController($controller)
    {
        $this->controller = $controller;
    }

    /**
     * {@inheritdoc}
     */
    public function getFunctions()
    {
        return array(
            'hashTag' => new \Twig_Function_Method($this, 'hashtag', array('is_safe' => array('html'))),);
    }

    public function($word) {
        return // linkify word here
    }
}

Второй:

Добавьте свое расширение в качестве услуги

  <service id="twig.extension.blogExtension" class="link\to\BlogExtension" public="false">
        <tag name="twig.extension" />
        <argument type="service" id="twig.loader" />
    </service>

И, наконец:

Используйте его в качестве фильтра:

{{ word|hasgtag() }}

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

Наслаждайтесь!!

 1
Author: CodeIsLife, 2013-12-26 01:53:07