Symfony 3.4 file is not validated when using createFormBuilder - symfony

Here is what I have tried:
$form = $this->createFormBuilder(null, ['method' => 'POST', 'csrf_protection' => false])
->add('file', FileType::class, [
'required' => true,
'constraints' => [
new File([
'mimeTypes' => [
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'image/gif',
'image/png',
'image/jpeg',
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.spreadsheet'
]
]),
new Count(['min' => 1, 'max' => 1])
]
])
//->add('submit', SubmitType::class)
->getForm();
$form->handleRequest($request);
// $form->submit($request->request->all(), false);
$form->submit($request->files->get($form->getName()));
// $this->
// if ($form->isValid()) {
if (/*$form->isSubmitted() &&*/ $form->isValid()) {
Handle request does not submit form. If I call submit after handle request, it still does not validate.
I even tried
/** #var UploadedFile $f */
$f = $request->files->get('file');
$violations = $this->container->get('validator')->validate($f, [
new File([
'mimeTypes' => [
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'image/gif',
'image/png',
'image/jpeg',
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.spreadsheet'
]
]),
new Count(['min' => 1, 'max' => 1])
]);
But validate gives error:
Expected argument of type "array or \Countable", "Symfony\Component\HttpFoundation\File\UploadedFile" given.
0 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php(829):
Symfony\Component\Validator\Constraints\CountValidator->validate(Object(Symfony\Component\HttpFoundation\File\UploadedFile), Object(Symfony\Component\Validator\Constraints\Count))
1 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php(675):
Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateInGroup(Object(Symfony\Component\HttpFoundation\File\UploadedFile),
'000000006bcba97...',
Object(Symfony\Component\Validator\Mapping\GenericMetadata),
'Default',
Object(Symfony\Component\Validator\Context\ExecutionContext))
2 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php(118):
Symfony\Component\Validator\Validator\RecursiveContextualValidator->validateGenericNode(Object(Symfony\Component\HttpFoundation\File\UploadedFile),
NULL, '000000006bcba97...',
Object(Symfony\Component\Validator\Mapping\GenericMetadata), '',
Array, NULL, 1,
Object(Symfony\Component\Validator\Context\ExecutionContext))
3 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/RecursiveValidator.php(100):
Symfony\Component\Validator\Validator\RecursiveContextualValidator->validate(Object(Symfony\Component\HttpFoundation\File\UploadedFile), Array, Array)
4 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/Validator/Validator/TraceableValidator.php(65):
Symfony\Component\Validator\Validator\RecursiveValidator->validate(Object(Symfony\Component\HttpFoundation\File\UploadedFile), Array, NULL)
5 /home/darius/PhpstormProjects/surplus/src/STL/TaxCalculatorBundle/Controller/Api/TaxCalculatorController.php(357):
Symfony\Component\Validator\Validator\TraceableValidator->validate(Object(Symfony\Component\HttpFoundation\File\UploadedFile), Array)
6 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php(151):
STL\TaxCalculatorBundle\Controller\Api\TaxCalculatorController->uploadAction(300,
Object(Symfony\Component\HttpFoundation\Request),
Object(FOS\RestBundle\Request\ParamFetcher))
7 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/HttpKernel.php(68):
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request),
1)
8 /home/darius/PhpstormProjects/surplus/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Kernel.php(202):
Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request),
1, true)
9 /home/darius/PhpstormProjects/surplus/web/app_dev.php(32): Symfony\Component\HttpKernel\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request))
10 {main}
I see this is not as in documentation example, but I want to not refactor much if possible. This should be simple fix but I spent few hours and cannot find.

$violations = $this->container->get('validator')->validate($f, [
new File([
'mimeTypes' => [
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'image/gif',
'image/png',
'image/jpeg',
'application/vnd.oasis.opendocument.text',
'application/vnd.oasis.opendocument.spreadsheet'
]
]),
//new Count(['min' => 1, 'max' => 1])
]);
The problem was new Count. It is not needed because for validate method if we upload multiple files, then $f will be array and there will be exception, so user will not be able to upload multiple files.

Related

Why is mentric totatAdRevenue not working?

