ivagred1976 Posted September 4, 2017 Share Posted September 4, 2017 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 More sharing options...
rimander Posted September 6, 2017 Share Posted September 6, 2017 Me carga correctamente.¿Ya lo solucionasteis? un saludo Link to comment Share on other sites More sharing options...
ivagred1976 Posted September 7, 2017 Author Share Posted September 7, 2017 (edited) 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 September 7, 2017 by ivagred1976 (see edit history) Link to comment Share on other sites More sharing options...
rimander Posted September 7, 2017 Share Posted September 7, 2017 Si puede darme mas detalles. - Versión de Prestashop - Nombre del módulo o para que lo usas. Tiene pinta de que tarda en sacar de la base de datos, pero podemos solucionarlo con cache creo yo. Un saludo. Link to comment Share on other sites More sharing options...
ivagred1976 Posted September 7, 2017 Author Share Posted September 7, 2017 (edited) 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 September 7, 2017 by ivagred1976 (see edit history) Link to comment Share on other sites More sharing options...
rimander Posted September 11, 2017 Share Posted September 11, 2017 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 More sharing options...
ivagred1976 Posted September 12, 2017 Author Share Posted September 12, 2017 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 More sharing options...
rimander Posted September 26, 2017 Share Posted September 26, 2017 (edited) 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 September 26, 2017 by rimander (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now