i've a problem with symfony project, in my Controller Company when I use edit function to modif some DATA with embedded form, symfony keep only 1 customer (first one) and what I was change and remove all other DATA.
I not understand why symfony do that.
Thank U for Ure help
Best regards
Try to use edit function in symfony with embedded form
You're using the wrong function to render the customer (and network and process) subforms, use form_row(customer) instead of form(customer):
{% for customer in form.customers %}
<h6 class="mt-5">Client
{{_key+1}}</h6>
{{ form_row(customer) }}{% endfor %}
I have a problem with flash messages in Symfony 4 and translation.
Translation of simple flash messages is working fine:
$this->addFlash('success', 'flashmessage.project_deleted');
But now I want to add some parameters to the flash messages and I have no idea how to handle it. I tried a lot, but nothing is working. I want to show in the flash messages the title of projects after f.e. removing. For example:
$this->addFlash('success', sprintf('flashmessage.project_deleted: %s', $project->getTitle()));
But the translation is not recognized, because the parameter is replaces before translation happens (I think so). And it should also be possible to have parameters in the middle of a string and not only at the end or at the beginning and ideally more than one parameter.
I'm using this in my Controller which extends AbstractController.
Does anybody has a solution for this?
Usually you would pass in the parameters to the translation, so your code snippet should probably look your first example and then in twig you would have something like this:
{% for message in app.flashes('success') %}
<div class="alert alert-success">
{{ message|trans({ 'title': project.title }) }}
</div>
{% endfor %}
The translation then should contain the parameter that is replaced:
flashmessage:
project_created: 'The project "%title%" was created successfully.'
project_deleted: 'You successfully deleted the project "%title%".'
...
Obviously the downside is that you have to dynamically pass in the variables which does not make much sense for flash messages, as not all of them will require these parameters. Also, as you already mentioned, when you deleted the project you will probably not have it available anymore in the template.
Instead I would recommend translating the message before passing it into the flash bag:
$this->addFlash(
'success',
$this->translator->translate(
'flashmessage.project_deleted',
[
'title' => $project->getTitle(),
]
)
);
This will require that you pass in the translator to your controller. You could either create your own base controller similar to Symfony's AbstractController for this and create something like a $this->trans()-method to make it easier to translate things inside your controller. Also, you will still have to make sure that $project->getTitle() will still return a value, so you probably want to call this before you actually delete the entry or have the data in memory.
When you do it this way, then you should not translate the flash messages in the template itself because they are already translated. This will still work because when Symfony tries to translate the already translated message, e.g. You successfully deleted the project "foo". then it will not find a translation and just print the original text instead, but you will get warnings in your logs about missing translations. The solution is to remove the |trans in your template (see first snippet).
A possible solution is to add another flash with serialized parameters.
Then, when you display your flash message, check if that extra flash exists and, if so, deserialize it and use it as argument.
Example follows.
In controller:
$this->addFlash('success', 'flashmessage.project_deleted');
$this->addFlash('_params', serialize(['%project%' => $project->getTitle()]));
In template:
{% flashMessage = app.session.flashbag.get('info') %}
{% if app.session.flashbag.has('_params') %}
{% set flashParams = app.session.flashbag.get('_params')|first|unserialize %}
{{ flashMessage|trans(flashParams) }}
{% else %}
{{ flashMessage|trans }}
{% endif %}
You need to create a Twig extension that defines an unserialize filter (or use a library that provides it)
Since Symfony 5.2 you can use the TranslatableMessage object to achieve this.
https://symfony.com/doc/current/translation.html#translatable-objects
use Symfony\Component\Translation\TranslatableMessage;
$this->addFlash(
'success',
new TranslatableMessage(
'flashmessage.project_deleted',
['%project%' => $project->getTitle()]
)
);
Then in your Twig template you only need to use {{ flashMessage|trans }}.
This works without injecting the Translator service, or messing about with anything in Twig.
Have a look at the ICU Message Format: https://symfony.com/doc/current/translation/message_format.html
I'm customizing my error pages and I was wandering if it is possible to get the language of the country user directly in my template, without the controller.
You can use :
{{ app.request.locale }}
Edit
Ah i didn't understood the question but this is what you are looking for :
$request->getPreferredLanguage($anArrayOfYourSupportedLanguages);
Then pass it to your twig.
fabpot answer :
https://groups.google.com/forum/#!topic/symfony-devs/-2AwAQhlLLQ
I cant get the form_widget (from mopabootstrapbundle) to use the translation (from FOSUserBundle) to work in the registration form (from FOSUserBundle) after extending it to my bundle.
https://github.com/phiamo/MopaBootstrapBundle/issues/8
my problem is the same as the above issue, but I cannot understand how it is solved.
I guess I must somehow use the translation_domain from FOSUserBundle
did you make all the steps as on this post: https://github.com/phiamo/MopaBootstrapBundle/issues/8#issuecomment-2842368 and especially lines:
copied the whole templates dir from views/Registration to
app/FosUserBundle/views/Registration/
This is the way I dealt with my problem
https://github.com/phiamo/MopaBootstrapBundle/issues/8
I am searching how to display the dateTime related to the user timezone using TWIG.
I really want to understand how it works.
Thank you.
There is no easy solution to get the user location in twig templates.
I would :
Try to get the user's timezone with Javascript
Store this value in a session
Then catch it with twig fron the {{ app.session }} object
Good luck ;)