symfony twig variables
Obtenga el PAPEL de un usuario que no ha iniciado sesiĆ³n TWIG Symfony2 (4)
Debería crear una macro de ramita o una función ramita.
Crear una macro es muy simple, usando su código:
{% macro admin_status(from_user) %}
{% set from_user_is_admin = false %}
{% for role in from_user.getRoles() %}
{% if role == ''ROLE_ADMIN'' %}{% set from_user_admin = true %}{% endif %}
{% if role == ''ROLE_SUPER_ADMIN'' %}{% set from_user_admin = true %}{% endif %}
{% endfor %}
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %}
{% endmacro %}
Luego puede usarlo en el mismo archivo que {% _self.admin_status(user) %}
. También puede moverlo a un archivo separado y usar la etiqueta de importación de twig para obtener acceso a él.
Crear una función de rama es una mejor opción, para más detalles, ver la extensión de rama . Todo se reduce a la creación de una función regular, que se puede llamar desde ramita, por lo que un código como este se vuelve posible:
{% if user_is_admin(user) %}
También deberá leer la habilitación de extensiones twig personalizadas .
Me gustaría saber cómo puedo saber si se concede un usuario cuando no es el usuario actual en ramita.
Yo uso este código para el usuario actual:
{% if is_granted(''ROLE_USER'') %}
<a href="...">Delete</a>
{% endif %}
Pero me gustaría poder hacer lo mismo con los usuarios que no están conectados en este momento. Gracias.
Editar: De hecho, creo que no hay una forma directa con twig para probar el rol de un usuario que no está autenticado. Así que lo hice directamente en la plantilla twig, pruebo si un usuario es admin o no, luego establezco var. (en mi pregunta estaba buscando cómo hacer en una lista de usuarios).
{% set from_user_is_admin = false %}
{% for role in from_user.getRoles() %}
{% if role == ''ROLE_ADMIN'' %}{% set from_user_admin = true %}{% endif %}
{% if role == ''ROLE_SUPER_ADMIN'' %}{% set from_user_admin = true %}{% endif %}
{% endfor %}
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %}
Puede usar una declaración similar a la anterior con "no":
{% if not is_granted(''ROLE_USER'') %}
<a href="...">Delete</a>
{% endif %}
o use la declaración else:
{% if is_granted(''ROLE_USER'') %}
<a href="...">Delete</a>
{% else %}
{# something else for guest user, not logged in #}
{% endif %}
Creo que sería mucho más fácil si implementara una función isGranted en la entidad Usuario:
Class User implements UserInterface {
...
public function isGranted($role)
{
return in_array($role, $this->getRoles());
}
}
Ahora puede verificar fácilmente las funciones otorgadas en cada capa de su aplicación. En PHP:
$user->isGranted("USER_ADMIN")
O en Twig:
user.granted("USER_ADMIN")
Si necesita verificar un rol para el usuario actual, puede hacerlo en Twig:
app.user.granted("USER_ADMIN")
Nota: la variable "aplicación" está definida globalmente.
Nota 2: este código puede arrojar una excepción si la usa fuera del área protegida de su aplicación, ya que app.user sería NULL.
Lo hice de esta manera, tengo este fragmento en el archivo twig global, en mi caso layout.html.twig
{% set is_admin = false %}
{% if app.security.token.user.roles is iterable %}
{% for role in app.security.token.user.roles %}
{% if role == ''ROLE_ADMIN'' or role == ''ROLE_SUPER_ADMIN'' %}
{% set is_admin = true %}
{% endif %}
{% endfor %}
{% endif %}
entonces puedo usar en cualquier lugar
{% if is_admin %}....{% endif %}