Post by katiekombinnen3 » Mon Nov 19, 2012 11:43 pm

Ik heb een pagina die Alle producten weergeeft, dus van alle categorieen.
Deze producten wil ik graag in een willekeurige volgorde weergeven en wanneer de pagina ververst wordt, wederom in een andere willekeurige volgorde.

Kan iemand mij vertellen hoe ik dit het beste kan doen.
Ik dacht dat dit de oplossing was, maar ik heb het idee dat de instellingen gecached worden.

File: catalog/controller/product/productall

Code: Select all

<?php 
class ControllerProductProductall extends Controller {  
	public function index() { 
		$this->language->load('product/productall');
		$this->load->model('catalog/productall');
		$this->load->model('catalog/productall');
		$this->load->model('tool/image'); 
		if (isset($this->request->get['sort'])) {
			$sort = $this->request->get['sort'];
		} else {
			$sort = 'p.sort_order';
		}

		if (isset($this->request->get['order'])) {
			$order = $this->request->get['order'];
		} else {
			$order = 'RAND()';
		}
		
		if (isset($this->request->get['page'])) {
			$page = $this->request->get['page'];
		} else { 
			$page = 1;
		}	
							
		if (isset($this->request->get['limit'])) {
			$limit = $this->request->get['limit'];
		} else {
			$limit = $this->config->get('config_catalog_limit');
		}
					

Misschien zit ik helemaal op het verkeerde spoor... Ik hoor het graag

Alvast bedankt


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by jordischut » Mon Nov 26, 2012 10:53 pm

Beste,

dit is inderdaad aan te passen met een rand() commando, kun je de code tonen die in het bestand catalog/model/catalog/productall.php zit? Dan kan ik aangeven waar je een aanpassing moet doen!

Groet,
Jordi

Officieel OpenCart partner, ontwikkelaar van Beslist, Bol.com (nieuwe API V3!), Exact, Twinfield & E-boekhouden koppelingen. Vragen? Stel ze gerust!
http://www.internetbureauschut.nl/


New member

Posts

Joined
Wed Aug 10, 2011 3:43 pm
Location - Hardinxveld-Giessendam

Post by katiekombinnen3 » Tue Nov 27, 2012 2:25 am

Hai Jordi,

Dat zou geweldig zijn wanneer je mij kunt helpen.
Het is de volgende code:

Code: Select all

<?php
class ModelCatalogProductall extends Model {
	public function getCategory($category_id) {
		$query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$category_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'");
		
		return $query->row;
	}
	
	public function getTotalProducts($data = array()) {
		$sql = "SELECT COUNT(DISTINCT p.product_id) 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)";

		if (!empty($data['filter_category_id'])) {
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";			
		}
		
		if (!empty($data['filter_tag'])) {
			$sql .= " LEFT JOIN " . DB_PREFIX . "product_tag pt ON (p.product_id = pt.product_id)";			
		}
					
		$sql .= " WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'";
		
		if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
			$sql .= " AND (";
								
			if (!empty($data['filter_name'])) {
				$implode = array();
				
				$words = explode(' ', $data['filter_name']);
				
				foreach ($words as $word) {
					if (!empty($data['filter_description'])) {
						$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
					} else {
						$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
					}				
				}
				
				if ($implode) {
					$sql .= " " . implode(" OR ", $implode) . "";
				}
			}
			
			if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
				$sql .= " OR ";
			}
			
			if (!empty($data['filter_tag'])) {
				$implode = array();
				
				$words = explode(' ', $data['filter_tag']);
				
				foreach ($words as $word) {
					$implode[] = "LCASE(pt.tag) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "%' AND pt.language_id = '" . (int)$this->config->get('config_language_id') . "'";
				}
				
				if ($implode) {
					$sql .= " " . implode(" OR ", $implode) . "";
				}
			}
		
			$sql .= ")";
		}
		
		if (!empty($data['filter_category_id'])) {
			if (!empty($data['filter_sub_category'])) {
				$implode_data = array();
				
				$implode_data[] = "p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
				
				$this->load->model('catalog/category');
				
				$categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
					
				foreach ($categories as $category_id) {
					$implode_data[] = "p2c.category_id = '" . (int)$category_id . "'";
				}
							
				$sql .= " AND (" . implode(' OR ', $implode_data) . ")";			
			} else {
				$sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
			}
		}		
		
		if (!empty($data['filter_manufacturer_id'])) {
			$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
		}
		
		$query = $this->db->query($sql);
		
		return $query->row['total'];
	}
	
	
	
