搜索
开启辅助访问 切换到宽版

QQ登录

只需一步,快速开始

扫一扫,访问微社区

注册 找回密码
查看: 8166|回复: 4

OpenCart搜索引擎增强小程序(1.46通过)

  [复制链接]
发表于 2011-1-27 14:31:55 | 显示全部楼层 |阅读模式
假如一个产品的标题是 AA BB CC,那么正常情况下需要搜索AA, AA BB 或者BB CC(从左到右的顺序)如果顺序不对则搜索不出来

不过稍作改动我们就可以无视顺序的使用搜索了

使用DREAMWEAVER新建文件,写入以下代码后保存为"product.php",将该文件上传至catalog/model/catalog/替换源文件就OK,这时你搜索CC AA一样也可以得出想要的结果了

<?php
class ModelCatalogProduct extends Model {
public function getProduct($product_id) {
  $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");

  return $query->row;
}
public function getProducts() {
  $query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, wcd.unit AS weight_class FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "weight_class_description wcd ON (p.weight_class_id = wcd.weight_class_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");

  return $query->rows;
}

public function getProductsByCategoryId($category_id, $sort = 'pd.name', $order = 'ASC', $start = 0, $limit = 20) {
  $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "
'";
  
  $sort_data = array(
   'pd.name',
   'p.price',
   'rating'
  );
   
  if (in_array($sort, $sort_data)) {
   $sql .= " ORDER BY " . $sort;
  } else {
   $sql .= " ORDER BY pd.name";
  }
   
  if ($order == 'DESC') {
   $sql .= " DESC";
  } else {
   $sql .= " ASC";
  }
  
  if ($start < 0) {
   $start = 0;
  }
  
  $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
  
  $query = $this->db->query($sql);
         
  return $query->rows;
}

public function getTotalProductsByCategoryId($category_id = 0) {
  $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND p2c.category_id = '" . (int)$category_id . "'");
  return $query->row['total'];
}
public function getProductsByManufacturerId($manufacturer_id, $sort = 'pd.name', $order = 'ASC', $start = 0, $limit = 20) {
  $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND m.manufacturer_id = '" . (int)$manufacturer_id. "'";
  $sort_data = array(
   'pd.name',
   'p.price',
   'rating'
  );
   
  if (in_array($sort, $sort_data)) {
   $sql .= " ORDER BY " . $sort;
  } else {
   $sql .= " ORDER BY pd.name";
  }
   
  if ($order == 'DESC') {
   $sql .= " DESC";
  } else {
   $sql .= " ASC";
  }
  if ($start < 0) {
   $start = 0;
  }
  
  $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
  
  $query = $this->db->query($sql);
  
  return $query->rows;
}
public function getTotalProductsByManufacturerId($manufacturer_id = 0) {
  $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product WHERE status = '1' AND date_available <= NOW() AND manufacturer_id = '" . (int)$manufacturer_id . "'");
  
  return $query->row['total'];
}

public function getProductsByKeyword($keyword, $category_id = 0, $description = FALSE, $sort = 'pd.name', $order = 'ASC', $start = 0, $limit = 20) {
  if ($keyword) {
   $keywords = preg_split("/[\s,]*\\"([^\\"]+)\\"[\s,]*|" . "[\s,]*'([^']+)'[\s,]*|" . "[\s,]+/", $keyword, 0, PREG_SPLIT_NO_EMPTY);
   $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "'";
   
   if (!$description) {
     foreach ( $keywords as $keywd => $kw ) {
    $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.model) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.sku) LIKE '%" . $this->db->escape(strtolower($kw)) . "%')";
     }
   } else {
     foreach ( $keywords as $keywd => $kw ) {
    $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.model) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.sku) LIKE '%" . $this->db->escape(strtolower($kw)) . "%')";
     }
   }
   
   if ($category_id) {
    $data = array();
   
    $this->load->model('catalog/category');
   
    $string = rtrim($this->getPath($category_id), ',');
   
    foreach (explode(',', $string) as $category_id) {
     $data[] = "category_id = '" . (int)$category_id . "'";
    }
   
    $sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE " . implode(" OR ", $data) . ")";
   }
  
   $sql .= " AND p.status = '1' AND p.date_available <= NOW() GROUP BY p.product_id";
  
   $sort_data = array(
    'pd.name',
    'p.price',
    'rating'
   );
   
   if (in_array($sort, $sort_data)) {
    $sql .= " ORDER BY " . $sort;
   } else {
    $sql .= " ORDER BY pd.name";
   }
   
   if ($order == 'DESC') {
    $sql .= " DESC";
   } else {
    $sql .= " ASC";
   }
   if ($start < 0) {
    $start = 0;
   }
  
   $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
   $query = $this->db->query($sql);
  
   return $query->rows;
  } else {
   return 0;
  }
}

