Я использую 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}
но я еще не понял, как это сделать правильно.
Я думаю, что вы хотели достичь результата, а не использовать объектный синтаксис в 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>
Других решений пока нет …