Вообщем такая ситуация. После обновления модуля BackendOrderSystem до версии 2.2.7 и выше на страницах где установлен и активен (категории) simon filter вместо отображения страницы начала появляться такая ошибка Fatal error: Call to a member function isActive() on a non-object in /home/сайт/сайт/www/vqmod/vqcache/vq2-catalog_model_catalog_product.php on line 155 Строка 155 выглядит вот так (выделил жирным) if( $this->model_catalog_simonfilters->isActive() == TRUE){ PHP: public function getProducts($data = array()) { /* * simonfilters - 2.12.0 Build 0001 Code START * operation #2: add model and cache modifier to getProducts */ $this->load->model('catalog/simonfilters'); if( $this->model_catalog_simonfilters->isActive() == TRUE){ $data['simonfilters']=$this->model_catalog_simonfilters->getSimonAttributesCacheData(); $data['filter_sub_category'] = true; } /* * simonfilters - 2.12.0 Build 0001 Code END */ Часть vqmod xml файла модуля BOS которое имеет отношение к catalog/product.php PHP: <file name="catalog/model/catalog/product.php"> <operation> <search position="after"><![CDATA[ public function getProduct($product_id) { ]]></search> <add><![CDATA[ if (isset($this->session->data['store_id'])) { $store_id = $this->session->data['store_id']; } else { $store_id = $this->config->get('config_store_id'); } if (isset($this->session->data['customer_info']) && $this->config->get('config_disabled_products')) { $status_query = 0; } else { $status_query = 1; } ]]></add> </operation> <operation> <search position="replace" index="1"><![CDATA[ AND p2s.store_id = '" . (int)$this->config->get('config_store_id') ]]></search> <add><![CDATA[ AND p2s.store_id = '" . (int)$store_id ]]></add> </operation> <operation> <search position="replace" index="1"><![CDATA[ AND p.status = '1' ]]></search> <add><![CDATA[ AND p.status >= '" . $status_query . "' ]]></add> </operation> <operation> <search position="before"><![CDATA[ public function getProduct($product_id) { ]]></search> <add><![CDATA[ public function hasOptions($product_id) { $query = $this->db->query("SELECT has_option FROM " . DB_PREFIX . "product WHERE product_id = '" . (int)$product_id . "'"); return $query->row['has_option']; } public function getOptionRelations($product_id, $product_option_value_id) { $return_data = array(); $query = $this->db->query("SELECT por.*, pov.weight_prefix, pov.weight FROM " . DB_PREFIX . "product_option_relation por LEFT JOIN " . DB_PREFIX . "product_option_value pov ON (por.product_id = pov.product_id) WHERE por.product_id = '" . (int)$product_id . "' AND por.subtract = '1' AND pov.product_option_value_id = '" . (int)$product_option_value_id . "'"); if ($query->num_rows) { $stock = 0; foreach ($query->rows as $row) { $optionTmp = array(); $optionTmp = explode(":", $row['var']); if (in_array($product_option_value_id, $optionTmp)) { $stock += $row['stock']; } } if ($query->row['weight_prefix'] == "+") { $weight = $query->row['weight']; } else { $weight = -$query->row['weight']; } $return_data = array( 'sku' => $query->row['sku'], 'stock' => $stock, 'price' => $query->row['price'], 'weight' => $weight ); } else { $return_data = array( 'sku' => '', 'stock' => 0, 'price' => 0.00, 'weight' => 0 ); } return $return_data; } public function getOptionDefault($product_option_value_id) { $return_data = array(); $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value WHERE product_option_value_id = '" . (int)$product_option_value_id . "' AND subtract = '1'"); if ($query->num_rows) { if ($query->row['weight_prefix'] == "+") { $weight = $query->row['weight']; } else { $weight = -$query->row['weight']; } $return_data = array( 'stock' => $query->row['quantity'], 'prefix' => $query->row['price_prefix'], 'price' => $query->row['price'], 'weight' => $weight ); } return $return_data; } ]]></add> </operation> </file> Часть vqmod xml файла симон фильтра PHP: #################################################################################################### # # catalog/model/catalog/product.php # #################################################################################################### --> <file name="catalog/model/catalog/product.php"> <operation> <search position="after"><![CDATA[public function getProducts($data = array()) {]]></search> <add><![CDATA[ /* * simonfilters - 2.12.0 Build 0001 Code START * operation #2: add model and cache modifier to getProducts */ $this->load->model('catalog/simonfilters'); if( $this->model_catalog_simonfilters->isActive() ){ $data['simonfilters']=$this->model_catalog_simonfilters->getSimonAttributesCacheData(); $data['filter_sub_category'] = true; } /* * simonfilters - 2.12.0 Build 0001 Code END */ ]]> </add> </operation> <operation> <search position="after"><![CDATA[public function getTotalProducts($data = array()) {]]></search> <add><![CDATA[ /* * simonfilters - 2.12.0 Build 0001 Code START * operation #2a: add model and cache modifier to getProducts */ $this->load->model('catalog/simonfilters'); if( $this->model_catalog_simonfilters->isActive() ){ $data['simonfilters']=$this->model_catalog_simonfilters->getSimonAttributesCacheData(); $data['filter_sub_category'] = true; } /* * simonfilters - 2.12.0 Build 0001 Code END */ ]]> </add> </operation> <operation> <search position="before"><![CDATA[$query = $this->db->query($sql);]]></search> <add><![CDATA[ /* * simonfilters - 2.12.0 Build 0001 Code START * operation #3: add model and query modifier to 'getTotalProducts','getProducts' and 'getProductSpecials' */ if(in_array(__FUNCTION__,array('getTotalProducts','getProducts','getProductSpecials'))){ if(!in_array(__FUNCTION__,array('getProducts'))){ $this->load->model('catalog/simonfilters'); } if( $this->model_catalog_simonfilters->isActive() ){ $SimonAttributes = $this->model_catalog_simonfilters->getSimonAttributes(); $simonJoin = ""; if(version_compare(VERSION, '1.5.1.2', '<=')) { $simonNthAri = array( 'getTotalProducts' => 1, 'getProducts' => 2, 'getProductSpecials' => 0 ); $simonnth = $simonNthAri[__FUNCTION__]; if($simonnth>0){ $simon_replace= "\n#simonStart\n". $simonJoin." ".$SimonAttributes['options']."\n#simonEnd\n WHERE \n#simonStart\n". $SimonAttributes['default'] ."\n#simonEnd\n"; $sql = $this->model_catalog_simonfilters->replaceNth($simonnth,"WHERE",$simon_replace,$sql); } }else if(version_compare(VERSION, '1.5.5.1', '<')) { $simonJoin = (!preg_match('/product_special/',$sql))?" LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) ":""; $simon_replace= $simonJoin." ".$SimonAttributes['options']." WHERE ". $SimonAttributes['default']; $sql = substr_replace($sql, $simon_replace, strrpos($sql, "WHERE"), strlen("WHERE")); }else{ $simonJoin = (__FUNCTION__!='getProductSpecials' && !preg_match('/LEFT JOIN.*product_special/',$sql))?" LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) ":""; $simon_replace= $simonJoin." ".$SimonAttributes['options']." WHERE ". $SimonAttributes['default']; $sql = substr_replace($sql, $simon_replace, strrpos($sql, "WHERE"), strlen("WHERE")); } $this->model_catalog_simonfilters->debug(__FILE__ . ';' . __LINE__, 'FINAL:', $sql); } } #if(in_array(__FUNCTION__,array('getProducts'))){echo __FUNCTION__."<br>".nl2br($sql)."<hr>";} /* * simonfilters - 2.12.0 Build 0001 Code End */ ]]> </add> </operation> </file> Вопрос собственно простой. Куда копать и что делать? Я так понимаю что они некорректно правят одно и то же место. Но где именно и почему?
перед это строчкой if( $this->model_catalog_simonfilters->isActive() == TRUE){ вставь print_r($this->model_catalog_simonfilters); die();
вывод такой, модель $this->model_catalog_simonfilters пустая, не подгружается... значит косяк в этом... найди теперь почему
Так в этом собственно и состоит вопрос. Как найти почему? Где искать то? Методом научного тыка обнаружил что сбой идет из-за этого участка PHP: <file name="system/engine/loader.php"> <operation> <search position="before" offset="2"><![CDATA[ $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); ]]></search> <add><![CDATA[ if (!class_exists($class)) { ]]></add> </operation> <operation> <search position="after"><![CDATA[ $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); ]]></search> <add><![CDATA[ } ]]></add> </operation> <operation> <search position="replace"><![CDATA[ $file = DIR_APPLICATION . 'model/' . $model . '.php'; ]]></search> <add><![CDATA[ if (isset($this->session->data['catalog_model']) && defined('DIR_CATALOG')) { $file = DIR_CATALOG . 'model/' . $model . '.php'; if (!file_exists($file)) { return; } } else { $file = DIR_APPLICATION . 'model/' . $model . '.php'; if (!file_exists($file)) { return; } } ]]></add> </operation> </file> Т.е. когда я его убираю то simon filter работает но в модуле BOS некорректно обрабатываются некоторые функции (при нажатии на редактирование заказа показывает заказ как будто он пустой). Кто может пояснить что за что отвечает сей участок кода в OC?
Вообщем причина сбоя была в этом участке xml BOS при удалении его все вроде работает. PHP: <operation> <search position="before" offset="2"><![CDATA[ $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); ]]></search> <add><![CDATA[ if (!class_exists($class)) { ]]></add> </operation> <operation> <search position="after"><![CDATA[ $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); ]]></search> <add><![CDATA[ } ]]></add> </operation> Или же как это выглядит в файле engine/loader.php жирным отметил различия. PHP: global $vqmod; $file = $vqmod->modCheck($file); if (file_exists($file)) { if (!class_exists($class)) { include_once($file); $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); } } else { trigger_error('Error: Could not load model ' . $model . '!'); exit(); } } public function database($driver, $hostname, $username, $password, $database, $prefix = NULL, $charset = 'UTF8') { $file = DIR_SYSTEM . 'database/' . $driver . '.php'; $class = 'Database' . preg_replace('/[^a-zA-Z0-9]/', '', $driver); Если кто объяснит зачем нужен этот участок кода буду благодарен.
Проверяет был ли обявлен клас тут пишет можите попробовать такой вариант замены PHP: <operation> <search position="before"><![CDATA[ $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); ]]></search> <add><![CDATA[ if (!class_exists($class, false))) { ]]></add> </operation> <operation> <search position="after"><![CDATA[ $this->registry->set('model_' . str_replace('/', '_', $model), new $class($this->registry)); ]]></search> <add><![CDATA[ } ]]></add> </operation>
Спасибо. Хотя если это только проверка то наверное и без нее нормально будет. Зачем отдельному модулю ставить такую глобальную проверку неясно. Ну главное что заработало