public function getTotalProductsByKeyword($keyword, $category_id = 0, $description = FALSE) {
  if ($keyword) {
   $keywords = preg_split("/[\s,]*\\"([^\\"]+)\\"[\s,]*|" . "[\s,]*'([^']+)'[\s,]*|" . "[\s,]+/", $keyword, 0, PREG_SPLIT_NO_EMPTY);
   $sql = "SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
   
   if (!$description) {
     foreach ( $keywords as $keywd => $kw ) {
    $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.model) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.sku) LIKE '%" . $this->db->escape(strtolower($kw)) . "%')";
     }
   } else {
     foreach ( $keywords as $keywd => $kw ) {
    $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.model) LIKE '%" . $this->db->escape(strtolower($kw)) . "%' OR LCASE(p.sku) LIKE '%" . $this->db->escape(strtolower($kw)) . "%')";
     }
   }
   if ($category_id) {
    $data = array();
   
    $this->load->model('catalog/category');
   
    $string = rtrim($this->getPath($category_id), ',');
   
    foreach (explode(',', $string) as $category_id) {
     $data[] = "category_id = '" . (int)$category_id . "'";
    }
   
    $sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_category WHERE " . implode(" OR ", $data) . ")";
   }
   
   $sql .= " AND p.status = '1' AND p.date_available <= NOW() GROUP BY p.product_id";
   
   $query = $this->db->query($sql);
  
   if ($query->num_rows) {
    return $query->row['total'];
   } else {
    return 0;
   }
  } else {
   return 0;
  }  
}

public function getPath($category_id) {
  $string = $category_id . ',';
  
  $results = $this->model_catalog_category->getCategories($category_id);
  foreach ($results as $result) {
   $string .= $this->getPath($result['category_id']);
  }
  
  return $string;
}

