FuncionesImaxAddCatbyFeature.php 6.72 KB
<?php

class FuncionesImaxAddCatbyFeature {

    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.
     * @param Product $producto
     * @param int[] $categorias
     */
    public function agregarCategorias($producto, $categorias) {
        $categoriasActuales = $producto->getCategories();
        $nuevasCategorias = array_diff($categorias, $categoriasActuales);
        foreach ($nuevasCategorias as $categoria) {
            $this->guardarMovimiento($producto->id, $categoria);
        }
        $producto->addToCategories($nuevasCategorias);
    }

    /**
     * Anota una nueva categoria de producto.
     * @param int $id_product
     * @param int $id_category
     * @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')");
    }

    /**
     * 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'");
        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'");
    }

    /**
     * Quita al producto las categorias agregadas.
     * @param Product $producto
     */
    public function deshacerMovimientos($producto) {
        $idsCategoria = $this->cargarMovimientos($producto->id);
        $num = count($idsCategoria);
        
        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 getHijosSelect($categoria, &$respuesta) {
        $categoriasHijos = Category::getChildren($categoria['id_category'], $this->modulo->idLang);
        if (count($categoriasHijos)) {
            foreach ($categoriasHijos AS $categoriaHijo) {
                $respuesta[$categoriaHijo['id_category']] = $categoriaHijo['name'] . ' (' . $categoriaHijo['id_category'] . ')';
                 $this->getHijosSelect($categoriaHijo, $respuesta);
            }
        }
        
    }

    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 -'));
                    }

                    $valoresCaracteristicaFormateados[$caracteristica['id_feature']][$valorCaracteristica['id_feature_value']] = $valorCaracteristica['value'];
                }
            } else {
                $valoresCaracteristicaFormateados[$caracteristica['id_feature']] = array(0 => $this->modulo->l('- Seleccione uno -'));
            }
        }
        $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('
            <script>
                var caracteristicasFormateadas = ' . json_encode($caracteristicasFormateadas) . ';
                var valoresCaracteristicaFormateados = ' . json_encode($valoresCaracteristicaFormateados) . ';
                var tiposFormateados = ' . json_encode($tiposFormateados) . ';
                var criteriosSeleccionados = ' . json_encode(unserialize(Configuration::getGlobalValue($this->modulo->sufijo . 'CATS_FEATURE'))) . ';
            </script>
            <table id="tablaCriteriosCategorizacion" class="table">
                <thead>
                    <tr><th>' . $this->modulo->l('Caracteristica') . '</th><th>' . $this->modulo->l('Valor caracteristica') . '</th><th>' . $this->modulo->l('Categoria') . '</th><th></th></tr>
                </thead>
                <tbody></tbody>
            </table>');
        $form->createButton('agregarCriterio', $this->modulo->l('Nuevo'));
        $form->createSubmitButton('save', $this->modulo->l('Guardar'));
        return $form;
    }

}