/** * Apply the condition to the given collection by way of the resource specified on instantiation * * @param \Cm_Mongo_Model_Resource_Collection_Abstract $collection * @param \Mage_Adminhtml_Block_Widget_Grid_Column $column */ public function apply(Cm_Mongo_Model_Resource_Collection_Abstract $collection, Mage_Adminhtml_Block_Widget_Grid_Column $column) { if (is_string($this->_resource)) { $filterCollection = Mage::getResourceModel($this->_resource); } else { $filterCollection = $this->_resource; } var_dump($filterCollection); if ($this->_filters) { $filterCollection->addFieldToFilter($this->_filters); } $field = $column->getFilterIndex() ? $column->getFilterIndex() : $column->getIndex(); $cond = $column->getFilter()->getCondition(); if ($field && isset($cond)) { $filterCollection->addFieldToFilter($field, $cond); } $collection->addFieldToFilter($this->_field, '$in', $filterCollection->getAllIds(TRUE)); }
/** * Applies a filter to the given collection based on this collection's field values. * * @param string $field * @param Cm_Mongo_Model_Resource_Collection_Abstract $collection * @throws Exception * @return Cm_Mongo_Model_Resource_Collection_Abstract */ public function applyReferencedCollectionFilter($field, $collection) { $ids = array(); // Get all ids for the given field switch ((string) $this->getResource()->getFieldType($field)) { case 'reference': foreach ($this->getItems() as $item) { if ($ref = $item->getData($field)) { $ids[] = $ref; } } break; // Get unique set of ids from field // Get unique set of ids from field case 'referenceSet': foreach ($this->getItems() as $item) { if ($refSet = $item->getData($field)) { foreach ($refSet as $ref) { $ids[] = $ref; } } } break; case 'referenceHash': $idField = (string) $this->getResource()->getFieldMapping($field)->id_field; if (!$idField) { throw new Exception("Field definition for {$field} is missing 'id_field' definition."); } foreach ($this->getItems() as $item) { if ($refSet = $item->getData($field)) { foreach ($refSet as $ref) { if (!empty($ref[$idField])) { $ids[] = $ref[$idField]; } } } } default: throw new Exception("Cannot get referenced collection for field '{$field}'."); } // array_unique is slow, but required for compatibility with MongoId and possibly other id data types $ids = array_unique($ids); // Instantiate a collection filtered to the referenced objects using $in $collection->addFieldToFilter('_id', '$in', array_values($ids)); return $this; }
/** * @param Cm_Mongo_Model_Resource_Collection_Abstract $collection * @param array $filters */ protected function _addFilters(Cm_Mongo_Model_Resource_Collection_Abstract $collection, array $filters) { foreach ($filters as $filter) { $field = $filter['field']; $filterType = isset($filter['type']) ? $filter['type'] : self::FILTER_TYPE_STRING; switch ($filterType) { case self::FILTER_TYPE_BOOLEAN: $value = (bool) $filter['value']; break; case self::FILTER_TYPE_INTEGER: $value = intval($filter['value']); break; case self::FILTER_TYPE_ARRAY: $value = explode(',', $filter['value']); break; case self::FILTER_TYPE_STRING: default: $value = strval($filter['value']); break; } $condition = isset($filter['condition']) ? $filter['condition'] : 'eq'; // Add filter to collection $collection->addFieldToFilter($field, $condition, $value); } }