public function getLatestProducts($limit) {
  $product_data = $this->cache->get('product.latest.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
  if (!$product_data) {
//   $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY p.date_added DESC LIMIT " . (int)$limit);
   $query = $this->db->query("SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' ORDER BY p.location ASC LIMIT " . (int)$limit);
   
   $product_data = $query->rows;
   $this->cache->set('product.latest.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data);
  }
  
  return $product_data;
}
public function getBestSellerProducts($limit) {
  $product_data = $this->cache->get('product.bestseller.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit);
  if (!$product_data) {
   $product_data = array();
   
   $query = $this->db->query("SELECT op.product_id, SUM(op.quantity) AS total FROM " . DB_PREFIX . "order_product op LEFT JOIN `" . DB_PREFIX . "order` o ON (op.order_id = o.order_id) WHERE o.order_status_id > '0' GROUP BY op.product_id ORDER BY total DESC LIMIT " . (int)$limit);
   
   foreach ($query->rows as $result) {
    $product_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.product_id = '" . (int)$result['product_id'] . "' AND p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
   
    if ($product_query->num_rows) {
     $product_data[] = $product_query->row;
    }
   }
   $this->cache->set('product.bestseller.' . $this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . $limit, $product_data);
  }
  
  return $product_data;
}
  
public function updateViewed($product_id) {
  $this->db->query("UPDATE " . DB_PREFIX . "product SET viewed = viewed + 1 WHERE product_id = '" . (int)$product_id . "'");
}

public function getProductOptions($product_id) {
  $product_option_data = array();
  
  $product_option_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option WHERE product_id = '" . (int)$product_id . "' ORDER BY sort_order");
  
  foreach ($product_option_query->rows as $product_option) {
   $product_option_value_data = array();
   
   $product_option_value_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value WHERE product_option_id = '" . (int)$product_option['product_option_id'] . "' ORDER BY sort_order");
   
   foreach ($product_option_value_query->rows as $product_option_value) {
    $product_option_value_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_value_description WHERE product_option_value_id = '" . (int)$product_option_value['product_option_value_id'] . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
   
    $product_option_value_data[] = array(
     'product_option_value_id' => $product_option_value['product_option_value_id'],
     'name'                    => $product_option_value_description_query->row['name'],
           'price'                   => $product_option_value['price'],
           'prefix'                  => $product_option_value['prefix']
    );
   }
      
   $product_option_description_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_option_description WHERE product_option_id = '" . (int)$product_option['product_option_id'] . "' AND language_id = '" . (int)$this->config->get('config_language_id') . "'");
      
        $product_option_data[] = array(
         'product_option_id' => $product_option['product_option_id'],
    'name'              => $product_option_description_query->row['name'],
    'option_value'      => $product_option_value_data,
    'sort_order'        => $product_option['sort_order']
        );
      }
  
  return $product_option_data;
}

public function getProductImages($product_id) {
  $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_image WHERE product_id = '" . (int)$product_id . "'");
  return $query->rows;
}

public function getProductDiscount($product_id) {
  if ($this->customer->isLogged()) {
   $customer_group_id = $this->customer->getCustomerGroupId();
  } else {
   $customer_group_id = $this->config->get('config_customer_group_id');
  }
  
  $query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity = '1' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");
  
  if ($query->num_rows) {
   return $query->row['price'];
  } else {
   return FALSE;
  }
}
public function getProductDiscounts($product_id) {
  if ($this->customer->isLogged()) {
   $customer_group_id = $this->customer->getCustomerGroupId();
  } else {
   $customer_group_id = $this->config->get('config_customer_group_id');
  }
  
  $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_discount WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND quantity > 1 AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY quantity ASC, priority ASC, price ASC");
  return $query->rows;  
}

public function getProductSpecial($product_id) {
  if ($this->customer->isLogged()) {
   $customer_group_id = $this->customer->getCustomerGroupId();
  } else {
   $customer_group_id = $this->config->get('config_customer_group_id');
  }
  
  $query = $this->db->query("SELECT price FROM " . DB_PREFIX . "product_special WHERE product_id = '" . (int)$product_id . "' AND customer_group_id = '" . (int)$customer_group_id . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) ORDER BY priority ASC, price ASC LIMIT 1");
  
  if ($query->num_rows) {
   return $query->row['price'];
  } else {
   return FALSE;
  }
}

public function getProductSpecials($sort = 'pd.name', $order = 'ASC', $start = 0, $limit = 20) {
  if ($this->customer->isLogged()) {
   $customer_group_id = $this->customer->getCustomerGroupId();
  } else {
   $customer_group_id = $this->config->get('config_customer_group_id');
  }  
  $sql = "SELECT *, pd.name AS name, p.price, (SELECT ps2.price FROM " . DB_PREFIX . "product_special ps2 WHERE p.product_id = ps2.product_id AND ps2.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps2.date_start = '0000-00-00' OR ps2.date_start < NOW()) AND (ps2.date_end = '0000-00-00' OR ps2.date_end > NOW())) ORDER BY ps2.priority ASC, ps2.price ASC LIMIT 1) AS special, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id =
ss.stock_status_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND ps.customer_group_id = '" . (int)$customer_group_id . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW())AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) AND ps.product_id NOT IN (SELECT pd2.product_id FROM " . DB_PREFIX . "product_discount pd2 WHERE p.product_id = pd2.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW()))) GROUP BY p.product_id";
  $sort_data = array(
   'pd.name',
   'special',
   'rating'
  );
   
  if (in_array($sort, $sort_data)) {
   $sql .= " ORDER BY " . $sort;
  } else {
   $sql .= " ORDER BY pd.name";
  }
   
  if ($order == 'DESC') {
   $sql .= " DESC";
  } else {
   $sql .= " ASC";
  }
  
  if ($start < 0) {
   $start = 0;
  }
  
  $sql .= " LIMIT " . (int)$start . "," . (int)$limit;
  $query = $this->db->query($sql);
  
  return $query->rows;
}
public function getTotalProductSpecials() {
  if ($this->customer->isLogged()) {
   $customer_group_id = $this->customer->getCustomerGroupId();
  } else {
   $customer_group_id = $this->config->get('config_customer_group_id');
  }  
  
  $query = $this->db->query("SELECT COUNT(DISTINCT ps.product_id) AS total FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "product_special ps ON (p.product_id = ps.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ((ps.date_start = '0000-00-00' OR ps.date_start < NOW()) AND (ps.date_end = '0000-00-00' OR ps.date_end > NOW())) AND ps.product_id NOT IN (SELECT pd2.product_id FROM " . DB_PREFIX . "product_discount pd2 WHERE p.product_id = pd2.product_id AND pd2.customer_group_id = '" . (int)$customer_group_id . "' AND pd2.quantity = '1' AND ((pd2.date_start = '0000-00-00' OR pd2.date_start < NOW()) AND (pd2.date_end = '0000-00-00' OR pd2.date_end > NOW())))");
  
  if (isset($query->row['total'])) {
   return $query->row['total'];
  } else {
   return 0;
  }
}

public function getProductRelated($product_id) {
  $product_data = array();
  $product_related_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_related WHERE product_id = '" . (int)$product_id . "'");
  
  foreach ($product_related_query->rows as $result) {
   $product_query = $this->db->query("SELECT DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) WHERE p.product_id = '" . (int)$result['related_id'] . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.date_available <= NOW() AND p.status = '1'");
   
   if ($product_query->num_rows) {
    $product_data[$result['related_id']] = $product_query->row;
   }
  }
  
  return $product_data;
}

public function getCategories($product_id) {
  $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'");
  
  return $query->rows;
}
}
?>
回复

使用道具 举报

发表于 2011-4-1 00:38:55 | 显示全部楼层
1.4.9适用吗??
回复 支持 反对

使用道具 举报

发表于 2011-4-18 16:38:44 | 显示全部楼层
$keywords = preg_split("/[\s,]*\\"([^\\"]+)\\"[\s,]*|" . "[\s,]*'([^']+)[\s,]*|" . "[\s,]+/", $keyword, 0, PREG_SPLIT_NO_EMPTY);这句出现错误
错误代码是
Parse error:syntax error, unexpected '(' in D:\www\opencart\upload\catalog\model\catalog\product.php on line 88
请问怎么解决啊
回复 支持 反对

使用道具 举报

发表于 2011-7-31 00:17:43 | 显示全部楼层
谢谢管理员的风险~让初学者获益不浅。感恩~
回复 支持 反对

使用道具 举报

发表于 2012-2-13 23:21:04 | 显示全部楼层
代码好长,能不能解释一下原理呢?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

QQ|手机版|OpenCart - 中文官方网站 ( 蜀ICP备09033774号|人工智能

GMT+8, 2024-4-19 02:38 , Processed in 0.066945 second(s), 25 queries , Gzip On.

快速回复 返回顶部 返回列表