public function __construct(LiveCart $application, ARSelectFilter $filter, $modelClass = false, $columnTypes = array()) { $this->application = $application; $this->modelClass = $modelClass; $this->filter = $filter; $this->columnTypes = $columnTypes; $request = $this->application->getRequest(); // set recordset boundaries (limits) $filter->setLimit($request->get('page_size', 10), $request->get('offset', 0)); // set order if ($request->isValueSet('sort_col')) { $handle = $this->getFieldHandle($request->get('sort_col'), self::SORT_HANDLE); if ($handle) { $filter->setOrder($handle, $request->get('sort_dir')); } } // apply filters $filters = $request->get('filters'); if (!is_array($filters)) { $filters = (array) json_decode($request->get('filters')); } $conds = array(); if ($filter->getCondition()) { $conds[] = $filter->getCondition(); } foreach ($filters as $field => $value) { if (!strlen($value)) { continue; } $value = urldecode($value); $handle = $this->getFieldHandle($field, self::FILTER_HANDLE); if ($handle instanceof EavFieldCommon) { continue; } else { if (!is_array($handle) && !is_null($handle) && !$handle instanceof ARExpressionHandle) { $fieldInst = $this->getFieldInstance($field); if ($fieldInst && ($fieldInst->getDataType() instanceof ARNumeric || $handle->getField()->getDataType() instanceof ARNumeric)) { $value = preg_replace('/[ ]{2,}/', ' ', $value); $constraints = $fieldInst->getDataType() instanceof ARNumeric ? explode(' ', $value) : array($value); foreach ($constraints as $c) { list($operator, $value) = $this->parseOperatorAndValue($c); if (!is_numeric($value) && $fieldInst->getDataType() instanceof ARNumeric) { continue; } $conds[] = new OperatorCond($handle, $value, $operator); } } else { if ($fieldInst && $fieldInst->getDataType() instanceof ARPeriod) { if (substr($value, 0, 10) == 'daterange ') { $value = str_replace('daterange ', '', $value); list($from, $to) = explode('|', $value); $from = trim($from); $to = trim($to); // convert // 2010-9-1 to 2010-09-01 ( +first or last minute of day) // unset dates to 'inf' (meaning ingnore condition) if ($from == '') { $from = 'inf'; } else { list($y, $m, $d) = explode('-', $from); $from = $y . '-' . str_pad($m, 2, '0', STR_PAD_LEFT) . '-' . str_pad($d, 2, '0', STR_PAD_LEFT) . ' 00:00:00'; } if ($to == '') { $to = 'inf'; } else { list($y, $m, $d) = explode('-', $to); $to = $y . '-' . str_pad($m, 2, '0', STR_PAD_LEFT) . '-' . str_pad($d, 2, '0', STR_PAD_LEFT) . ' 23:59:59'; } } else { list($from, $to) = explode(' | ', $value); } $cond = null; // from condition if ('inf' != $from) { $cond = new EqualsOrMoreCond($handle, getDateFromString($from)); } // to condition if ('now' != $to && 'inf' != $to) { $condTo = new EqualsOrLessCond($handle, getDateFromString($to)); if ($cond) { $cond->addAnd($condTo); } else { $cond = $condTo; } } if ($cond) { $conds[] = $cond; } } else { $conds[] = new LikeCond($handle, '%' . $value . '%'); } } } else { if (is_array($handle)) { $cond = null; foreach ($handle as $h) { $c = new LikeCond($h, '%' . $value . '%'); if (!$cond) { $cond = $c; } else { $cond->addOR($c); } } $conds[] = $cond; } else { if (array_key_exists($field, $this->columnTypes)) { $type = $this->columnTypes[$field]['type']; } else { $type = null; } $value = preg_replace('/[ ]{2,}/', ' ', $value); switch ($type) { case 'numeric': $constraints = explode(' ', $value); foreach ($constraints as $c) { list($operator, $value) = $this->parseOperatorAndValue($c); if (!is_numeric($value)) { continue; } $having[] = new OperatorCond($handle, $value, $operator); } break; default: $having[] = eq(new ARExpressionHandle($field), $value); } } } } } // apply IDs to filter if ($request->get('selectedIDs') || $request->get('isInverse')) { $selectedIDs = json_decode($request->get('selectedIDs')); if ($selectedIDs) { if ((bool) $request->get('isInverse')) { $idcond = new NotINCond(new ARFieldHandle($modelClass, 'ID'), $selectedIDs); } else { $idcond = new INCond(new ARFieldHandle($modelClass, 'ID'), $selectedIDs); } $conds[] = $idcond; } else { if (!(bool) $request->get('isInverse')) { $idcond = new EqualsCond(new ARExpressionHandle(1), 2); $conds[] = $idcond; } } } if ($conds) { $filter->setCondition(new AndChainCondition($conds)); } if (!empty($having)) { $filter->setHavingCondition(new AndChainCondition($having)); } }