bundles/VehicleMarketBundle/Document/Areabrick/vehicleListing.php line 56

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace VehicleMarketBundle\Document\Areabrick;
  4. use Knp\Component\Pager\PaginatorInterface;
  5. use Pimcore\Extension\Document\Areabrick\AbstractTemplateAreabrick;
  6. use Pimcore\Extension\Document\Areabrick\EditableDialogBoxConfiguration;
  7. use Pimcore\Extension\Document\Areabrick\EditableDialogBoxInterface;
  8. use Pimcore\Db;
  9. use Pimcore\Model\DataObject\DealerLocation;
  10. use Pimcore\Model\DataObject\Vehicle;
  11. use Pimcore\Model\DataObject\VehicleFilter;
  12. use Pimcore\Model\DataObject\VehicleFilterEntity;
  13. use Pimcore\Model\Document\Editable;
  14. use Pimcore\Model\Document\Editable\Area\Info;
  15. use Symfony\Component\Form\FormFactory;
  16. use Symfony\Component\Form\FormInterface;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Symfony\Component\HttpFoundation\Request;
  19. use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
  20. use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
  21. use VehicleMarketBundle\Document\Form\CarListFilterFormType;
  22. use VehicleMarketBundle\Service\CampaignSchedule;
  23. use Pimcore\Translation\Translator;
  24. use Pimcore\Tool\Session;
  25. class vehicleListing extends AbstractTemplateAreabrick implements EditableDialogBoxInterface
  26. {
  27.     /**
  28.      * @var PaginatorInterface
  29.      */
  30.     protected $paginator;
  31.     public function getName()
  32.     {
  33.         return 'Vehicle Listing';
  34.     }
  35.     public function __construct(PaginatorInterface $paginatorTranslator $translator)
  36.     {
  37.         $this->paginator $paginator;
  38.         $this->translator $translator;
  39.     }
  40.     /**
  41.      * @Route("/fahrzeugmarkt", name="carSearch", methods={"GET"})
  42.      *
  43.      * @param Request $request
  44.      *
  45.      * @throws \Exception
  46.      */
  47.     public function action(Info $info)
  48.     {
  49.         $session $info->getRequest()->getSession();
  50.         /** @var AttributeBag $bag */
  51.         $bag $session->getBag('search_url');
  52.         $bag->set('search_url'$info->getRequest()->getRequestUri());
  53.         $carFilterURLElement $info->getDocumentElement('carFilterURL');
  54.         $filterCount $info->getDocumentElement('displayCount');
  55.         if (isset($carFilterURLElement) && method_exists($carFilterURLElement'getData') && !empty($carFilterURLElement->getData())) {
  56.             $carFilterURL $carFilterURLElement->getData();
  57.             $parts parse_url($carFilterURL);
  58.             if ($parts['query'] === null) {
  59.                 $parts['query'] = '';
  60.             }
  61.             parse_str($parts['query'], $preselectCarFilterQuery);
  62.         } else {
  63.             $preselectCarFilterQuery null;
  64.         }
  65.         $make explode("/"$info->getRequest()->getPathInfo(), 3);
  66.         /**
  67.          * @var FormInterface $form
  68.          */
  69.         $form $this->container->get('form.factory')->create(CarListFilterFormType::class, null, ['csrf_protection' => false'data' => new VehicleFilter()]);
  70.         $condition '1=1';
  71.         $joinCondition '';
  72.         $filterBricks = [];
  73.         $sortOrder 'asc';
  74.         $sortOrderKey null;
  75.         $form->handleRequest($info->getRequest());
  76.         if (($form->isSubmitted() && $form->isValid())) {
  77.             $filterData $form->getData();
  78.             if ($filterData->getSortOrder() !== null) {
  79.                 switch ($filterData->getSortOrder()) {
  80.                     case 'sort_price_increasing':
  81.                         $filterBricks[] = "Costs";
  82.                         $sortOrder 'asc';
  83.                         $sortOrderKey 'preis';
  84.                         break;
  85.                     case 'sort_price_decreasing':
  86.                         $filterBricks[] = "Costs";
  87.                         $sortOrder 'desc';
  88.                         $sortOrderKey 'preis';
  89.                         break;
  90.                     case 'sort_mileage_increasing':
  91.                         $filterBricks[] = "vehicleBaseData";
  92.                         $sortOrder 'asc';
  93.                         $sortOrderKey 'kilometer';
  94.                         break;
  95.                     case 'sort_mileage_decreasing':
  96.                         $filterBricks[] = "vehicleBaseData";
  97.                         $sortOrder 'desc';
  98.                         $sortOrderKey 'kilometer';
  99.                         break;
  100.                     case 'sort_rate_increasing':
  101.                         $filterBricks[] = "vehicleBaseData";
  102.                         $sortOrder 'asc';
  103.                         $sortOrderKey 'filterRate';
  104.                         break;
  105.                     case 'sort_rate_decreasing':
  106.                         $filterBricks[] = "vehicleBaseData";
  107.                         $sortOrder 'desc';
  108.                         $sortOrderKey 'filterRate';
  109.                         break;
  110.                 }
  111.             }
  112.             if ($filterData->getCarMake() || !empty($preselectCarFilterQuery['car_list_filter_form']['car_make'])) {
  113.                 $filterBricks[] = "vehicleBaseData";
  114.                 $carMake = empty($preselectCarFilterQuery['car_list_filter_form']['car_make']) || $filterData->getCarMake() ? $filterData->getCarMake() : $preselectCarFilterQuery['car_list_filter_form']['car_make'];
  115.                 $condition .= " and vehicleBaseData.marke LIKE '" $carMake "' ";
  116.             }
  117.             if ($filterData->getCarModel()) {
  118.                 $filterBricks[] = "vehicleBaseData";
  119.                 if(str_contains($filterData->getCarModel(), 'alle ')) {
  120.                     switch ($filterData->getCarModel()) {
  121.                         case 'alle 1er':
  122.                             $condition .= " and vehicleBaseData.modellbasis LIKE '1%' ";
  123.                             break;
  124.                         case 'alle 2er':
  125.                             $condition .= " and vehicleBaseData.modellbasis LIKE '2%' ";
  126.                             break;
  127.                         case 'alle 3er':
  128.                             $condition .= " and vehicleBaseData.modellbasis LIKE '3%' ";
  129.                             break;
  130.                         case 'alle 4er':
  131.                             $condition .= " and vehicleBaseData.modellbasis LIKE '4%' ";
  132.                             break;
  133.                         case 'alle 5er':
  134.                             $condition .= " and vehicleBaseData.modellbasis LIKE '5%' ";
  135.                             break;
  136.                         case 'alle 6er':
  137.                             $condition .= " and vehicleBaseData.modellbasis LIKE '6%' ";
  138.                             break;
  139.                         case 'alle 7er':
  140.                             $condition .= " and vehicleBaseData.modellbasis LIKE '7%' ";
  141.                             break;
  142.                         case 'alle 8er':
  143.                             $condition .= " and vehicleBaseData.modellbasis LIKE '8%' ";
  144.                             break;
  145.                         case 'alle i-Modelle':
  146.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'i%' ";
  147.                             break;
  148.                         case 'alle M-Modelle':
  149.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'M%' ";
  150.                             break;
  151.                         case 'alle X-Modelle':
  152.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'X%' ";
  153.                             break;
  154.                         case 'alle Z-Modelle':
  155.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'Z%' ";
  156.                             break;
  157.                     }
  158.                 } else {
  159.                     $condition .= " and vehicleBaseData.modellbasis LIKE '" $filterData->getCarModel() . "' ";
  160.                 }
  161.             }
  162.             if ($filterData->getCarType()) {
  163.                 $filterBricks[] = "vehicleBaseData";
  164.                 $condition .= " and vehicleBaseData.kategorie LIKE '" $filterData->getCarType() . "' ";
  165.             }
  166.             if ($filterData->getCarAgeType()) {
  167.                 $filterBricks[] = "vehicleBaseData";
  168.                 switch ($filterData->getCarAgeType()) {
  169.                     case 'Jahreswagen':
  170.                         $condition .= " and vehicleBaseData.jahreswagen = 1 ";
  171.                         break;
  172.                     case 'Vorführfahrzeug':
  173.                         $condition .= " and vehicleBaseData.vorfuehrfahrzeug = 1 ";
  174.                         break;
  175.                     case 'Neufahrzeug':
  176.                         $condition .= " and vehicleBaseData.neufahrzeug = 1 ";
  177.                         break;
  178.                     case 'Gebrauchtfahrzeug':
  179.                         $condition .= " and vehicleBaseData.neufahrzeug = 0 ";
  180.                         break;
  181.                 }
  182.             }
  183.             if ($filterData->getRegistrationYearStart()) {
  184.                 $filterBricks[] = "vehicleBaseData";
  185.                 $condition .= " and vehicleBaseData.ezYear >= '" $filterData->getRegistrationYearStart() . "' ";
  186.             }
  187.             if ($filterData->getRegistrationYearEnd()) {
  188.                 $filterBricks[] = "vehicleBaseData";
  189.                 $condition .= " and vehicleBaseData.ezYear <= '" $filterData->getRegistrationYearEnd() . "' ";
  190.             }
  191.             if ($filterData->getMonthlyRateMin()) {
  192.                 $filterBricks[] = "vehicleBaseData";
  193.                 $condition .= " and filterRate >= '" $filterData->getMonthlyRateMin() . "' ";
  194.             }
  195.             if ($filterData->getMonthlyRateMax()) {
  196.                 $filterBricks[] = "vehicleBaseData";
  197.                 // `filterRate > 0` because 0 means "no bookable rate", not "free": without it a
  198.                 // "up to 300 EUR/month" filter returns every vehicle that has no leasing rate at
  199.                 // all. 391 of 923 vehicles currently carry 0 and another 123 carry NULL.
  200.                 // The MIN filter needs no counterpart - 0 and NULL both fail `>= <min>` already.
  201.                 $condition .= " and filterRate > 0 and filterRate <= '" $filterData->getMonthlyRateMax() . "' ";
  202.             }
  203.             if ($filterData->getKmDriven()) {
  204.                 $filterBricks[] = "vehicleBaseData";
  205.                 $condition .= " and vehicleBaseData.kilometer <= '" $filterData->getKmDriven() . "' ";
  206.             }
  207.             if ($filterData->getFuel()) {
  208.                 $filterBricks[] = "TechnicalData";
  209.                 $condition .= " and TechnicalData.kraftstoffart LIKE '" $filterData->getFuel() . "' ";
  210.             }
  211.             if ($filterData->getTransmission()) {
  212.                 $filterBricks[] = "TechnicalData";
  213.                 $condition .= " and TechnicalData.getriebeart LIKE '" $filterData->getTransmission() . "' ";
  214.             }
  215.             if ($filterData->getColor()) {
  216.                 $filterBricks[] = "Exterieur";
  217.                 $condition .= " and Exterieur.grundfarbeAussen LIKE '" $filterData->getColor() . "' ";
  218.             }
  219.             if ($filterData->getCarLocation()) {
  220.                 $location DealerLocation::getList()->filterByName($filterData->getCarLocation())->current();
  221.                 $filterBricks[] = "vehicleBaseData";
  222.                 $condition .= " and vehicleBaseData.filialId = '" $location->getLocationId() . "' ";
  223.             }
  224.             if ($filterData->getCarAvailability()) {
  225.                 $filterBricks[] = "vehicleBaseData";
  226.                 if ($filterData->getCarAvailability() === 'now') {
  227.                     $condition .= " and STR_TO_DATE(vehicleBaseData.lieferdatum, \"%d.%m.%Y\") < NOW() ";
  228.                 } else {
  229.                     $condition .= " and STR_TO_DATE(vehicleBaseData.lieferdatum, \"%d.%m.%Y\") >= NOW() ";
  230.                 }
  231.             }
  232.             if ($filterData->getQualityBadge()) {
  233.                 $filterBricks[] = "vehicleBaseData";
  234.                 $condition .= " and vehicleBaseData.qualitaetssiegel LIKE '" $filterData->getQualityBadge() . "' ";
  235.             }
  236.             if ($filterData->getCampaignName()) {
  237.                 $filterBricks[] = "vehicleBaseData";
  238.                 $condition .= $this->campaignCondition($filterData->getCampaignName());
  239.             }
  240.         } elseif ($preselectCarFilterQuery !== null) {
  241.             if (isset($preselectCarFilterQuery['car_list_filter_form'])) {
  242.                 $filterData $preselectCarFilterQuery['car_list_filter_form'];
  243.                 if (!$form->isSubmitted()) {
  244.                     $form->setData($filterData);
  245.                 }
  246.             }
  247. //            dd($filterData);
  248.             if ($filterData['sort_order'] !== null) {
  249.                 switch ($filterData['sort_order']) {
  250.                     case 'sort_price_increasing':
  251.                         $filterBricks[] = "Costs";
  252.                         $sortOrder 'asc';
  253.                         $sortOrderKey 'preis';
  254.                         break;
  255.                     case 'sort_price_decreasing':
  256.                         $filterBricks[] = "Costs";
  257.                         $sortOrder 'desc';
  258.                         $sortOrderKey 'preis';
  259.                         break;
  260.                     case 'sort_mileage_increasing':
  261.                         $filterBricks[] = "vehicleBaseData";
  262.                         $sortOrder 'asc';
  263.                         $sortOrderKey 'kilometer';
  264.                         break;
  265.                     case 'sort_mileage_decreasing':
  266.                         $filterBricks[] = "vehicleBaseData";
  267.                         $sortOrder 'desc';
  268.                         $sortOrderKey 'kilometer';
  269.                         break;
  270.                     case 'sort_rate_increasing':
  271.                         $filterBricks[] = "vehicleBaseData";
  272.                         $sortOrder 'asc';
  273.                         $sortOrderKey 'filterRate';
  274.                         break;
  275.                     case 'sort_rate_decreasing':
  276.                         $filterBricks[] = "vehicleBaseData";
  277.                         $sortOrder 'desc';
  278.                         $sortOrderKey 'filterRate';
  279.                         break;
  280.                 }
  281.             }
  282.             if ($filterData['car_make']) {
  283.                 $filterBricks[] = "vehicleBaseData";
  284.                 $condition .= " and vehicleBaseData.marke LIKE '" $filterData['car_make'] . "' ";
  285.             }
  286.             if ($filterData['car_model']) {
  287.                 $filterBricks[] = "vehicleBaseData";
  288.                 if(str_contains($filterData['car_model'], 'alle ')) {
  289.                     switch ($filterData['car_model']) {
  290.                         case 'alle 1er':
  291.                             $condition .= " and vehicleBaseData.modellbasis LIKE '1%' ";
  292.                             break;
  293.                         case 'alle 2er':
  294.                             $condition .= " and vehicleBaseData.modellbasis LIKE '2%' ";
  295.                             break;
  296.                         case 'alle 3er':
  297.                             $condition .= " and vehicleBaseData.modellbasis LIKE '3%' ";
  298.                             break;
  299.                         case 'alle 4er':
  300.                             $condition .= " and vehicleBaseData.modellbasis LIKE '4%' ";
  301.                             break;
  302.                         case 'alle 5er':
  303.                             $condition .= " and vehicleBaseData.modellbasis LIKE '5%' ";
  304.                             break;
  305.                         case 'alle 6er':
  306.                             $condition .= " and vehicleBaseData.modellbasis LIKE '6%' ";
  307.                             break;
  308.                         case 'alle 7er':
  309.                             $condition .= " and vehicleBaseData.modellbasis LIKE '7%' ";
  310.                             break;
  311.                         case 'alle 8er':
  312.                             $condition .= " and vehicleBaseData.modellbasis LIKE '8%' ";
  313.                             break;
  314.                         case 'alle i-Modelle':
  315.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'i%' ";
  316.                             break;
  317.                         case 'alle M-Modelle':
  318.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'M%' ";
  319.                             break;
  320.                         case 'alle X-Modelle':
  321.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'X%' ";
  322.                             break;
  323.                         case 'alle Z-Modelle':
  324.                             $condition .= " and vehicleBaseData.modellbasis LIKE 'Z%' ";
  325.                             break;
  326.                     }
  327.                 } else {
  328.                     $condition .= " and vehicleBaseData.modellbasis LIKE '" $filterData['car_model'] . "' ";
  329.                 }
  330.             }
  331.             if ($filterData['car_type']) {
  332.                 $filterBricks[] = "vehicleBaseData";
  333.                 $condition .= " and vehicleBaseData.kategorie LIKE '" $filterData['car_type'] . "' ";
  334.             }
  335.             if ($filterData['car_age_type']) {
  336.                 $filterBricks[] = "vehicleBaseData";
  337.                 switch ($filterData['car_age_type']) {
  338.                     case 'Jahreswagen':
  339.                         $condition .= " and vehicleBaseData.jahreswagen = 1 ";
  340.                         break;
  341.                     case 'Vorführfahrzeug':
  342.                         $condition .= " and vehicleBaseData.vorfuehrfahrzeug = 1 ";
  343.                         break;
  344.                     case 'Neufahrzeug':
  345.                         $condition .= " and vehicleBaseData.neufahrzeug = 1 ";
  346.                         break;
  347.                     case 'Gebrauchtfahrzeug':
  348.                         $condition .= " and vehicleBaseData.neufahrzeug = 0 ";
  349.                         break;
  350.                 }
  351.             }
  352.             if ($filterData['registration_year_start']) {
  353.                 $filterBricks[] = "vehicleBaseData";
  354.                 $condition .= " and vehicleBaseData.ezYear >= '" $filterData['registration_year_start'] . "' ";
  355.             }
  356.             if ($filterData['registration_year_end']) {
  357.                 $filterBricks[] = "vehicleBaseData";
  358.                 $condition .= " and vehicleBaseData.ezYear <= '" $filterData['registration_year_end'] . "' ";
  359.             }
  360.             if ($filterData['monthly_rate_min']) {
  361.                 $filterBricks[] = "vehicleBaseData";
  362.                 $condition .= " and filterRate >= '" $filterData['monthly_rate_min'] . "' ";
  363.             }
  364.             if ($filterData['monthly_rate_max']) {
  365.                 $filterBricks[] = "vehicleBaseData";
  366.                 // See the same filter on the form path above: 0 means "no bookable rate".
  367.                 $condition .= " and filterRate > 0 and filterRate <= '" $filterData['monthly_rate_max'] . "' ";
  368.             }
  369.             if ($filterData['km_driven']) {
  370.                 $filterBricks[] = "vehicleBaseData";
  371.                 $condition .= " and vehicleBaseData.kilometer <= '" $filterData['km_driven'] . "' ";
  372.             }
  373.             if ($filterData['fuel']) {
  374.                 $filterBricks[] = "TechnicalData";
  375.                 $condition .= " and TechnicalData.kraftstoffart LIKE '" $filterData['fuel'] . "' ";
  376.             }
  377.             if ($filterData['transmission']) {
  378.                 $filterBricks[] = "TechnicalData";
  379.                 $condition .= " and TechnicalData.getriebeart LIKE '" $filterData['transmission'] . "' ";
  380.             }
  381.             if ($filterData['color']) {
  382.                 $filterBricks[] = "Exterieur";
  383.                 $condition .= " and Exterieur.grundfarbeAussen LIKE '" $filterData['color'] . "' ";
  384.             }
  385.             if ($filterData['car_location']) {
  386.                 $location DealerLocation::getList()->filterByName($filterData['car_location'])->current();
  387.                 $filterBricks[] = "vehicleBaseData";
  388.                 $condition .= " and vehicleBaseData.filialId = '" $location->getLocationId() . "' ";
  389.             }
  390.             if ($filterData['car_availability']) {
  391.                 $filterBricks[] = "vehicleBaseData";
  392.                 if ($filterData['car_availability'] === 'now') {
  393.                     $condition .= " and STR_TO_DATE(vehicleBaseData.lieferdatum, \"%d.%m.%Y\") < NOW() ";
  394.                 } else {
  395.                     $condition .= " and STR_TO_DATE(vehicleBaseData.lieferdatum, \"%d.%m.%Y\") >= NOW() ";
  396.                 }
  397.             }
  398.             if ($filterData['quality_badge']) {
  399.                 $filterBricks[] = "vehicleBaseData";
  400.                 $condition .= " and vehicleBaseData.qualitaetssiegel LIKE '" $filterData['quality_badge'] . "' ";
  401.             }
  402.             if ($filterData['campaign_name']) {
  403.                 $filterBricks[] = "vehicleBaseData";
  404.                 $condition .= $this->campaignCondition($filterData['campaign_name']);
  405.             }
  406.         }
  407. //        if (isset($make[2])) {
  408. //            $filterBricks[] = "vehicleBaseData";
  409. //            $condition .= " and vehicleBaseData.marke LIKE '" . $make[2] . "' ";
  410. //        }
  411. //
  412.         $filterBricks array_unique($filterBricks);
  413.         if (count($filterBricks) == 0) {
  414.             $cars Vehicle::getList();
  415.         } else {
  416.             $cars Vehicle::getList([
  417.                 "objectbricks" => $filterBricks,
  418.                 "condition" => $condition,
  419.                 "orderKey" => $sortOrderKey,
  420.                 "order" => $sortOrder
  421.             ]);
  422.         }
  423.         $this->keepRatelessVehiclesLast($cars$sortOrderKey$sortOrder);
  424.         if ($info->getRequest()->get('json') == 1) {
  425.             return new JsonResponse(
  426.                 ['count' => $cars->getCount()]
  427.             );
  428.         }
  429.         //dd($cars->getQueryBuilder()->getSQL());
  430.         $paginator $this->paginator->paginate(
  431.             $cars,
  432.             intval($info->getRequest()->get('page'1)),
  433.             9
  434.         );
  435.         $info->setParam('paginatedCars'$paginator);
  436.         $info->setParam('paginationVariables'$paginator->getPaginationData());
  437.         $info->setParam('form'$form->createView());
  438.         $info->setParam('isBackendUser', (Session::getReadOnly()->get("user")));
  439.     }
  440.     /**
  441.      * SQL fragment for the Kampagne filter.
  442.      *
  443.      * `campaignNames` is a multiselect stored as ",A,B," in the query table, so membership is a
  444.      * LIKE on the comma-delimited value.
  445.      *
  446.      * A campaign that is not running today matches nothing. The dropdown only offers running
  447.      * campaigns (see CarListFilterFormType), but a bookmarked or shared URL can still carry an
  448.      * ended or not-yet-started one - and a vehicle's campaignNames keeps every campaign automedia
  449.      * delivered, including announced ones. Ignoring the filter instead would silently show the
  450.      * full inventory as if the promotion still applied.
  451.      */
  452.     protected function campaignCondition(string $campaignName): string
  453.     {
  454.         if (!(new CampaignSchedule())->isRunning($campaignName)) {
  455.             return ' and 1 = 0 ';
  456.         }
  457.         return ' and vehicleBaseData.campaignNames LIKE ' Db::get()->quote('%,' $campaignName ',%') . ' ';
  458.     }
  459.     /**
  460.      * Sorting by rate ascending must not put the vehicles that have no rate first.
  461.      *
  462.      * `filterRate` is 0 for a vehicle with no bookable leasing rate and NULL for one the ingest
  463.      * never touched - currently 391 and 123 of 923 vehicles. Plain `ORDER BY filterRate asc`
  464.      * therefore fills the first 514 places of "cheapest rate first" with vehicles that show no
  465.      * rate at all, before the cheapest real offer appears.
  466.      *
  467.      * Fixed by ordering, not by filtering: a sort order must not change which vehicles are in the
  468.      * result. The leading term is a boolean - 0 for "has a rate", 1 for "has none" - so the rated
  469.      * vehicles come first, ascending by rate, and the rest keep their place at the end.
  470.      * `setOrderKey(..., false)` passes the expression through unquoted, and Pimcore appends the
  471.      * direction to the whole string (Model\Listing\Dao\QueryBuilderHelperTrait::applyOrderByToQueryBuilder),
  472.      * which is why this is one string and not two keys.
  473.      *
  474.      * Descending needs no help: there, 0 and NULL already sort last.
  475.      */
  476.     protected function keepRatelessVehiclesLast(Vehicle\Listing $cars, ?string $sortOrderKeystring $sortOrder): void
  477.     {
  478.         if ($sortOrderKey !== 'filterRate' || strtolower($sortOrder) !== 'asc') {
  479.             return;
  480.         }
  481.         $cars->setOrderKey('IFNULL(filterRate, 0) = 0, filterRate'false);
  482.     }
  483.     protected function filterFuelTypes(Vehicle $entries, array $search)
  484.     {
  485.         if (!empty($search['kraftstoff'])) {
  486.             $query '';
  487.             $fuelTypeParams = [];
  488.             for ($i 0$i count($search['kraftstoff']); $i++) {
  489.                 $query .= ' kraftstoffart = :f_type' $i ' OR ';
  490.                 $fuelTypeParams['f_type' $i] = $search['kraftstoff'][$i];
  491.             }
  492.             $query substr($query0, -4);
  493.             $entries->addConditionParam($query$fuelTypeParams'AND');
  494.         }
  495.         return $entries;
  496.     }
  497.     public function getDescription()
  498.     {
  499.         return 'A component for rendering a list of cars';
  500.     }
  501.     public function getEditableDialogBoxConfiguration(Editable $area, ?Info $info): EditableDialogBoxConfiguration
  502.     {
  503.         $cars Vehicle::getList();
  504.         return (new EditableDialogBoxConfiguration())
  505.             ->setItems([
  506.                 [
  507.                     'type' => 'input',
  508.                     'label' => $this->translator->trans('Url to filter the list:', [], 'admin'),
  509.                     'name' => 'carFilterURL'
  510.                 ],
  511.                 [
  512.                     'type' => 'relation',
  513.                     'label' => $this->translator->trans('Path to the vehicle details page:', [], 'admin'),
  514.                     'name' => 'carDetailPageUrl'
  515.                 ],
  516.                 [
  517.                     'type' => 'select',
  518.                     'name' => 'car-list-filter',
  519.                     'label' => $this->translator->trans('Show filters for the list?', [], 'admin'),
  520.                     'config' => [
  521.                         'store' => [
  522.                             [true$this->translator->trans('Yes', [], 'admin'),],
  523.                             [false$this->translator->trans('No', [], 'admin'),],
  524.                         ],
  525.                         'defaultValue' => true
  526.                     ]
  527.                 ],
  528.                 [
  529.                     'type' => 'select',
  530.                     'name' => 'car-list-available-from',
  531.                     'label' => $this->translator->trans('Show Car available from?', [], 'admin'),
  532.                     'config' => [
  533.                         'store' => [
  534.                             [true$this->translator->trans('Yes', [], 'admin'),],
  535.                             [false$this->translator->trans('No', [], 'admin'),],
  536.                         ],
  537.                         'defaultValue' => true
  538.                     ]
  539.                 ]
  540. //                ,
  541. //                [
  542. //                    'type' => 'numeric',
  543. //                    'label' => 'Display-Count',
  544. //                    'name' => 'displayCount'
  545. //                ]
  546.             ])
  547.             ->setHeight(460)
  548.             ->setReloadOnClose(true);
  549.     }
  550.     function process_something($cars)
  551.     {
  552.         $myArray = array();
  553.         foreach ($cars as $b) {
  554.             $myArray[] = array($b->getStammdaten()->getVehicleBaseData()->getMarke(), $b->getStammdaten()->getVehicleBaseData()->getMarke());
  555.         }
  556.         return $myArray;
  557.     }
  558.     public function getHtmlTagOpen(Info $info)
  559.     {
  560.         return '';
  561.     }
  562.     public function getHtmlTagClose(Info $info)
  563.     {
  564.         return '';
  565.     }
  566.     public function getTemplateLocation()
  567.     {
  568.         return static::TEMPLATE_LOCATION_BUNDLE;
  569.     }
  570. }