From c1f7e698df352de0612df45253467d74ae161630 Mon Sep 17 00:00:00 2001 From: Daniel Alonso Date: Thu, 25 Jun 2020 13:27:17 +0200 Subject: [PATCH] Version original del modulo --- FuncionesImaxAddCatbyFeature.php | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ config.xml | 2 +- configuration.php | 8 ++++++-- css/css.css | 4 ++++ imaxaddcatbyfeature.php | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------- imaxaddcatbyfeature_cron.php | 2 +- js/functions.js | 116 +++++++++++++++++++++++++++++++++++++------------------------------------------------------------------------------- sql-install.php | 9 --------- sql-unninstall.php | 1 - 9 files changed, 246 insertions(+), 239 deletions(-) diff --git a/FuncionesImaxAddCatbyFeature.php b/FuncionesImaxAddCatbyFeature.php index 264330f..54a8ab0 100644 --- a/FuncionesImaxAddCatbyFeature.php +++ b/FuncionesImaxAddCatbyFeature.php @@ -1,11 +1,40 @@ modulo = $modulo; - } + + private $modulo; + public $context; + + public function __construct($modulo) { + $this->modulo = $modulo; + $this->context = Context::getContext(); + } + + /** + * Devuelve las categorias a mover para un producto determinado + * @param int $idProduct + * @return array + */ + public function getCategoriesByProductFeature($idProduct) { + $categories = array(); + $producto = new ProductCore($idProduct); + $features = $producto->getFeatures(); + $catFeatures = unserialize(Configuration::getGlobalValue($this->modulo->sufijo . 'CATS_FEATURE')); + if($features && $catFeatures) { + foreach($features AS $feature) { + foreach($catFeatures AS $catFeature) { + if($feature['id_feature_value'] == $catFeature['valorCaracteristicaSeleccionado']) { + $categories[] = $catFeature['tipoSeleccionado']; + break; + } + } + } + } + return $categories; + } + + + /** * Agrega al producto las categorias pasadas. @@ -15,12 +44,12 @@ class FuncionesImaxAddCatbyFeature { public function agregarCategorias($producto, $categorias) { $categoriasActuales = $producto->getCategories(); $nuevasCategorias = array_diff($categorias, $categoriasActuales); - foreach($nuevasCategorias as $categoria) { + foreach ($nuevasCategorias as $categoria) { $this->guardarMovimiento($producto->id, $categoria); } $producto->addToCategories($nuevasCategorias); } - + /** * Anota una nueva categoria de producto. * @param int $id_product @@ -28,35 +57,35 @@ class FuncionesImaxAddCatbyFeature { * @return boolean */ private function guardarMovimiento($id_product, $id_category) { - $id_product = (int)$id_product; - $id_category = (int)$id_category; - - return Db::getInstance()->execute('INSERT IGNORE INTO `'._DB_PREFIX_.$this->modulo->sufijo."movimiento` (id_product, id_category) VALUES ('$id_product', '$id_category')"); + $id_product = (int) $id_product; + $id_category = (int) $id_category; + + return Db::getInstance()->execute('INSERT IGNORE INTO `' . _DB_PREFIX_ . $this->modulo->sufijo . "movimiento` (id_product, id_category) VALUES ('$id_product', '$id_category')"); } - + /** * Devuelve los ids de categoria a los que el producto fue agregado. * @param int $id_product * @return int[] */ private function cargarMovimientos($id_product) { - $id_product = (int)$id_product; - - $movimientos = Db::getInstance()->executeS('SELECT id_category FROM `'._DB_PREFIX_.$this->modulo->sufijo."movimiento` WHERE id_product = '$id_product'"); + $id_product = (int) $id_product; + + $movimientos = Db::getInstance()->executeS('SELECT id_category FROM `' . _DB_PREFIX_ . $this->modulo->sufijo . "movimiento` WHERE id_product = '$id_product'"); return array_column($movimientos, 'id_category'); } - + /** * Elimina los movimientos de un producto. * @param int $id_product * @return boolean */ private function eliminarMovimientos($id_product) { - $id_product = (int)$id_product; - - return Db::getInstance()->execute('DELETE FROM `'._DB_PREFIX_.$this->modulo->sufijo."movimiento` WHERE id_product = '$id_product'"); + $id_product = (int) $id_product; + + return Db::getInstance()->execute('DELETE FROM `' . _DB_PREFIX_ . $this->modulo->sufijo . "movimiento` WHERE id_product = '$id_product'"); } - + /** * Quita al producto las categorias agregadas. * @param Product $producto @@ -64,37 +93,72 @@ class FuncionesImaxAddCatbyFeature { public function deshacerMovimientos($producto) { $idsCategoria = $this->cargarMovimientos($producto->id); $num = count($idsCategoria); - foreach($idsCategoria as $clave => $idCategoria) { - $producto->deleteCategory($idCategoria, ($clave == $num - 1)); + + foreach ($idsCategoria as $clave => $idCategoria) { + //$producto->deleteCategory($idCategoria, ($clave == $num - 1)); + $producto->deleteCategory($idCategoria, false); } $this->eliminarMovimientos($producto->id); } - + /** * Monta una lista de categorias recursivamente. * @param array $categoria * @param string $html * @param int[] $categoriasSeleccionada */ - public function getHijosLista($categoria, &$html, $categoriasSeleccionada) { + public function getHijosSelect($categoria, &$respuesta) { $categoriasHijos = Category::getChildren($categoria['id_category'], $this->modulo->idLang); - if (count($categoriasHijos)) { - $html .= ''; } + $tiposFormateados = array(); + $this->getHijosSelect(array('id_category' => $this->context->shop->id_category), $tiposFormateados); + $form = new imaxForm($this->modulo, $this->modulo->getPathUri()); + $form->createHidden("accion", "configurarCategorizacion"); + $form->createHidden("idTab", $idTab); + $form->addToForm(' + + + + + + +
' . $this->modulo->l('Caracteristica') . '' . $this->modulo->l('Valor caracteristica') . '' . $this->modulo->l('Categoria') . '
'); + $form->createButton('agregarCriterio', $this->modulo->l('Nuevo')); + $form->createSubmitButton('save', $this->modulo->l('Guardar')); + return $form; } + } diff --git a/config.xml b/config.xml index 8c0c725..793bd6d 100644 --- a/config.xml +++ b/config.xml @@ -2,7 +2,7 @@ imaxaddcatbyfeature - + diff --git a/configuration.php b/configuration.php index 3f53517..4802d72 100644 --- a/configuration.php +++ b/configuration.php @@ -1,8 +1,10 @@ sufijo . 'CATS_NOVEDAD'] = serialize(array()); -$configuracion[$this->sufijo . 'DIAS_NOVEDAD'] = 7; +$configuracion[$this->sufijo . 'CATS_FEATURE'] = serialize(array()); $configuracion[$this->sufijo . 'TOKEN'] = md5(uniqid()); +$configuracion[$this->sufijo . 'LAST_PRODUCT'] = 0; +$configuracion[$this->sufijo . 'NUM_ELEMENTOS'] = 100; + $configuracion[$this->sufijo . 'LICENCIA'] = ''; $configuracion[$this->sufijo . 'F_SERVER'] = 'http://licencia.informax.es/gestionarLicencias.php'; @@ -12,6 +14,8 @@ $configuracion[$this->sufijo . 'F_CHECK'] = 1000; $hooks = array(); $hooks[] = 'actionObjectProductAddAfter'; +//$hooks[] = 'actionObjectProductUpdateAfter'; +$hooks[] = 'actionProductUpdate'; diff --git a/css/css.css b/css/css.css index 7e03857..9b7ae16 100644 --- a/css/css.css +++ b/css/css.css @@ -45,4 +45,8 @@ #arbolCategorias { margin-bottom: 15px; +} + +#tablaCriteriosCategorizacion { + width: 100%; } \ No newline at end of file diff --git a/imaxaddcatbyfeature.php b/imaxaddcatbyfeature.php index 0f766d6..5505d33 100644 --- a/imaxaddcatbyfeature.php +++ b/imaxaddcatbyfeature.php @@ -19,7 +19,7 @@ class ImaxAddCatbyFeature extends Module { public function __construct() { $this->name = 'imaxaddcatbyfeature'; $this->tab = 'administration'; - $this->version = '1.1'; + $this->version = '1.2'; $this->author = 'Informax'; $this->need_instance = 0; $this->idManual = ''; @@ -53,11 +53,9 @@ class ImaxAddCatbyFeature extends Module { $directorioAdmin = getcwd(); if (is_file(dirname(__FILE__) . '/' . $this->name . '_cron.php') && !@copy(dirname(__FILE__) . '/imaxaddcatbyfeature_cron.php', $directorioAdmin . '/imaxaddcatbyfeature_cron.php')) { $this->_errors[] = $this->l('Ha fallado al copiar el fichero de cron'); - return false; - } + } if (is_file(dirname(__FILE__) . '/' . $this->name . '_cron.php.imax') && !@copy(dirname(__FILE__) . '/imaxaddcatbyfeature_cron.php.imax', $directorioAdmin . '/imaxaddcatbyfeature_cron.php.imax')) { - $this->_errors[] = $this->l('Ha fallado al copiar el fichero de cron ofuscado'); - return false; + $this->_errors[] = $this->l('Ha fallado al copiar el fichero de cron ofuscado'); } include(dirname(__FILE__) . '/configuration.php'); @@ -133,8 +131,9 @@ class ImaxAddCatbyFeature extends Module { $this->getTxtFiles(); $this->addCSS('css.css'); //$this->addJS('jquery.dynatree.min.js'); + $this->addJqueryUI('ui.sortable'); $this->addJS('functions.js'); - $this->addCSS('../skin/ui.dynatree.css'); + $this->addCSS('publi.css'); $this->_html .= $this->createHelpHeader(); if (!empty($_POST)) @@ -158,13 +157,31 @@ class ImaxAddCatbyFeature extends Module { $html .= $this->displayError($this->l('Ha ocurrido un error al guardar la licencia.')); } break; - case 'configuracion': - if (Configuration::updateGlobalValue(self::prefijo . 'DIAS_NOVEDAD', trim(Tools::getValue('diasNovedad', 7))) && - Configuration::updateGlobalValue(self::prefijo . 'CATS_NOVEDAD', serialize(explode(',', Tools::getValue('catList'))))) { - $html .= $this->displayConfirmation($this->l('Configuracion guardada correctamente.')); + if (Configuration::updateGlobalValue(self::prefijo . 'NUM_ELEMENTOS', (int) (Tools::getValue('numElementos')))) { + $html .= $this->displayConfirmation($this->l('Numero de elementos guardado correctamente.')); + } else { + $html .= $this->displayError($this->l('Ha ocurrido un error al guardar el numero de elementos.')); + } + break; + case 'generar_token': + if (Configuration::updateGlobalValue(self::prefijo . 'TOKEN', md5(uniqid()))) { + $html .= $this->displayConfirmation($this->l('Token regenerado correctamente.')); + } else { + $html .= $this->displayError($this->l('Ha ocurrido un error al regenerar el token.')); + } + break; + case 'configurarCategorizacion': + $criteriosOrdenados = array(); + $criterios = Tools::getValue('categorizacion', array()); + foreach ($criterios as $criterio) { + $criteriosOrdenados[(int) $criterio['orden']] = $criterio; + } + + if (Configuration::updateGlobalValue(self::prefijo . 'CATS_FEATURE', serialize($criteriosOrdenados))) { + $html = $this->displayConfirmation($this->l('Criterios guardados correctamente.')); } else { - $html .= $this->displayError($this->l('Ha ocurrido un error al guardar la configuracion.')); + $html = $this->displayError($this->l('Ha ocurrido un error.')); } break; @@ -186,10 +203,11 @@ class ImaxAddCatbyFeature extends Module { private function _configuracion() { include_once(dirname(__FILE__) . '/functionsForm.php'); include_once(dirname(__FILE__) . '/imaxAcordeon.php'); - $diasNovedad = Configuration::getGlobalValue(self::prefijo . 'DIAS_NOVEDAD'); - $catsNovedad = unserialize(Configuration::getGlobalValue(self::prefijo . 'CATS_NOVEDAD')); + $catsFeature = unserialize(Configuration::getGlobalValue(self::prefijo . 'CATS_FEATURE')); $token = Configuration::getGlobalValue(self::prefijo . 'TOKEN'); - $arbol = ''; + $numElementos = Configuration::getGlobalValue(self::prefijo . 'NUM_ELEMENTOS'); + $html = ''; + $respuesta = array(); // $acordeon = new imaxAcordeon($this->_path); @@ -197,11 +215,11 @@ class ImaxAddCatbyFeature extends Module { $form = new imaxForm($this, $this->_path); $form->createHidden("accion", "configuracion"); $form->createHidden("idTab", "1"); - $form->createHidden("catList", ""); - $form->addToForm($this->l('Buscador:') .$this->crearSelectCategorias()); - + $form->createFormTextGroup('numElementos', $numElementos, $this->l('Numero de elementos a procesar'), $this->l('Numero de elementos a procesar')); $form->createSubmitButton('opcionesConfiguracion', $this->l('Guardar')); - $html = $acordeon->renderAcordeon($this->l('Configuracion'), $form->renderForm()); + $html .= $acordeon->renderAcordeon($this->l('Configuracion'), $form->renderForm()); + + $html .= $acordeon->renderAcordeon($this->l('Categorizacion'), $this->getFunciones()->getFormCategorizacion(1)->renderForm()); unset($form); $form = new imaxForm($this, $this->_path); @@ -233,46 +251,77 @@ class ImaxAddCatbyFeature extends Module { } public function hookActionObjectProductAddAfter($params) { - //Si el producto es nuevo le agregamos categorias - $cats = unserialize(Configuration::getGlobalValue(self::prefijo . 'CATS_NOVEDAD')); - die(); - /* if($cats && time() - strtotime($params['object']->date_add) <= Configuration::getGlobalValue(self::prefijo.'DIAS_NOVEDAD') * 3600) { - $this->getFunciones()->agregarCategorias($params['object'], $cats); - } */ + $cats = $this->getFunciones()->getCategoriesByProductFeature($params['object']->id); + $this->getFunciones()->deshacerMovimientos($params['object']); + if ($cats) { + $this->getFunciones()->agregarCategorias($params['object'], $cats); + } + } + public function hookActionProductUpdate($params) { + $params['object'] = $params['product']; + $this->hookActionObjectProductUpdateAfter($params); + } + + public function hookActionObjectProductUpdateAfter($params) { + $cats = $this->getFunciones()->getCategoriesByProductFeature($params['object']->id); + $this->getFunciones()->deshacerMovimientos($params['object']); + if ($cats) { + $this->getFunciones()->agregarCategorias($params['object'], $cats); + } } /** - * Elimina las categorias agregadas a los productos que ya no son novedad. + * Añade o elimina las categorias a los productos que tienen o no las caracteristicas asociadas * @return int La cantidad de productos procesados. */ - /* public function procesar() { - $dias = (int)Configuration::getGlobalValue(self::prefijo.'DIAS_NOVEDAD'); - $productos = Db::getInstance()->executeS(' - SELECT DISTINCT m.id_product FROM `'._DB_PREFIX_.self::prefijo.'movimiento` m - INNER JOIN `'._DB_PREFIX_."product` p ON m.id_product = p.id_product - WHERE DATEDIFF(NOW(), date_add) > $dias"); - foreach($productos as $producto) { - $this->getFunciones()->deshacerMovimientos(new Product($producto['id_product'])); - } - - return count($productos); - } */ - public function procesar() { - if (!function_exists('procesar_')) { - $function = $this->getFunction(); - eval(gzuncompress(base64_decode($function))); + $lastProduct = (int) Configuration::getGlobalValue(self::prefijo . 'LAST_PRODUCT'); + $numElementos = (int) Configuration::getGlobalValue(self::prefijo . 'NUM_ELEMENTOS'); + if (!$numElementos) { + $numElementos = 100; + Configuration::updateGlobalValue(self::prefijo . 'NUM_ELEMENTOS', $numElementos); } - if (function_exists('procesar_')) { - return procesar_($this); + $sql = ' SELECT id_product ' + . ' FROM ' . _DB_PREFIX_ . 'product ' + . ' WHERE ' + . ' id_product > ' . $lastProduct . '' + . ' LIMIT 0,' . $numElementos; + $result = Db::getInstance()->executeS($sql); + if (!$result) { + Configuration::updateGlobalValue(self::prefijo . 'LAST_PRODUCT', 0); + } else { + foreach ($result AS $elemento) { + $producto = new Product($elemento['id_product']); + $this->getFunciones()->deshacerMovimientos($producto); + $cats = $this->getFunciones()->getCategoriesByProductFeature($elemento['id_product']); + if ($cats) { + $this->getFunciones()->agregarCategorias($producto, $cats); + } + + Configuration::updateGlobalValue(self::prefijo . 'LAST_PRODUCT', $elemento['id_product']); + } } - echo $this->l('Este modulo no tiene una licencia valida: ') . $this->name; - echo '
'; - echo $this->l('Contacte con nosotros para obtener una licencia valida'); - die(); + return count($result); } + /* + public function procesar() { + if (!function_exists('procesar_')) { + $function = $this->getFunction(); + eval(gzuncompress(base64_decode($function))); + } + if (function_exists('procesar_')) { + return procesar_($this); + } + + echo $this->l('Este modulo no tiene una licencia valida: ') . $this->name; + echo '
'; + echo $this->l('Contacte con nosotros para obtener una licencia valida'); + die(); + } + */ + public function l($msg, $modulo = '', $locale = null) { if ($modulo == '') { $modulo = 'traducciones' . strtolower($this->name); @@ -309,7 +358,7 @@ class ImaxAddCatbyFeature extends Module { $form->createHidden("accion", "configurarCriteriosNovedad"); $form->createHidden("idTab", $idTab); $form->createFormTextGroup('numDiasNovedad', $numDiasNovedad, $this->modulo->l('Numero de dias a restar para los productos no nuevos')); - // $form->addToForm($this->crearSelectCategorias()); + // $form->addToForm($this->crearSelectCategorias()); /* $form->addToForm('