How can I insert new \Datetime() jj-mm-aaaa format with Symfony2 ? or if is it impossible how to show it in this format in Twig N
What about using the Date Twig Filter,
{{ yourDateTimeObject|date("d-m-Y") }}
Related
I made a query for selecting certain fields together with a leftjoin.
However I cannot get it to work both at the same time (have a leftjoin and certain selected fields).
$query = $em->getRepository(Product::class)
->createQueryBuilder('p')
->select('p, p.slug, p.price, p.title_x AS title, pc')
->leftJoin('p.productimgs', 'pc')
->getQuery();
I call the array with
{% for item in article.productimgs %}
but i get the error: Key "productimgs" for array with keys "0, slug, price, title" does not exist
I also tried to call it with the function
{% for item in article.getProductimgs() %}
but then i get this error : Impossible to invoke a method ("getProductimgs") on an array.
I am not so good with doctrine / query building.
The productimages is a onetomany relation in the product entity.
it's a symfony 5 project
All help appreciated, thank you!
Since you are mixing the entities and specific columns in the select the hydrated results will actually be arrays and not Products. You can see it's structure with
{{ dump(article) }}
If you just want to eager load the related product images in the one query use
$query = $em->getRepository(Product::class)
->createQueryBuilder('p')
->select('p, pc')
->leftJoin('p.productimgs', 'pc')
->getQuery();
This will hydrate the results as Products so you can access its properties by the Twig shorthands or as functions:
{{ article.slug }}
{{ article.getSlug() }}
If you access the Product's images it will not execute a new database query to fetch them since you added them to the select part and they were already hydrated into the result objects:
{{ article.productimgs }}
{{ article.getProductimgs() }}
I used the field "money" in my product entity to store the price of a product in euros.
->add('pRetailPrize' ,'money', array(
'currency' => 'EUR',
'divisor' => 100,
))
It shows the price in euros (ex 1300,35 €) when you retrive or insert a price through the money entity field, but when you have to show the price using getRepository:
$entity = $em->getRepository('MyBundle:ProductInfo')->find($id);
And the you pass the variable $entity (entity.pRetailPrize) to a twig it doesn't show the comma before decimals. I then realized it didn't save the comma into the database. Is there a way to save the comma into database using the money field or to use the money field in a way it shows the comma when you retrieve a price from the database in euro currency system using getRepository as shown above? Also any solution or suggestion to do it differently is appreciated.
And it shouldn't. Comma separation is a output thing and, because of the localization's specifics, it should not be stored persistently.
In order to print it, you should use built-in number_format filter: http://twig.sensiolabs.org/doc/filters/number_format.html
Example:
{{ number|number_format(2, '.', ',') }}
Hope this helps...
There is only one thing: you set field mapping as integer instead of float in your entity.
I am using translatable
It can handle the data directly depending on the current locale setting.
However I want to access each data sometimes with ignoring locale setting.
in contoroller.
I can access each data like this.
$transRepo = $em->getRepository('Gedmo\Translatable\Entity\Translation');
$repo = $transRepo->findTranslations($myEntity);
var_dump($repo['en']['comment']);
Then, is there any way to fetch each language data in twig??
{{comment}} // it shows the comment depending on the locale setting.
{{comment | trancelate(en)}} // I want to ignore the locale setting like this.
How about passing the translations to your Twig template since you need to show them:
$translations = $repository->findTranslations($article);
And then in your Twig template you could do something like:
{{ translations.en.comment }}
{{ translations.de.comment }}
{{ translations.fr.comment }}
The official documentation might help.
I've got an entity with a starting date and an ending date.
Is it possible to get the difference in time between them by using twig?
Since PHP 5.3 There is another option without to write an extension.
This example show how to calc the plural day/days
{# endDate and startDate are strings or DateTime objects #}
{% set difference = date(endDate).diff(date(startDate)) %}
{% set leftDays = difference.days %}
{% if leftDays == 1 %}
1 day
{% else %}
{{ leftDays }} days
{% endif %}
Explanation:
PHP 5.3 DateTime object has diff() method which return a DateInterval object with the result difference between endDate and beginDate
Twig
Twig date function always return a DateTime object so we can call diff method
Finally we can access to the properties of the DateInterval object or format it with the Twig date filter.
Note: There is no need of wrap endDate or startDate with the date function if the variable is already a DateTime object.
Note2: DateTime is used here as a synonym of DateTimeInterface.
There's no built-in function to do that, but you can easily do it yourself, extending twig is easy!
The quick'n'easy way is to do it with twig's simple function class:
$function = new Twig_SimpleFunction('date_difference', function ($start, $end) {
// ... calculate difference and return it
});
// assuming $twig is an instance of Twig_Environment
$twig->addFunction($function);
The reusable way is to create a twig extension (documented on the same link). That's still easy.
Also note there is an existing Date extension from Sensio Labs that offer a time_diff filter.
Then you can use it like this:{{ entity.ending_date|time_diff(entity.starting_date) }}
Please note that this plugin is abandonned and not supported with Twig 3 : https://packagist.org/packages/twig/extensions
For Symfony 5, I recommand using the KnpTimeBundle
it provides the twig function |ago
To install : composer require knplabs/knp-time-bundle
I'm trying to manipulate the query string values in a URL.
I can get the current URL or route either from the Request object or Twig's functions, but it's the query string I'm struggling with.
I don't need app.request.attributes.get('_route_params') as this gets the query string params that are in the route.
I need to get query string params that are actually in the URL.
I want to be able to do the two things listed below in both Symfony2 (in a PHP controller) and Twig (in a Twig template):
Get all current query string values in the URL and display them
Do 1, but change one of the query string values before displaying them
I can't find anyone who knows how to do this.
You can use app.request.query.all to get your query strings.
If you want to change a param in Twig you can do this
{% set queryParams = app.request.query.all %}
{% set queryParams = queryParams|merge({queryKey: newQueryValue}) %}
To get the query string "https://stackoverflow.com?name=jazz"
{{ app.request.query.get('name') | default('default value if not set'); }}
Into controller
use Symfony\Component\HttpFoundation\Request;
public function fooAction(Request $request)
{
$params = $request->query->all();
}
please, pay attention: $request->query->all(); will return an array with keys named as query parameters
Into twig
As long you pass from controller (read this as always) you can pass your parameters to a view in that way
use Symfony\Component\HttpFoundation\Request;
public function fooAction(Request $request)
{
$params = $request->query->all();
return $this->render('MyFooBundle:Bar:foobar.html.twig', array('params' => $params));
}
Into your twig template foobar.html.twig you can access all query string parameters simply by using the params variable.
e.g with this request URL: http://example.com/?foo=bar&secondfoo=secondbar
{% for paramName, paramValue in params %}
<div>{{ paramName }}: {{ paramValue }}</div>
{% endfor %}
<div>{{ params.secondfoo }}</div>
twig output:
<div>foo: bar</div>
<div>secondfoo: secondbar</div>
<span>secondbar</span>
Another method is to use app.request.query.all in twig, without passing anything to twig from your controller.
Final note
If you want to modify one of those parameters when passing an array to twig from your controller, simply change one of the array values, as you would with normal values (i.e.: $params['id'] = $params['id'] - 1;)
Hi Stephen we have tried ur solution to get the value but it going to default value.
http://localhost:4000/about/investors/key-dates-and-events-details?year=2017#q1
i have used like this on my twig file
{{ app.request.query.get('year') | default('default value if not set'); }} Quareter Q1
Please let me know.