public function getValues() { if ($this->hasFilter()) { $filter = $this->getFilter(); $group = new Ajde_Filter_WhereGroup(); foreach ($filter as $rule) { $group->addFilter(new Ajde_Filter_Where($this->getModel()->getDisplayField(), Ajde_Filter::FILTER_EQUALS, $rule, Ajde_Query::OP_OR)); } $this->getCollection()->addFilter($group); } if ($this->hasAdvancedFilter()) { $filters = $this->getAdvancedFilter(); $group = new Ajde_Filter_WhereGroup(); foreach ($filters as $filter) { if ($filter instanceof Ajde_Filter_Where) { $group->addFilter($filter); } else { $this->getCollection()->addFilter($filter); } } $this->getCollection()->addFilter($group); } $this->getCollection()->orderBy($this->getModel()->getDisplayField()); $return = array(); foreach ($this->getCollection() as $model) { $return[(string) $model] = $model->get($model->getDisplayField()); } return $return; }
public function searchJson() { $q = Ajde::app()->getRequest()->getParam('query'); $collection = new NodeCollection(); // split search terms $terms = explode(' ', $q); // search on node fields $searchGroup = new Ajde_Filter_WhereGroup(Ajde_Query::OP_OR); foreach ($terms as $term) { $termGroup = $collection->getTextFilterGroup($term, Ajde_Query::OP_OR); if ($termGroup !== false) { $searchGroup->addFilter($termGroup); } } $collection->addFilter($searchGroup); // search on meta search $collection->addFilter(new Ajde_Filter_LeftJoin('node_meta', 'node_meta.node', 'node.id')); $searchGroup = new Ajde_Filter_WhereGroup(Ajde_Query::OP_OR); foreach ($terms as $term) { $searchGroup->addFilter(new Ajde_Filter_Where('node_meta.value', Ajde_Filter::FILTER_LIKE, '%' . $term . '%', Ajde_Query::OP_OR)); } $collection->addFilter($searchGroup); $collection->getQuery()->addGroupBy('node.id'); // join in nodetype info $collection->joinNodetype(); $collection->getQuery()->addSelect('nodetype.name AS nodetype_name'); $collection->getQuery()->addSelect('nodetype.icon AS nodetype_icon'); $suggestions = []; foreach ($collection as $node) { /* @var $node NodeModel */ $suggestions[] = ['value' => "<i class='" . $node->get('nodetype_icon') . "'></i> " . $node->displayField(), 'data' => $node->getPK()]; } return ['query' => $q, 'suggestions' => $suggestions]; }
public function filterByMetaValues($meta, $values) { $lookupField = 'meta.id'; if (!is_numeric($meta)) { $lookupField = 'meta.name'; $meta = str_replace('_', ' ', $meta); } $whereGroup = new Ajde_Filter_WhereGroup(); foreach ($values as $value) { $metaWhereGroup = new Ajde_Filter_WhereGroup(Ajde_Query::OP_OR); $metaWhereGroup->addFilter(new Ajde_Filter_Where($lookupField, Ajde_Filter::FILTER_EQUALS, $meta)); $metaWhereGroup->addFilter(new Ajde_Filter_Where('node_meta.value', Ajde_Filter::FILTER_EQUALS, $value)); $whereGroup->addFilter($metaWhereGroup); } $this->addFilter($whereGroup); $this->joinMeta(); return $this; }
public function getMetaFields($crossReferenceTable, $crossReferenceField, $sortField, $parentField, $filters = []) { $allFields = []; $metas = new MetaCollection(); $metas->concatCrossReference($crossReferenceTable, $crossReferenceField); $metas->concatField($crossReferenceTable, $sortField); if (!empty($filters)) { $group = new Ajde_Filter_WhereGroup(); foreach ($filters as $filter) { if ($filter instanceof Ajde_Filter_Where) { $group->addFilter($filter); } else { $metas->addFilter($filter); } } $metas->addFilter($group); } foreach ($metas as $meta) { $metaField = $this->getType($meta->get('type')); $fieldOptions = $metaField->getMetaField($meta); // add show only when foreach (explode(',', $meta->get($crossReferenceField)) as $parentValue) { $fieldOptions->addShowOnlyWhen($parentField, $parentValue); } // add sorting foreach (explode(',', $meta->get($sortField)) as $parentValue) { $fieldOptions->addDynamicSort($parentField, $parentValue); } $allFields['meta_' . $meta->getPK()] = $fieldOptions; } return $allFields; }
public function getChildren() { if ($this->hasCrossReferenceTable()) { $childPk = $this->getModel()->getTable()->getPK(); $parent = (string) $this->getCrud()->getModel()->getTable(); $parentId = $this->getCrud()->getModel()->getPK(); $crossReferenceTable = $this->getCrossReferenceTable(); $childField = $this->has('childField') ? $this->get('childField') : $this->getModelName(); // TODO: implement $this->getAdvancedFilter() filters in subquery $collection = $this->getCollection(); $collection->reset(); //$subQuery = new Ajde_Db_Function('(SELECT ' . $this->getModelName() . ' FROM ' . $crossReferenceTable . ' WHERE ' . $parent . ' = ' . (integer) $parentId . $orderBy . ')'); //$collection->addFilter(new Ajde_Filter_Where($childPk, Ajde_Filter::FILTER_IN, $subQuery)); $collection->getQuery()->addSelect($crossReferenceTable . '.id AS crossId'); $collection->addFilter(new Ajde_Filter_Join($crossReferenceTable, $crossReferenceTable . '.' . $childField, $this->getModelName() . '.' . $childPk)); $collection->addFilter(new Ajde_Filter_Where($crossReferenceTable . '.' . $parent, Ajde_Filter::FILTER_EQUALS, (int) $parentId)); if ($this->getSortField()) { $collection->orderBy($crossReferenceTable . '.' . $this->getSortField()); } if ($this->hasCrossRefConstraints()) { $constraints = $this->getCrossRefConstraints(); $group = new Ajde_Filter_WhereGroup(); foreach ($constraints as $k => $v) { $group->addFilter(new Ajde_Filter_Where($k, Ajde_Filter::FILTER_EQUALS, $v)); } $collection->addFilter($group); } // echo $collection->getEmulatedSql(); } else { $collection = $this->getCollection(); $collection->addFilter(new Ajde_Filter_Where($this->getParentName(), Ajde_Filter::FILTER_EQUALS, (string) $this->_crud->getModel())); if ($this->hasAdvancedFilter()) { $filters = $this->getAdvancedFilter(); $group = new Ajde_Filter_WhereGroup(); foreach ($filters as $filter) { if ($filter instanceof Ajde_Filter_Where) { $group->addFilter($filter); } else { $this->getCollection()->addFilter($filter); } } $collection->addFilter($group); } if ($this->getSortField()) { $collection->orderBy($this->getSortField()); } // echo $collection->getEmulatedSql(); } return $collection; }
public function addTextFilter($text) { $searchFilter = new Ajde_Filter_WhereGroup(); $fieldOptions = $this->getTable()->getFieldProperties(); foreach ($fieldOptions as $fieldName => $fieldProperties) { switch ($fieldProperties['type']) { case Ajde_Db::FIELD_TYPE_TEXT: case Ajde_Db::FIELD_TYPE_ENUM: $searchFilter->addFilter(new Ajde_Filter_Where($fieldName, Ajde_Filter::FILTER_LIKE, '%' . $text . '%', Ajde_Query::OP_OR)); break; default: break; } } $this->addFilter($searchFilter); }