	public function getProducts($data = array()) {
		if ($this->customer->isLogged()) {
			$customer_group_id = $this->customer->getCustomerGroupId();
		} else {
			$customer_group_id = $this->config->get('config_customer_group_id');
		}	
		
		$cache = md5(http_build_query($data));
		
		$product_data = $this->cache->get('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
		
		if (!$product_data) {
			$sql = "SELECT p.product_id, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.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)"; 
			
			if (!empty($data['filter_tag'])) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "product_tag pt ON (p.product_id = pt.product_id)";			
			}
						
			if (!empty($data['filter_category_id'])) {
				$sql .= " LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id)";			
			}
			
			$sql .= " WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'"; 
			
			if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
				$sql .= " AND (";
											
				if (!empty($data['filter_name'])) {
					$implode = array();
					
					$words = explode(' ', $data['filter_name']);
					
					foreach ($words as $word) {
						if (!empty($data['filter_description'])) {
							$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
						} else {
							$implode[] = "LCASE(pd.name) LIKE '%" . $this->db->escape(utf8_strtolower($word)) . "%'";
						}				
					}
					
					if ($implode) {
						$sql .= " " . implode(" OR ", $implode) . "";
					}
				}
				
				if (!empty($data['filter_name']) && !empty($data['filter_tag'])) {
					$sql .= " OR ";
				}
				
				if (!empty($data['filter_tag'])) {
					$implode = array();
					
					$words = explode(' ', $data['filter_tag']);
					
					foreach ($words as $word) {
						$implode[] = "LCASE(pt.tag) LIKE '%" . $this->db->escape(utf8_strtolower($data['filter_tag'])) . "%' AND pt.language_id = '" . (int)$this->config->get('config_language_id') . "'";
					}
					
					if ($implode) {
						$sql .= " " . implode(" OR ", $implode) . "";
					}
				}
			
				$sql .= ")";
			}
			
			if (!empty($data['filter_category_id'])) {
				if (!empty($data['filter_sub_category'])) {
					$implode_data = array();
					
					$implode_data[] = "p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
					
					$this->load->model('catalog/category');
					
					$categories = $this->model_catalog_category->getCategoriesByParentId($data['filter_category_id']);
										
					foreach ($categories as $category_id) {
						$implode_data[] = "p2c.category_id = '" . (int)$category_id . "'";
					}
								
					$sql .= " AND (" . implode(' OR ', $implode_data) . ")";			
				} else {
					$sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
				}
			}		
					
			if (!empty($data['filter_manufacturer_id'])) {
				$sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
			}
			
			$sql .= " GROUP BY p.product_id";
			
			$sort_data = array(
				'pd.name',
				'p.model',
				'p.quantity',
				'p.price',
				'rating',
				'p.sort_order',
				'p.date_added'
			);	
			
			if (isset($data['sort']) && in_array($data['sort'], $sort_data)) {
				if ($data['sort'] == 'pd.name' || $data['sort'] == 'p.model') {
					$sql .= " ORDER BY LCASE(" . $data['sort'] . ")";
				} else {
					$sql .= " ORDER BY " . $data['sort'];
				}
			} else {
				$sql .= " ORDER BY p.sort_order";	
			}
			
			if (isset($data['order']) && ($data['order'] == 'DESC')) {
				$sql .= " DESC";
			} else {
				$sql .= " ASC";
			}
		
			if (isset($data['start']) || isset($data['limit'])) {
				if ($data['start'] < 0) {
					$data['start'] = 0;
				}				
	
				if ($data['limit'] < 1) {
					$data['limit'] = 20;
				}	
			
				$sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit'];
			}
			
			$product_data = array();
					
			$query = $this->db->query($sql);
		
			foreach ($query->rows as $result) {
				$product_data[$result['product_id']] = $this->getProduct($result['product_id']);
			}
			
			$this->cache->set('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache, $product_data);
		}
		
		return $product_data;
	}
	
	
	