When using metric totalAdRevenue (admanager 360 link in GA4) the metric 'totalAdRevenue' is not giving any results. In GA4 Query explorer i do get the right data.
My Code:
$ar = [
'property' => 'properties/' . $PROP_ID,
'dateRanges' => [
new DateRange([
'start_date' => $date->format("Y-m-d"),
'end_date' => $date->format("Y-m-d"),
]),
],
'dimensions' => [new Dimension(
[
'name' => 'sessionCampaignName'
]
),
],
'metrics' => [new Metric(
[
'name' => 'sessions'
]
), new Metric(
[
'name' => 'totalAdRevenue'
]
)
]
];
$response = $analytics->runReport($ar);

How to add product attributes programmatically?

if i try this:
$arr = [
'pa_yacht-dozvillya' => [
'name' => 'pa_yaht-dozvillya',
'value' => 'Акваскутер',
'is_visible' => 1,
'is_taxonomy' => 1,
],
];
update_post_meta(2194, '_product_attributes', $arr);
then this adds an attribute with no value
here

How to get only nested data in Laravel collection

I wrote a database selection like this (Laravel 8):
$users = collect(User::with(['roles','roles.permissions'])->find(21));
The result is the following
=> Illuminate\Support\Collection {#2051
all: [
"id" => 21,
"first_name" => "test",
"name" => "test",
"..." => "...",
"roles" => [
[
"id" => 9,
"name" => "Test",
"permissions" => [
[
"id" => 13,
"name" => "userReadList",
],
[
"id" => 11,
"name" => "userUpdate",
],
],
],
[
"id" => 4,
"name" => "responsible",
"permissions" => [
[
"id" => 10,
"name" => "userRead",
],
[
"id" => 9,
"name" => "userCreate",
],
],
],
],
],
}
Now: What I have to change in the query to get only an array, containing the permissions id as follow: [13,11,10,9]?
Or is my query principal wrong for getting the permissions id
I found the solution:
$userPermissions = collect(User::with(['roles','roles.permissions'])->find(21));
Arr::flatten(Arr::pluck($userPermissions['roles'] , 'permissions.*.id'));
//[13,11,1,4,]
But I think, the better way is the following
$userPermissions = User::with(['roles','roles.permissions'])->find(21);
$userPermissions->roles->pluck('permissions.*.id')->flatten()->toArray();
//[13,11,1,4,]
Also possible it the following approach
$userPermissions = User::with(['roles','roles.permissions'])->where('id',21)->get();
$userPermissions->pluck('roles.*.permissions.*.id')->flatten()->toArray();
//[13,11,1,4,]

How do we get this array output?

We need this output:
$filters = [
['property' => 'status.id', 'expression' => '!=', 'value' => 5],
['property' => 'status.id', 'expression' => '!=', 'value' => 1],
['property' => 'status.id', 'expression' => '!=', 'value' => 7],
];
and this way doesn't work:
foreach ($orderStatusItems as $orderStatusItem) {
$filters[] .= "['property' => 'status.id', 'expression' => '!=', 'value' => $orderStatusItem],";
}
here is the solution:
$orderFilters = [];
foreach ($orderStatusItems as $orderStatusItem) {
array_push($orderFilters, ['property' => 'status.id', 'expression' => '!=', 'value' => $orderStatusItem]);
}

Doctrine: return one dimensional

I have a ManyToOne relation between two entities ArticleLine and Artcile:
<?php
//ArticleLine.php
ManyToOne(targetEntity="Gain\Bundle\ArticleBundle\Entity\Article")
I'm trying to get the list of Ids based on some where conditions..
This my doctrine query dql:
SELECT tl.id FROM AppBundle\Entity\ArticleLine tl INNER JOIN tl.turnover t INNER JOIN tl.article a WHERE t.supplier = :supplier AND t.year = :year AND tl.significant = false ORDER BY tl.id asc
After calling $qb->getQuery()->getResult() I'm getting this result of arrays...
array:138 [
0 => array:1 [
"id" => 64624
]
1 => array:1 [
"id" => 64630
]
2 => array:1 [
"id" => 64631
]
3 => array:1 [
"id" => 64632
]
4 => array:1 [
"id" => 64633
]
5 => array:1 [
"id" => 64637
]
6 => array:1 [
"id" => 64638
Any idea how I can transform my result to a one dimensional array or playing on hydration mode to get something like this
[64624, 64630, 64631, 64633 ... ]
or
[0 => 64624, 1 => 64630, 2 => 64631 ...]
You can transform your result with an array_map function:
$result = $qb->getQuery()->getResult()
$result = array_map('current', $result);
You can also use array_column fucntion:
$result = array_column($result, "id")
If a solution exists with an hydration mode. I would like to know :)

Resources