[Помогите] Конфликт модуля BOS и simon filters

Тема в разделе "OpenCart", создана пользователем noobie, 13 янв 2014.

  1. noobie

    noobie

    Регистрация:
    27 мар 2013
    Сообщения:
    174
    Симпатии:
    22
    Вообщем такая ситуация.
    После обновления модуля 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_prefixpov.weight FROM " . DB_PREFIX . "product_option_relation por LEFT JOIN " . DB_PREFIX . "product_option_value pov ON (por.product_id pov.product_idWHERE 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_replacestrrpos($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_replacestrrpos($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>

    Вопрос собственно простой. Куда копать и что делать?
    Я так понимаю что они некорректно правят одно и то же место. Но где именно и почему?
     
    Последнее редактирование: 13 янв 2014
  2. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    18
    Симпатии:
    1
    перед это строчкой if( $this->model_catalog_simonfilters->isActive() == TRUE){
    вставь print_r($this->model_catalog_simonfilters); die();
     
  3. noobie

    noobie

    Регистрация:
    27 мар 2013
    Сообщения:
    174
    Симпатии:
    22
    Пустая страница.
    Если написать без die();
    То выводит ту же ошибку что и сразу но на строку 156 уже.
     
  4. web2us

    web2us

    Регистрация:
    10 мар 2013
    Сообщения:
    18
    Симпатии:
    1
    вывод такой, модель $this->model_catalog_simonfilters пустая, не подгружается... значит косяк в этом... найди теперь почему
     
  5. noobie

    noobie

    Регистрация:
    27 мар 2013
    Сообщения:
    174
    Симпатии:
    22
    Так в этом собственно и состоит вопрос. Как найти почему? Где искать то?

    Методом научного тыка обнаружил что сбой идет из-за этого участка

    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?
     
    Последнее редактирование: 13 янв 2014
  6. noobie

    noobie

    Регистрация:
    27 мар 2013
    Сообщения:
    174
    Симпатии:
    22
    Вообщем причина сбоя была в этом участке 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);
            

    Если кто объяснит зачем нужен этот участок кода буду благодарен.
     
    Последнее редактирование: 13 янв 2014
  7. nix

    nix php, MySQL, UNIX, MikroTik ROSAPI

    Регистрация:
    16 янв 2013
    Сообщения:
    1.000
    Симпатии:
    890
    Проверяет был ли обявлен клас
    тут пишет
    можите попробовать такой вариант замены
    PHP:
            <operation>
                <
    search position="before"><![CDATA[
                    
    $this->registry->set('model_' str_replace('/''_'$model), new $class($this->registry));
                ]]></
    search>
                <
    add><![CDATA[
                    if (!
    class_exists($classfalse))) {
                ]]></
    add>
            </
    operation>
            <
    operation>
                <
    search position="after"><![CDATA[
                    
    $this->registry->set('model_' str_replace('/''_'$model), new $class($this->registry));
                ]]></
    search>
                <
    add><![CDATA[
                    }
                ]]></
    add>
            </
    operation>
     
    Последнее редактирование: 13 янв 2014
  8. noobie

    noobie

    Регистрация:
    27 мар 2013
    Сообщения:
    174
    Симпатии:
    22
    Спасибо. Хотя если это только проверка то наверное и без нее нормально будет. Зачем отдельному модулю ставить такую глобальную проверку неясно. Ну главное что заработало :Smile: