00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 class Mage_CatalogSearch_Model_Mysql4_Advanced_Collection extends Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection
00028 {
00029 public function addFieldsToFilter($fields)
00030 {
00031 if ($fields) {
00032
00033 $previousSelect = null;
00034 foreach ($fields as $table => $conditions) {
00035 foreach ($conditions as $attributeId => $conditionValue) {
00036 $bindVarName = 'attribute_'.$attributeId;
00037 $select = $this->getConnection()->select();
00038 $select->from(array('t1' => $table), 'entity_id');
00039 $conditionData = array();
00040
00041 if (is_array($conditionValue)) {
00042 if (isset($conditionValue['in'])){
00043 $conditionData[] = array('IN (?)', $conditionValue['in']);
00044 }
00045 elseif (isset($conditionValue['in_set'])) {
00046 $conditionData[] = array('REGEXP \'(^|,)('.join('|', $conditionValue['in_set']).')(,|$)\'', $conditionValue['in_set']);
00047 }
00048 elseif (isset($conditionValue['like'])) {
00049 $this->addBindParam($bindVarName, $conditionValue['like']);
00050 $conditionData[] = 'LIKE :'.$bindVarName;
00051 }
00052 elseif (isset($conditionValue['from']) && isset($conditionValue['to'])) {
00053 if ($conditionValue['from']) {
00054 if (!is_numeric($conditionValue['from'])){
00055 $conditionValue['from'] = date("Y-m-d H:i:s", strtotime($conditionValue['from']));
00056 }
00057 $conditionData[] = array('>= ?', $conditionValue['from']);
00058 }
00059 if ($conditionValue['to']) {
00060 if (!is_numeric($conditionValue['to'])){
00061 $conditionValue['to'] = date("Y-m-d H:i:s", strtotime($conditionValue['to']));
00062 }
00063 $conditionData[] = array('<= ?', $conditionValue['to']);
00064 }
00065 }
00066 } else {
00067 $conditionData[] = array('= ?', $conditionValue);
00068 }
00069
00070 if (!is_numeric($attributeId)) {
00071 foreach ($conditionData as $data) {
00072 if (is_array($data)) {
00073 $select->where('t1.'.$attributeId . ' ' . $data[0], $data[1]);
00074 }
00075 else {
00076 $select->where('t1.'.$attributeId . ' ' . $data);
00077 }
00078 }
00079 }
00080 else {
00081 $storeId = $this->getStoreId();
00082 $select->joinLeft(
00083 array('t2' => $table),
00084 $this->getConnection()->quoteInto('t1.entity_id = t2.entity_id AND t1.attribute_id = t2.attribute_id AND t2.store_id=?', $storeId),
00085 array()
00086 );
00087 $select->where('t1.store_id = ?', 0);
00088 $select->where('t1.attribute_id = ?', $attributeId);
00089
00090 foreach ($conditionData as $data) {
00091 if (is_array($data)) {
00092 $select->where('IFNULL(t2.value, t1.value) ' . $data[0], $data[1]);
00093 }
00094 else {
00095 $select->where('IFNULL(t2.value, t1.value) ' . $data);
00096 }
00097 }
00098 }
00099
00100 if (!is_null($previousSelect)) {
00101 $select->where('t1.entity_id IN(?)', new Zend_Db_Expr($previousSelect));
00102 }
00103 $previousSelect = $select;
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 }
00119
00120
00121
00122
00123
00124
00125
00126 $this->addFieldToFilter('entity_id', array('in' => new Zend_Db_Expr($select)));
00127 }
00128
00129 return $this;
00130 }
00131 }