Jump to content

La carga de la página de productos es muy lenta


ivagred1976

Recommended Posts

Hola, tengo una página en la cual hemos ajustado un módulo de addons, para personalizar los productos, el módulo funciona muy bien, pero tenemos problemas al cargar la página del producto cuando doy clic en la categoría o en el home, toma hasta 25 segundo en cargar. 

 

Hemos realizado la optimización de imágenes, pero no ha ayudado, creémos que el problema es por la consulta realizada pues el módulo trabaja con combinaciones y pueden llegar a ser unas 800 combinaciones ya que corresponde a 6 giros de la imágen, unas 11 partes y unos 13 colores

 

De pronto alguien quien nos pueda guiar en cómo hacer para que esa consulta se pueda hacer más rápido, es decir que no necesariamente me consulte las 800 combinaciones si no que pueda ser solo un giro, las 11 partes y los 13 colores, esto nos ayudaría mucho al momento de cargar la página de producto, pues hemos hecho pruebas de solo crear un producto con un giro y con los demás atributo y el cargue se dá en 4 segundos.

 

mi portal es www.bozaac.com

 

Gracias a todos

Link to comment
Share on other sites

no hemos podido encontrar el problema, pues toma 24 segundos en cargar el producto, esto ha generado rechazo por parte de los clientes, ojalá nos pudieras ayudar

 

Prueba estos links en tiempo

 

https://www.bozaac.com/disena-tu-bolso/39-bolso-cuadrado.html

https://www.bozaac.com/disena-tu-bolso/44-pequeno.html

Edited by ivagred1976 (see edit history)
Link to comment
Share on other sites

