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
,它不会显示
为什么会发生这种情况,我该如何解决这个问题?
您不应该对整个 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 %}
当我尝试传递包含在 {{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
,它不会显示
为什么会发生这种情况,我该如何解决这个问题?
您不应该对整个 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 %}