плагин smarty, чтобы получить первое изображение из текста

У меня есть переменная Smarty, которая выводит массив, как это:

$article = Array(10)
id => "103"categoryid => "6"title => "¿Cuánto espacio necesito para mi siti..."text => "<img class="img-responsive center img..."

Мне нужно извлечь первый URL-адрес изображения из $ article.text и отобразить его в шаблоне. Потому что я хочу динамически создать тег свойства og: image:

<meta property="og:image" content="image.jpg" />

Я знаю, что на php этот код работает:

$texthtml = $article['text'];
preg_match('/<img.+src=[\'"](?P<src>.+)[\'"].*>/i', $texthtml, $image);
return $image['src'];

Но я не хочу использовать теги {php} от smarty, поскольку они устарели.

Поэтому я просто создаю плагин Smarty со следующим кодом:

* Smarty plugin
* -------------------------------------------------------------
* File:     function.articleimage.php
* Type:     function
* Name:     articleimage
* Purpose:  get the first image from an array
* -------------------------------------------------------------
*/
function smarty_function_articleimage($params)
{
$texthtml = $article['text'];
preg_match('/<img.+src=[\'"](?P<src>.+)[\'"].*>/i', $texthtml, $image);
return $image['src'];
}

И я вставляю его в шаблон следующим образом:

<meta property="og:image" content="{articleimage}" />

Но это не работает 🙁

Есть какие-нибудь подсказки?

1

Решение

Похоже, вам нужно передать $article в функцию.

в Документация по функциям шаблонов Smarty, это говорит о том, что:

Все атрибуты, передаваемые шаблонным функциям из шаблона, содержатся в $ params в виде ассоциативного массива.

На основе эта документация, похоже, что синтаксис для передачи переменной будет выглядеть так:

{articleimage article=$article}

Тогда в функции вы сможете получить его от $params как это:

function smarty_function_articleimage($params)
{
$text = $params['article']['text'];
preg_match('/<img.+src=[\'"](?P<src>.+)[\'"].*>/i', $text, $image);
return $image['src'];
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]