timber/twig 如何将 `posts` php-object 传递给 JavaScript?一些值丢失

timber/twig how to pass `posts` php-object to JavaScript? Some values are lost

当我尝试传递包含在 {{posts}} 中的信息时,我无法检索所有信息,至少不能检索 post.link 信息

  {% for post in posts %}
    <script>
      var t = JSON.parse('{{post|json_encode(constant('JSON_HEX_APOS'))|e('js')}}')
      t.link = '{{post.link}}'
      console.log(t)
    </script>
  {% endfor %}

如果不手动添加 link,它不会显示

为什么会发生这种情况,我该如何解决这个问题?

编辑:相关 https://github.com/timber/timber/issues/1434

您不应该对整个 post 对象进行编码。您应该单独编码所有需要的值。

你的 post 的 link 没有出现,因为 link 不是 属性,而是 中的 a method of the Timber\Post object. This might be a little bit confusing, because in Twig we use {{ post.link }}. It looks like it’s a property or maybe an array item. But we could also use {{ post.link() }}, which is the same as {{ post.link }}. You can read more about this in the Variables section ]模板设计师的 Twig.

所以我要做的是用你需要的数据构建一个新数组并用[=18=将它编码为PHP中的JSON ].

PHP

$posts_json = [];

foreach ( $posts as $post ) {
    $posts_json[] = wp_json_encode( [
        'title' => $post->title(),
        'link' => $post->link(),
    ] );
}

$context['posts_json'] = $posts_json;

通过只添加你需要的数据,你可以保持前端的输出很小。否则,您最终会得到大量您永远不会得到的数据,这只会不必要地增加页面大小。

然后在 Twig 中,你可以这样做:

{% for post in posts_json %}
    <script>
      var t = {{ post }}
      console.log(t)
    </script>
{% endfor %}