Hola Reminder, nuestra version de Prestashop es la 1.6.1.7 y el modulo modificado para realizar las combinaciones que se visualizan en la pagina es LSProductsConfigurator (https://addons.prestashop.com/es/combinaciones-personalizacion/20360-ls-products-configurator.html).
 
Tambien estamos pensando en  que la posible solucion puede ser  a traves de una mejora en  la consulta de base de datos y/o añadiendo cache para la carga de imagenes. Hemos identificado que en el llamado del metodo getColor()  es donde se genera la tardanza debido a los ciclos for anidados. 
 
<?php



class ProductController extends ProductControllerCore
{
    /*
    * module: stoverride
    * date: 2016-10-12 21:16:22
    * version: 1.1.0
    */
    public function initContent()
	{
		$partgroupid = Configuration::get('LSPRCONFIG_PARTID');
		
		parent::initContent();

        if(!$this->display_column_left && !$this->display_column_right && Configuration::get('STSN_PRODUCT_SECONDARY'))
            $this->context->smarty->assign(array(   
    			'HOOK_PRODUCT_SECONDARY_COLUMN' => Hook::exec('displayProductSecondaryColumn'),     
    		));

        $this->context->smarty->assign(array(
            'show_brand_logo' => Configuration::get('STSN_SHOW_BRAND_LOGO'),
        ));

			$Angle = Configuration::get('LSPRCONFIG_DEFANGLEID');
			
			$currentpart = 	0;
			
			$currentcolor = 0;
			
			$imagedata ="";
			
			$data ="";
			
			$m =Module::getInstanceByName('lsproductsconfigurator');
			
			if($m){

					$combUploaderLink ="";
					
					$found = $m->isproductlinkedwithimages($this->product->id);
					
					if($found){
					
					$imagedata = $m->getDefaultProductimage($this->product->id);
					
					$combUploaderLink = $this->context->link->getModuleLink('lsproductsconfigurator','uploader',array("controller"=>"uploader", "ajax"=>true, "action"=>"comb"));
				}
			

			if($found){

				$colorarray = $imagedata["colorarray"];
				
				$parts =  $m->getParts($partgroupid);
				
				$i =0;
				
				$data .= '<ul>';

				foreach($parts as $part){
					
					$data .= '<li class="attribute_fieldset"><a onclick="openTab(\'open_'.$part["id_attribute"].'\')"><label class="attribute_label">'.$part["name"].' </label></a>';	
					
					$colors = $this->getcolors($part["id_attribute"],$this->product->id);
					
					$data .= '<div id="open_'.$part["id_attribute"].'" class="attribute_list att-tab-group" ><ul id="color_to_pick_list" class="clearfix">';
					
					foreach($colors as $color){

						$colorname = $color["name"];
						
						$colorcode = $color["color"];
						
						$id_attribute = $color["id_attribute"];
						
						if(isset($colorarray[$part["id_attribute"]]) && $colorarray[$part["id_attribute"]]==$id_attribute){

							$sel =' class="selected" ';

							$i++;
							
							if($i==1){

								$currentpart = 	$part["id_attribute"];
								
								$currentcolor = $id_attribute;
							}
						}
						else{

							$sel ="";
						}
						
						
							$image = $this->product->id.'_'.$part["id_attribute"].'_'.$Angle.'_'.$color["id_attribute"].'.png';
							$uploaddir = _PS_MODULE_DIR_."lsproductsconfigurator/images/";
							$uploaddir.$image;
							if(file_exists($uploaddir.$image)){

								$data .= '<li '.$sel.' ><a href="http://35.185.78.158/prestashop/index.php?id_product=12&controller=product" id="color_'.$id_attribute.'" name="'.$colorname.'" class="color_pick" style="background: '.$colorcode.';" title="Color" data-part="'.$part["id_attribute"].'" ></a></li>';
							}
					
					}
					$data .= '</ul></div></li>';
				}
				$data .= '</ul>';
			}

			

			$allangles = $this->getangles($this->product->id);
			
			$attributedata = '<div id="attributes" >'.$data.'</div>';
				 $this->context->smarty->assign(array(
				'imagedata' => $imagedata["data"],
				'combUploaderLink' => $combUploaderLink,
				'attributedata'=>$attributedata,
				 'currentangle'=>!empty($allangles)?0:'0',
				 'currentcolor'=>$currentcolor,
				 'currentpart'=>$currentpart,
				'allangles'=>implode("_",$allangles),
				
			 ));

			
		 }
			
		//echo $this->context->link->getModuleLink('lsproductsconfigurator','ajaxcontroller',array("controller"=>"ajaxcontroller"));

	}

	public function getangles($id_product)
	{
		$partgroupid = Configuration::get('LSPRCONFIG_PARTID');
		
		$colorgroupid = Configuration::get('LSPRCONFIG_COLORID');
		
		$anglegroupid = Configuration::get('LSPRCONFIG_ANGLEID');
		
		$default_language_id=Configuration::get('PS_LANG_DEFAULT');
		
		$sql = 'select p.id_product_attribute from '. _DB_PREFIX_ .'product_attribute p  where p.id_product ='.$id_product;
		
		$sortedartibute =array();
		
		$res =  Db::getInstance()->ExecuteS($sql);
		
		$sortedartibute[]= 0;
		
		$colorarray = array();
		
		foreach($res as $item){

				$sql3 ='select c.id_attribute, al.name from '._DB_PREFIX_.'product_attribute_combination c inner join '._DB_PREFIX_.'attribute a ON(a.id_attribute = c.id_attribute and a.id_attribute_group='.$anglegroupid.')  inner join '._DB_PREFIX_.'attribute_lang  al on (a.id_attribute=al.id_attribute and al.id_lang='.$default_language_id.' )  where  id_product_attribute='.$item["id_product_attribute"]. ' and  c.id_attribute not in ('.implode(",",$sortedartibute).')'  ;

			    
			    $res3 =  Db::getInstance()->getRow($sql3);
				
				if($res3){

					$colorarray[] = array
						(
							'id_attribute'=>$res3["id_attribute"],
						    'name'=>$res3["name"],
						    
					    );
					$sortedartibute[] = $res3["id_attribute"];
				}
		}

		array_shift($sortedartibute);
		return $sortedartibute;
	}


	public function getcolors($id_part,$id_product)
	{
		
		$partgroupid = Configuration::get('LSPRCONFIG_PARTID');

		$colorgroupid = Configuration::get('LSPRCONFIG_COLORID');

		$anglegroupid = Configuration::get('LSPRCONFIG_ANGLEID');

		$default_language_id=Configuration::get('PS_LANG_DEFAULT');

		$sql = 'select p.id_product_attribute from '. _DB_PREFIX_ .'product_attribute p  where p.id_product ='.$id_product;
			
		$sortedartibute =array();

		$res =  Db::getInstance()->ExecuteS($sql);
		
		$sortedartibute[] = $id_part;
		
		$colorarray = array();
		
		foreach($res as $item){

				$sql2 ='select c.id_attribute from '._DB_PREFIX_.'product_attribute_combination c where  c.id_product_attribute='.$item["id_product_attribute"]. ' and c.id_attribute='.$id_part  ;
			    $res2 =  Db::getInstance()->getValue($sql2);
				
				$sql3 ='SELECT c.id_attribute, al.name, a.color from '._DB_PREFIX_.'product_attribute_combination c INNER JOIN '._DB_PREFIX_.'attribute a ON(a.id_attribute=c.id_attribute and a.id_attribute_group='.$colorgroupid.')  INNER JOIN '._DB_PREFIX_.'attribute_lang  al ON (a.id_attribute=al.id_attribute and al.id_lang='.$default_language_id.' )  WHERE  id_product_attribute='.$item["id_product_attribute"]. ' and  c.id_attribute NOT IN ('.implode(",",$sortedartibute).')';
			    
			    $implode_sortattr = implode(",",$sortedartibute);
			    
				if($res2 and $res3 ){

					$colorarray[] = array
						(
							'id_attribute'=>$res3["id_attribute"],
						    'name'=>$res3["name"],
						    'color'=>$res3["color"]
					    );
					$sortedartibute[] = $res3["id_attribute"];
				}
		}

		
		return $colorarray;
			 
	}

	
}

Gracias por tu ayuda.

 

Un saludo.

Edited by ivagred1976 (see edit history)
Link to comment
Share on other sites

Yo optaría por utilizar la cache, yo uso Redis para este tipo de cosas pero podeis usar las que vienen configuradas en prestashop.

Mi recomendación es que los valores de  "getcolors" los coloques en modo cache.

 

 

 

Creo recordar que se usaba de la siguiente forma

$cache = Cache::getInstance();
$cache->set($clave, $datos, $ttl);
$cache->get($clave);
$cache->exists($clave);
 

Con ello puedes establecer una clave por ejemplo que sea "color-(idproducto)", si no existe la clave que lo cargue, pero que si existe que te devuelva el contenido por lo que te ahorras todas esas llamadas a la base de datos.

 

No es que sea la mejor opción pero es la que se me ocurre por no modificar ese modulo.

 

 

Un saludo.

Link to comment
Share on other sites

Muchas gracias Reminder por tu ayuda, quisiera preguntarte si dispones de documentacion o mayores ejemplos 

donde se use los metodos para el acceso y uso de cache. La verdad no contamos con alguna capacitacion  de 

Prestashop, lo que conocemos y hemos desarrollado es a prueba y error a partir de la revision de diferentes modulos.

 

Un saludo.

Link to comment
Share on other sites

  • 2 weeks later...

Muchas gracias Reminder por tu ayuda, quisiera preguntarte si dispones de documentacion o mayores ejemplos 

donde se use los metodos para el acceso y uso de cache. La verdad no contamos con alguna capacitacion  de 

Prestashop, lo que conocemos y hemos desarrollado es a prueba y error a partir de la revision de diferentes modulos.

 

Un saludo.

Perdona la tardanza, estaba de vacaciones y me fue imposible conectarme.

Te recomiendo que te mires algunos modulos de prestashop, tienen el sistema de cache incorporado.

Actualmente no dispongo de tal documentación.

 

Si he ayudado, dale like.

Gracias

Edited by rimander (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...