![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/app/bundles/CoreBundle/Form/ |
<?php namespace Mautic\CoreBundle\Form; use Mautic\CoreBundle\Form\Type\BooleanType; use Mautic\CoreBundle\Form\Type\CountryType; use Mautic\CoreBundle\Form\Type\LocaleType; use Mautic\CoreBundle\Form\Type\MultiselectType; use Mautic\CoreBundle\Form\Type\RegionType; use Mautic\CoreBundle\Form\Type\SelectType; use Mautic\CoreBundle\Form\Type\TimezoneType; use Mautic\CoreBundle\Form\Type\YesNoButtonGroupType; use Mautic\CoreBundle\Helper\ArrayHelper; use Mautic\CoreBundle\Helper\InputHelper; use Mautic\LeadBundle\Form\Type\HtmlType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\DateTimeType; use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Form\Extension\Core\Type\TimeType; use Symfony\Component\Form\Form; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\ResolvedFormTypeInterface; trait RequestTrait { /** * @param FormInterface<mixed> $form * @param array<mixed> $params * @param array<mixed> $masks * @param array<mixed> $fields * * @throws \Exception */ protected function prepareParametersFromRequest(FormInterface $form, array &$params, object $entity = null, array $masks = [], array $fields = []): void { // ungroup fields if need it foreach ($fields as $key=>$field) { if (is_array($field)) { foreach ($field as $k=>$f) { $fields[$k]=$f; } unset($fields[$key]); continue; } } // Special handling of some fields foreach ($form as $name => $child) { if (!isset($params[$name])) { continue; } $type = $child->getConfig()->getType(); if ($type instanceof ResolvedFormTypeInterface) { $type = $type->getInnerType(); } switch ($type::class) { case YesNoButtonGroupType::class: case BooleanType::class: if (!is_object($entity)) { break; } $setter = 'set'.ucfirst($name); // Symfony fails to recognize true values on PATCH and add support for all boolean types (on, off, true, false, 1, 0) // If value is array and count 1, return value of array as string if (is_array($params[$name]) && 1 == count($params[$name])) { $params[$name] = end($params[$name]); } if ('' === $params[$name]) { break; } // find property by value if (!empty($fields)) { $properties = ArrayHelper::getValue('properties', $fields[$name]); if (is_array($properties)) { $valuesAsKeys = array_flip(array_values($properties)); if (isset($valuesAsKeys[$params[$name]])) { $params[$name] = $valuesAsKeys[$params[$name]]; } } } $data = filter_var($params[$name], FILTER_VALIDATE_BOOLEAN); $data = (bool) $data; try { $entity->$setter($data); // Manually handled so remove from form processing unset($form[$name], $params[$name]); break; } catch (\InvalidArgumentException) { } // If not manually handled cast to int because Symfony form processing take false as empty $params[$name] = (int) $data; break; case ChoiceType::class: case CountryType::class: case LocaleType::class: case MultiselectType::class: case RegionType::class: case SelectType::class: case TimezoneType::class: if (!$child->getConfig()->getOption('multiple')) { break; } // Ensure the value is an array if (!is_array($params[$name])) { $params[$name] = (str_contains($params[$name], '|')) ? explode('|', $params[$name]) : ($params[$name] ? [$params[$name]] : []); } break; case DateTimeType::class: case DateType::class: case TimeType::class: // Prevent zero based date placeholders $dateTest = (int) str_replace(['/', '-', ' '], '', $params[$name]); if (!$dateTest) { // Date placeholder was used so just ignore it to allow import of the field unset($params[$name]); break; } if (false === ($timestamp = strtotime($params[$name]))) { $timestamp = null; } if (!$timestamp) { unset($params[$name]); break; } switch ($type::class) { case DateTimeType::class: $params[$name] = (new \DateTime(date('Y-m-d H:i:s', $timestamp)))->format('Y-m-d H:i'); break; case DateType::class: $params[$name] = (new \DateTime(date('Y-m-d', $timestamp)))->format('Y-m-d'); break; case TimeType::class: $params[$name] = (new \DateTime(date('H:i:s', $timestamp)))->format('H:i:s'); break; } break; case HtmlType::class: $masks[$name] = 'html'; break; } } if (!isset($masks['description'])) { // Add description to support strict HTML $masks['description'] = 'strict_html'; } if (!isset($masks['content'])) { // Assume HTML $masks['description'] = 'html'; } $params = InputHelper::_($params, $masks); } /** * @param array<mixed> $fieldData * @param array<mixed> $leadField */ public function cleanFields(array &$fieldData, array $leadField): void { // This will catch null values or non-existent values to prevent null from converting to false/0 if (!isset($fieldData[$leadField['alias']])) { return; } switch ($leadField['type']) { case 'boolean': $fieldData[$leadField['alias']] = InputHelper::boolean($fieldData[$leadField['alias']]); break; // Ensure date/time entries match what symfony expects case 'datetime': case 'date': case 'time': // Prevent zero based date placeholders $dateTest = (int) str_replace(['/', '-', ' '], '', $fieldData[$leadField['alias']]); if (!$dateTest) { // Date placeholder was used so just ignore it to allow import of the field unset($fieldData[$leadField['alias']]); } else { if (false === ($timestamp = strtotime($fieldData[$leadField['alias']]))) { $timestamp = null; } if ($timestamp) { switch ($leadField['type']) { case 'datetime': $fieldData[$leadField['alias']] = (new \DateTime(date('Y-m-d H:i:s', $timestamp)))->format('Y-m-d H:i:s'); break; case 'date': $fieldData[$leadField['alias']] = (new \DateTime(date('Y-m-d', $timestamp)))->format('Y-m-d'); break; case 'time': $fieldData[$leadField['alias']] = (new \DateTime(date('H:i:s', $timestamp)))->format('H:i:s'); break; } } } break; case 'multiselect': if (!is_array($fieldData[$leadField['alias']])) { if (str_contains($fieldData[$leadField['alias']], '|')) { $fieldData[$leadField['alias']] = explode('|', $fieldData[$leadField['alias']]); } else { $fieldData[$leadField['alias']] = [$fieldData[$leadField['alias']]]; } } break; case 'number': $fieldData[$leadField['alias']] = (float) $fieldData[$leadField['alias']]; break; case 'email': $fieldData[$leadField['alias']] = InputHelper::email($fieldData[$leadField['alias']]); break; } } }