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 .= '
';
foreach ($categoriasHijos AS $categoriaHijo) {
- if (in_array($categoriaHijo['id_category'], $categoriasSeleccionada)) {
- $seleccionada = 'class="selected"';
- }
- else {
- $seleccionada = '';
- }
+ $respuesta[$categoriaHijo['id_category']] = $categoriaHijo['name'] . ' (' . $categoriaHijo['id_category'] . ')';
+ $this->getHijosSelect($categoriaHijo, $respuesta);
+ }
+ }
+
+ }
- $html .= "- {$categoriaHijo['name']}";
- $this->getHijosLista($categoriaHijo, $html, $categoriasSeleccionada);
+ public function getFormCategorizacion($idTab) {
+ //Datos para js
+ $caracteristicas = Feature::getFeatures($this->modulo->idLang);
+ $caracteristicasFormateadas = array(0 => $this->modulo->l('- Seleccione uno -'));
+ $valoresCaracteristicaFormateados = array();
+ foreach ($caracteristicas as $caracteristica) {
+ $caracteristicasFormateadas[$caracteristica['id_feature']] = $caracteristica['name'];
+ $valoresCaracteristica = FeatureValue::getFeatureValuesWithLang($this->modulo->idLang, $caracteristica['id_feature']);
+ if ($valoresCaracteristica) {
+ foreach ($valoresCaracteristica as $valorCaracteristica) {
+ if (!isset($valoresCaracteristicaFormateados[$caracteristica['id_feature']])) {
+ $valoresCaracteristicaFormateados[$caracteristica['id_feature']] = array(0 => $this->modulo->l('- Seleccione uno -'));
+ }
- $html .= '
';
+ $valoresCaracteristicaFormateados[$caracteristica['id_feature']][$valorCaracteristica['id_feature_value']] = $valorCaracteristica['value'];
+ }
+ } else {
+ $valoresCaracteristicaFormateados[$caracteristica['id_feature']] = array(0 => $this->modulo->l('- Seleccione uno -'));
}
- $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('