	public function getProduct($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 DISTINCT *, pd.name AS name, p.image, m.name AS manufacturer, (SELECT price FROM " . DB_PREFIX . "product_discount pd2 WHERE pd2.product_id = p.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())) ORDER BY pd2.priority ASC, pd2.price ASC LIMIT 1) AS discount, (SELECT price FROM " . DB_PREFIX . "product_special ps WHERE ps.product_id = p.product_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())) ORDER BY ps.priority ASC, ps.price ASC LIMIT 1) AS special, (SELECT points FROM " . DB_PREFIX . "product_reward pr WHERE pr.product_id = p.product_id AND customer_group_id = '" . (int)$customer_group_id . "') AS reward, (SELECT ss.name FROM " . DB_PREFIX . "stock_status ss WHERE ss.stock_status_id = p.stock_status_id AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "') AS stock_status, (SELECT wcd.unit FROM " . DB_PREFIX . "weight_class_description wcd WHERE p.weight_class_id = wcd.weight_class_id AND wcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS weight_class, (SELECT lcd.unit FROM " . DB_PREFIX . "length_class_description lcd WHERE p.length_class_id = lcd.length_class_id AND lcd.language_id = '" . (int)$this->config->get('config_language_id') . "') AS length_class, (SELECT AVG(rating) AS total FROM " . DB_PREFIX . "review r1 WHERE r1.product_id = p.product_id AND r1.status = '1' GROUP BY r1.product_id) AS rating, (SELECT COUNT(*) AS total FROM " . DB_PREFIX . "review r2 WHERE r2.product_id = p.product_id AND r2.status = '1' GROUP BY r2.product_id) AS reviews, p.sort_order 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) WHERE p.product_id = '" . (int)$product_id . "' AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "'");
		
		if ($query->num_rows) {
			$query->row['price'] = ($query->row['discount'] ? $query->row['discount'] : $query->row['price']);
			$query->row['rating'] = (int)$query->row['rating'];
			
			return $query->row;
		} else {
			return false;
		}
	}
	
	
	
	
	public function getCategories($parent_id = 0) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "'  AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)");
		
		return $query->rows;
	}

	public function getCategoriesByParentId($category_id) {
		$category_data = array();
		
		$category_query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "category WHERE parent_id = '" . (int)$category_id . "'");
		
		foreach ($category_query->rows as $category) {
			$category_data[] = $category['category_id'];
			
			$children = $this->getCategoriesByParentId($category['category_id']);
			
			if ($children) {
				$category_data = array_merge($children, $category_data);
			}			
		}
		
		return $category_data;
	}
		
	public function getCategoryLayoutId($category_id) {
		$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category_to_layout WHERE category_id = '" . (int)$category_id . "' AND store_id = '" . (int)$this->config->get('config_store_id') . "'");
		
		if ($query->num_rows) {
			return $query->row['layout_id'];
		} else {
			return $this->config->get('config_layout_category');
		}
	}
					
	public function getTotalCategoriesByCategoryId($parent_id = 0) {
		$query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'");
		
		return $query->row['total'];
	}
}
?>
Alvast bedankt!
Groetjes
Karin


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by jordischut » Tue Nov 27, 2012 4:19 am

Hoi Karin,

wil je dat de producten ten alle tijden willekeurig worden weergegeven, of is het ook mogelijk om op die pagina zelf de sorteervolgorde te kiezen? Dit bepaald de code omtrent het sorteren.

Graag hoor ik van je.

Groet,
Jordi

Officieel OpenCart partner, ontwikkelaar van Beslist, Bol.com (nieuwe API V3!), Exact, Twinfield & E-boekhouden koppelingen. Vragen? Stel ze gerust!
http://www.internetbureauschut.nl/


New member

Posts

Joined
Wed Aug 10, 2011 3:43 pm
Location - Hardinxveld-Giessendam

Post by katiekombinnen3 » Tue Nov 27, 2012 5:08 am

Hai Jordi,

Graag alleen wanneer de pagina geopend of herladen wordt, de producten random. En daarnaast ook de sorteerfuncties nog werkzaam.
Super dat je dit uit wilt zoeken.
Groetjes
Karin


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by jordischut » Tue Nov 27, 2012 5:16 am

Karin,

het enige wat je dan hoeft aan te passen is de regel:

Code: Select all

$sql .= " ORDER BY p.sort_order";
Deze regel zegt eigenlijk, als er geen sorteer optie is gekozen, sorteer dan op sorteervolgorde (die je instelt in de back-end). Wat jij wil, is dat het systeem, als er geen sorteer optie is gekozen, de producten willekeurig sorteert. Die regel moet dan aangepast worden naar:

Code: Select all

$sql .= " ORDER BY RAND()";
Doordat je deze code aanpast, moet de regel die daar vlak onder komt:

Code: Select all

$sql .= " ASC";
'Uitgezet' worden, omdat die niet meer van invloed is. Je kunt daar het beste het volgende van maken:

Code: Select all

//$sql .= " ASC";
Oftewel, zet twee keer een / voor de regel, zodat deze 'uit' staat en niet meer gelezen wordt.

Ik hoop dat je hiermee uit de voeten kunt en het de oplossing is voor je vraag! Mocht het niet zo zijn, laat het dan even weten!

