在Smarty中爆炸对象变量

时间:2014-09-16 19:52:10

标签: php smarty explode smarty3

我正在使用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}

但我还没弄清楚如何正确地做到这一点。

1 个答案:

答案 0 :(得分:1)

我认为你想要实现结果而不是在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>