FuncionesImaxAddCatbyFeature.php 3.39 KB
<?php

class FuncionesImaxAddCatbyFeature {
	private $modulo;
	
	public function __construct($modulo) {
		$this->modulo = $modulo;
	}
    
    /**
     * 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));
        }
        $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) {
        $categoriasHijos = Category::getChildren($categoria['id_category'], $this->modulo->idLang);

        if (count($categoriasHijos)) {
            $html .= '<ul>';
            foreach ($categoriasHijos AS $categoriaHijo) {
                if (in_array($categoriaHijo['id_category'], $categoriasSeleccionada)) {
                    $seleccionada = 'class="selected"';
                } 
                else {
                    $seleccionada = '';
                }

                $html .= "<li id='{$categoriaHijo['id_category']}' $seleccionada>{$categoriaHijo['name']}";
                $this->getHijosLista($categoriaHijo, $html, $categoriasSeleccionada);

                $html .= '</li>';
            }
            $html .= '</ul>';
        }
    }
}