簡體   English   中英

Twig 迭代 object 屬性

[英]Twig iterate over object properties

我在 Twig 文檔中讀到,可以通過以下方式迭代關聯數組:

{% for key, value in array %}  
 {{key}}  
 {{value}}  
{% endfor %}  

我想知道這是否也適用於 stdClass 類型的對象。

我本來希望 Twig 以屬性名稱作為鍵來迭代 object 的屬性值。 相反,for循環中包含的指令塊根本不執行。

您可以先將對象強制轉換為數組。 您可以構建自己的過濾器,將對象轉換為數組。 有關過濾器的更多信息,請訪問: http//twig.sensiolabs.org/doc/advanced.html#filters

它可能看起來像那樣:

{% for key, value in my_object|cast_to_array %}

加載TWIG后,添加此過濾器:

$twig->addFilter( new Twig_SimpleFilter('cast_to_array', function ($stdClassObject) {
    $response = array();
    foreach ($stdClassObject as $key => $value) {
        $response[] = array($key, $value);
    }
    return $response;
}));

根據塔德克的建議,它被命名為cast_to_array :)我確定它不適用於任何類型的stdClass對象 ,但它確實解決了我打印PHP 關聯數組的問題 :)使用如下:

{% for key, value in my_object|cast_to_array %}
    <td>{{ value.1 }}</td>
{% endfor %}

番外篇

由於我進入了這個SO頁面很多,我認為顯示我在哪里使用Twig 迭代對象屬性是相關的 ,所以它對其他有相同問題的人有用:我試圖從.json打印一個表源代碼,但是PHP的json_decode將任何“key”:“value”轉換為PHP關聯數組,Twig默認不打印。 因此,這個過濾器可以切割並提供一個由Twig使用的常規數組。

source.json

{
    "user": {
        "family": {
            "table": [{
                "First_Name": "John",
                "Last_Name": "Foo",
                "Age": 25,
                "Role": "Brother"
            }, {
                "First_Name": "Mary",
                "Last_Name": "Bar",
                "Age": 14,
                "Role": "Sister"
            }, {
                "First_Name": "Joe",
                "Last_Name": "Baz",
                "Age": 33,
                "Role": "Uncle"
            }]
        }
    }
}

枝條

<table>
  <thead>
    <tr> {# get table headers from the table row #}
      {% for row in user.family.table.0|cast_to_array %}
        <th>{{ row.0 | replace({'_': ' '}) }}</th>
      {% endfor %}
    </tr>
  </thead>
  <tbody>
    {% for row in user.family.table %}
      <tr>
      {% for key, value in row|cast_to_array %}
        <td>{{ value.1 }}</td>
      {% endfor %}
      </tr>
    {% endfor %}
  </tbody>
</table>

在這里完成Tadeck的答案是:

如果您還沒有創建或設置Twig擴展(過濾器),則需要先按照此說明進行操作http://symfony.com/doc/2.7/cookbook/templating/twig_extension.html

1)添加到你的AppBundle / Twig / AppExtension.php('cast_to_array')

public function getFilters()
{
    return array(
        new \Twig_SimpleFilter('md2html', array($this, 'markdownToHtml'), array('is_safe' => array('html'))),
        new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
        new \Twig_SimpleFilter('cast_to_array', array($this, 'objectFilter')),
    );
}

2)添加到AppBundle / Twig / AppExtension.php

public function objectFilter($stdClassObject) {
    // Just typecast it to an array
    $response = (array)$stdClassObject;

    return $response;
}

3)在你的example.html.twig循環中使用twig和過濾器。

{% for key, value in row|cast_to_array %}
       <td id="col" class="hidden-xs">{{ value }}</td>
{% endfor %}

完成,我希望它有所幫助。 來自塔德克的指針。

如果這有助於其他人。 如果實現PHP的Iterator接口,您可以讓Twig迭代對象的屬性。

在我的例子中,我有一個通用對象,在私有數組中存儲鍵值對時,使用魔術方法__get(),__ set(),__ isset()和__unset()。 這在Twig中工作正常,直到您想要使用類似的東西迭代對象

<ul>
{% for prop, value in object %}
    <li>{{prop|replace({'_': ' '})|title}}</li>
{% endfor %}
</ul>

為了使它工作,我必須實現Iterator接口。 然后上面的代碼工作得很好。

現在因為魔法__get(),屬性名稱也不區分大小寫,因此每個屬性也都有效。

<ul>
{% for object in arrayOfObjects %}
    <li>{{ object.property }}</li>
    <li>{{ object.Property }}</li>
    <li>{{ object.PROPERTY }}</li>
{% endfor %}
</ul>

我知道這是舊的,但不會

$assoc_array = json_decode(json_encode($stdClassObject), TRUE);

工作一樣好嗎?

  {% for key, item in content.field_invoice_no if key|first != '#' %} <tr>
      <td>{{ item }}</td>
       <td> {{ content.field_invoice_date[key]  }}     </td>
       <td> {{ content.field_invoice_price[key]   }}       </td>
       </tr>
    {% endfor %}

在鍵值上迭代 object

我終於想出了一個普通的 Twig 解決方案。 我利用 reduce 過濾器將 object 轉換為數組。

假設我們從后端獲得地址 object 並希望將其轉換為關聯數組以便單獨渲染每一行。

{% set address = { firstName: 'Stack', lastName: 'Overflow', address: 'here', zipCode: '1234' } %}

我們減少鍵並將它們添加到一個空數組中

{% set addressLines = address|keys|reduce((carry, key) => carry|merge({ (key): attribute(address, key) }), []) %}

這導致:

[ 'firstName' => 'Stack', 'lastName' => 'Overflow', 'address'=> 'here', 'zipCode' => '1234' ]

現在我們可以在 for 循環中渲染它

{% set allowedKeys = ['firstName', 'lastName', 'address'] %}
{% for key, line in addressLines|filter((v, k) => k in allowedKeys) %}
    {{ line }}<br/>
{% endfor %}

將 function 數組添加到 twining 並調用模板數組(值)

$loader = new \Twig\Loader\FilesystemLoader('templates/'.$path);
$twig = new \Twig\Environment($loader,['debug' => true]);
$function_2 = new \Twig\TwigFunction('array', function ($value) {
    return (array)$value;
});
$twig->addFunction($function_1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM