urlGenerator = $urlGenerator; $this->translator = $translator; } protected function getQuery(QueryBuilder $builder) { $builder->distinct()->select('part') ->addSelect('category') ->addSelect('footprint') ->addSelect('manufacturer') ->addSelect('partUnit') ->from(Part::class, 'part') ->leftJoin('part.category', 'category') ->leftJoin('part.partLots', 'partLots') ->leftJoin('part.footprint', 'footprint') ->leftJoin('part.manufacturer', 'manufacturer') ->leftJoin('part.orderdetails', 'orderdetails') ->leftJoin('part.partUnit', 'partUnit'); } protected function buildCriteria(QueryBuilder $builder, array $options) { $em = $builder->getEntityManager(); if (isset($options['category'])) { $category = $options['category']; $repo = $em->getRepository(Category::class); $list = $repo->toNodesList($category); $list[] = $category; $builder->andWhere('part.category IN (:cid)')->setParameter('cid', $list); } if (isset($options['footprint'])) { $category = $options['footprint']; $repo = $em->getRepository(Footprint::class); $list = $repo->toNodesList($category); $list[] = $category; $builder->andWhere('part.footprint IN (:cid)')->setParameter('cid', $list); } if (isset($options['manufacturer'])) { $category = $options['manufacturer']; $repo = $em->getRepository(Manufacturer::class); $list = $repo->toNodesList($category); $list[] = $category; $builder->andWhere('part.manufacturer IN (:cid)')->setParameter('cid', $list); } if (isset($options['storelocation'])) { $location = $options['storelocation']; $repo = $em->getRepository(Storelocation::class); $list = $repo->toNodesList($location); $list[] = $location; $builder->andWhere('partLots.storage_location IN (:cid)')->setParameter('cid', $list); } if (isset($options['supplier'])) { $location = $options['supplier']; $repo = $em->getRepository(Supplier::class); $list = $repo->toNodesList($location); $list[] = $location; $builder->andWhere('orderdetails.supplier IN (:cid)')->setParameter('cid', $list); } if (isset($options['tag'])) { $builder->andWhere('part.tags LIKE :tag')->setParameter('tag', '%' . $options['tag'] . '%'); } if (isset($options['search'])) { $builder->AndWhere('part.name LIKE :search')->orWhere('part.description LIKE :search')->orWhere('part.comment LIKE :search') ->setParameter('search', '%' . $options['search'] . '%'); } } /** * @param DataTable $dataTable * @param array $options */ public function configure(DataTable $dataTable, array $options) { $dataTable ->add('name', TextColumn::class, [ 'label' => $this->translator->trans('part.table.name'), 'render' => function ($value, Part $context) { return sprintf( '%s', $this->urlGenerator->infoURL($context), $context->getName() ); }, ]) ->add('id', TextColumn::class, [ 'label' => $this->translator->trans('part.table.id'), 'visible' => false ]) ->add('description', TextColumn::class, [ 'label' => $this->translator->trans('part.table.description'), ]) ->add('category', EntityColumn::class, [ 'label' => $this->translator->trans('part.table.category'), 'property' => 'category', ]) ->add('footprint', EntityColumn::class, [ 'property' => 'footprint', 'label' => $this->translator->trans('part.table.footprint') ]) ->add('manufacturer', EntityColumn::class, [ 'property' => 'manufacturer', 'label' => $this->translator->trans('part.table.manufacturer') ]) //->add('footprint', TextColumn::class, ['field' => 'footprint.name']) //->add('manufacturer', TextColumn::class, ['field' => 'manufacturer.name' ]) //->add('amountSum', TextColumn::class, ['label' => 'instock.label_short']) ->add('amount', TextColumn::class, [ 'label' => $this->translator->trans('part.table.amount'), 'propertyPath' => 'amountSum' ]) ->add('minamount', TextColumn::class, [ 'label' => $this->translator->trans('part.table.minamount'), 'visible' => false ]) ->add('partUnit', TextColumn::class, [ 'field' => 'partUnit.name', 'label' => $this->translator->trans('part.table.partUnit'), 'visible' => false ]) ->add('addedDate', LocaleDateTimeColumn::class, [ 'label' => $this->translator->trans('part.table.addedDate'), 'visible' => false ]) ->add('lastModified', LocaleDateTimeColumn::class, [ 'label' => $this->translator->trans('part.table.lastModified'), 'visible' => false ]) ->add('needs_review', BoolColumn::class, [ 'label' => $this->translator->trans('part.table.needsReview'), 'trueValue' => $this->translator->trans('true'), 'falseValue' => $this->translator->trans('false'), 'nullValue' => '', 'visible' => false ]) ->add('favorite', BoolColumn::class, [ 'label' => $this->translator->trans('part.table.favorite'), 'trueValue' => $this->translator->trans('true'), 'falseValue' => $this->translator->trans('false'), 'nullValue' => '', 'visible' => false ]) ->add('manufacturing_status', MapColumn::class, [ 'label' => $this->translator->trans('part.table.manufacturingStatus'), 'visible' => false, 'default' => $this->translator->trans('m_status.unknown'), 'map' => [ '' => $this->translator->trans('m_status.unknown'), 'announced' => $this->translator->trans('m_status.announced'), 'active' => $this->translator->trans('m_status.active'), 'nrfnd' => $this->translator->trans('m_status.nrfnd'), 'eol' => $this->translator->trans('m_status.eol'), 'discontinued' => $this->translator->trans('m_status.discontinued') ] ]) ->add('manufacturer_product_number', TextColumn::class, [ 'label' => $this->translator->trans('part.table.mpn'), 'visible' => false ]) ->add('mass', TextColumn::class, [ 'label' => $this->translator->trans('part.table.mass'), 'visible' => false ]) ->add('tags', TextColumn::class, [ 'label' => $this->translator->trans('part.table.tags'), 'visible' => false ]) ->addOrderBy('name') ->createAdapter(ORMAdapter::class, [ 'query' => function(QueryBuilder $builder) { $this->getQuery($builder); }, 'entity' => Part::class, 'criteria' => [ function (QueryBuilder $builder) use ($options) { $this->buildCriteria($builder, $options); }, new SearchCriteriaProvider() ] ]); } }