Разбить объектную переменную в Smarty

Я использую HybridAuth библиотека для отображения списка контактов пользователя из Gmail. Член объекта является displayName, и я использую его так:

{foreach from=$contacts key=k item=contact}
<span class="name">{$contact->displayName}</span>
{/foreach}

Я хотел бы использовать это так:

{foreach from=$contacts key=k item=contact}
<span class="first-name">{$contact-firstName}</span>
<span class="last-name">{$contact->lastName}</span>
{/foreach}

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

{$contact->strtok(displayName," ")}

который возвращается

Fatal error :  Call to undefined method Hybrid_User_Contact::strtok()

Я сейчас пытаюсь сделать что-то вроде этого ..

{assign var=$contact value=" "|explode:displayName}

но я еще не понял, как это сделать правильно.

0

Решение

Я думаю, что вы хотели достичь результата, а не использовать объектный синтаксис в Smarty (и в случае, если вы хотите использовать объектный синтаксис, вам лучше выполнять присваивание в PHP, а не в Smarty).

Так что вам нужно сделать это следующим образом:

{foreach from=$contacts key=k item=contact}
{assign var="names" value=" "|explode:$contact->displayName}
<span class="first-name">{$names[0]}</span>
<span class="last-name">{$names[1]}</span>
{/foreach}

Когда в файле PHP у меня есть:

$contacts = array();

$contact = new stdClass();
$contact->displayName = 'Name Surname';
$contacts[] = $contact;
$contact = new stdClass();
$contact->displayName = 'Name2 Surname2';
$contacts[] = $contact;
$smarty->assign('contacts',$contacts);

Источник HTML будет таким, как вы ожидаете:

<span class="first-name">Name</span>
<span class="last-name">Surname</span>
<span class="first-name">Name2</span>
<span class="last-name">Surname2</span>

РЕДАКТИРОВАТЬ

В случае, если некоторые записи не содержат имя и фамилию (как вы упомянули в комментарии), вы можете сделать это следующим образом:

в файле PHP:

$ contacts = array ();

$contact = new stdClass();
$contact->displayName = 'Name Surname';
$contacts[] = $contact;
$contact = new stdClass();
$contact->displayName = 'Name2Surname2';
$contacts[] = $contact;
$smarty->assign('contacts',$contacts);

В файле Smarty:

{foreach from=$contacts key=k item=contact}
{assign var="names" value=" "|explode:$contact->displayName}

{if $names|@count eq 2}
<span class="first-name">{$names[0]}</span>
<span class="last-name">{$names[1]}</span>
{else}
<span class="name-first-last">{$contact->displayName}</span>
{/if}
{/foreach}

Выход для этого будет:

<span class="first-name">Name</span>
<span class="last-name">Surname</span>
<span class="name-first-last">Name2Surname2</span>
1

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

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

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