gpt4 book ai didi

symfony - Twig : separator in a "for" tag

转载 作者:行者123 更新时间:2023-12-04 22:47:09 30 4
gpt4 key购买 nike

请问有没有语法来分隔“for”标签中的某些元素?

例如我有一个用户列表,我想用“-”分隔符显示他们的用户名,所以预期的结果是:Mickael - Dave - Chris - ...
我找到了这个解决方案:

{% for user in entity.users %}
{{ user.name }}{% if not loop.last %} - {% endif %}
{% endfor %}

但这不是很优雅。 join filter 在循环中似乎不合适。

最佳答案

AFAIK,不,您不能使用 join 在没有变通方法的情况下过滤您的用例。这是因为你需要拉getName在对象属性之外。 join只需链接 Traversable 的每个元素具有给定 glue 的实例.
但是,如果您需要,有一些解决方法。
添加 __toString 方法
在您的 User实体,您可以添加 __toString默认获取用户名的方法。
但是,如果没有其他对象使用当前默认值 toString,您应该小心。因为它可能会引起冲突

namespace Acme\FooBundle\Entity;

class User
{
public function __toString()
{
return $this->getName();
}
}
然后你可以在你的 Twig 上使用 join筛选
{{ entity.users|join(' - ') }}
映射 Controller 中的用户名
在您的 Controller 中,就在向 View 发送参数之前,您可以为它们映射所有用户名以适合数组。
注意:我假设 getUsers PersistentCollection ,如果没有,请使用 array_map 反而
// Acme/FooBundle/Controller/MyController#fooAction

$users = $entity->getUsers();
$usernames = $users->map(function(User $user) {
return $user->getName();
});

return $this->render('AcmeFooBundle:My:foo.html.twig', array(
'entity' => $entity,
'usernames' => $usernames
);
然后在你的 Twig 上
{{ usernames|join(' - ') }}
创建 TWIG 过滤器
在您的应用程序中,您可以创建一个 Twig Extension .在本例中,我将创建一个名为 joinBy 的过滤器。其作用类似于 join通过指定连接元素的方法。
服务声明
简单直接,没有什么太苛刻,但像文档中的标准声明
服务.yml
acme_foo.tools_extension:
class: Acme\FooBundle\Twig\ToolsExtension
tags:
- { name: twig.extension }
扩展创建
@Acme\FooBundle\Twig\ToolsExtension
namespace Acme\FooBundle\Twig;

use Twig_Extension, Twig_Filter_Method;
use InvalidArgumentException, UnexpectedValueException;
use Traversable;

/**
* Tools extension provides commons function
*/
class ToolsExtension extends Twig_Extension
{
/**
* {@inheritDoc}
*/
public function getName()
{
return 'acme_foo_tools_extension';
}

/**
* {@inheritDoc}
*/
public function getFilters()
{
return array(
'joinBy' => new Twig_Filter_Method($this, 'joinBy')
);
}

/**
* Implode-like by specifying a value of a traversable object
*
* @param mixed $data Traversable data
* @param string $value Value or method to call
* @param string $join Join string
*
* @return string Joined data
*/
public function joinBy($data, $value, $join = null)
{
if (!is_array($data) && !($data instanceof Traversable)) {
throw new InvalidArgumentException(sprintf(
"Expected array or instance of Traversable for ToolsExtension::joinBy, got %s",
gettype($data)
));
}

$formatted = array();

foreach ($data as $row) {
$formatted[] = $this->getInput($row, $value);
}

return implode($formatted, $join);
}

/**
* Fetches the input of a given property
*
* @param mixed $row An array or an object
* @param string $find Property to find
* @return mixed Property's value
*
* @throws UnexpectedValueException When no matching with $find where found
*/
protected function getInput($row, $find)
{
if (is_array($row) && array_key_exists($find, $row)) {
return $row[$find];
}

if (is_object($row)) {
if (isset($row->$find)) {
return $row->$find;
}

if (method_exists($row, $find)) {
return $row->$find();
}

foreach (array('get%s', 'is%s') as $indic) {
$method = sprintf($indic, $find);

if (method_exists($row, $method)) {
return $row->$method();
}
}

if (method_exists($row, $method)) {
return $row->$method();
}
}

throw new UnexpectedValueException(sprintf(
"Could not find any method to resolve \"%s\" for %s",
$find,
is_array($row)
? 'Array'
: sprintf('Object(%s)', get_class($row))
));
}
}
用法
您现在可以通过调用在 Twig 中使用它
{{ entity.users|joinBy('name', ' - ') }}
# or
{{ entity.users|joinBy('getName', ' - ') }}

关于symfony - Twig : separator in a "for" tag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20239484/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com