Groet,
Jordi

Officieel OpenCart partner, ontwikkelaar van Beslist, Bol.com (nieuwe API V3!), Exact, Twinfield & E-boekhouden koppelingen. Vragen? Stel ze gerust!
http://www.internetbureauschut.nl/


New member

Posts

Joined
Wed Aug 10, 2011 3:43 pm
Location - Hardinxveld-Giessendam

Post by katiekombinnen3 » Tue Nov 27, 2012 6:38 am

Hey Jordi,

Ik heb de code gewijzigd en wanneer ik de betreffende pagina open en herlaad (f5) worden de producten inderdaad random weergegeven, maar wanneer ik hem weer herlaad worden alle producten op dezelfde plaats vastgehouden.

Het lijkt wel of dit dan wordt gecached ofzo. Weet je hoe dit eruit gehaald kan worden?

Groetjes
Karin


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by jordischut » Tue Nov 27, 2012 3:07 pm

Dat klopt inderdaad, er is nog een regel code:

Code: Select all

$product_data = $this->cache->get('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
Daar wordt gekeken of de pagina al een keer is opgebouwd en deze wordt dan inderdaad uit de cache uitgelezen.

Verander die regel in:

Code: Select all

//$product_data = $this->cache->get('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache);
En zet daaronder (voor de zekerheid) een regel:

Code: Select all

$product_data = false;
Dat zou voldoende moeten zijn!

PS: Je kan ook bij de volgende regel twee keer een / er voor zetten, omdat dit niet meer nodig is:

Code: Select all

$this->cache->set('product.' . (int)$this->config->get('config_language_id') . '.' . (int)$this->config->get('config_store_id') . '.' . (int)$customer_group_id . '.' . $cache, $product_data);
Groet,
Jordi

Officieel OpenCart partner, ontwikkelaar van Beslist, Bol.com (nieuwe API V3!), Exact, Twinfield & E-boekhouden koppelingen. Vragen? Stel ze gerust!
http://www.internetbureauschut.nl/


New member

Posts

Joined
Wed Aug 10, 2011 3:43 pm
Location - Hardinxveld-Giessendam

Post by katiekombinnen3 » Tue Nov 27, 2012 4:04 pm

Hey Jordi,

Werkt perfect!
Hartstikke bedankt voor je tijd en moeite.

Groetjes
Karin


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by jordischut » Tue Nov 27, 2012 4:08 pm

Geen probleem! Mocht je nog andere vragen hebben mag je me altijd een berichtje sturen!

Officieel OpenCart partner, ontwikkelaar van Beslist, Bol.com (nieuwe API V3!), Exact, Twinfield & E-boekhouden koppelingen. Vragen? Stel ze gerust!
http://www.internetbureauschut.nl/


New member

Posts

Joined
Wed Aug 10, 2011 3:43 pm
Location - Hardinxveld-Giessendam

Post by thomasverheijen » Tue Dec 04, 2012 10:21 pm

Hoi Jordi,

Neem aan dat deze niet geschikt is voor versie 1.5.4.x ?

(current project) rebuilding old OSc 2.5.x to OPc 1.5.4.x



Posts

Joined
Thu Oct 25, 2012 9:30 pm

Post by katiekombinnen3 » Wed Dec 05, 2012 5:23 am

Ja ik werk ook met versie 1.5.4 en dit werkt.
Groetjes Karin


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by tverheijen » Wed Dec 05, 2012 6:27 am

Hoi karin & Jordi,

heb de code inmiddels gewijzigd zoals bovenstaand, echter worden bij mij de producten nog steeds het zelfde weer gegeven.

duurd dit even voor dat de chache geleegd is of,.. zie ik iets over het hoofd?

>/Thomas

Active Member

Posts

Joined
Tue Sep 20, 2011 3:19 am

Post by katiekombinnen3 » Wed Dec 05, 2012 5:56 pm

Hey Thomas,

Gebruik je F5 om de boel te verversen? Dan worden de veranderingen ook gelijk zichtbaar.

Groetjes Karin


Posts

Joined
Thu Oct 25, 2012 9:11 pm

Post by tverheijen » Wed Dec 05, 2012 11:04 pm

Hoi karin,

Heb het inmiddels al gevonden.

me productall pagina was nog niet toegevoegd aan de layout, heb hem inmiddels gevonden en het werkt! ;)

Groetjes en bedankt,

Thomas

Active Member

Posts

Joined
Tue Sep 20, 2011 3:19 am
Who is online

Users browsing this forum: No registered users and 24 guests