Skip to content

Categorías

Módulo para añadir categorías a cualquier módulo de bPanel 4.

Instalación

Para instalar las categorías en un módulo, hay que seguir varios pasos.

Templates

En los templates de create y edit, hay que añadir el select de categorías:

<x-bpanel4-category::select :model="$model" :categories="$categories" :multiple="true"/>
Los parámetros son: - model: modelo al que se quieren asignar las categorías - categories: Collection de categorías disponibles, por ejemplo, categorías de productos si el modelo es un producto, categorías del blog si es una entrada, etc - multiple: si se puede seleccionar más de una categoría

Traducciones

En el archivo breadcrumbs.php de las traducciones del módulo, añadir:

'editCategory' => 'Editar categoría',  
'createCategory' => 'Crear categoría',  
'category' => 'Categorías',  
En el archivo principal de traducciones (por ejemplo, product.php si estamos en el módulo product, añadir:

'active' => 'Activado',  
'featured' => 'Destacado',  

Comando de instalación

Si el módulo tiene un comando de instalación, habrá que añadir lo siguiente en el método handle;

AdminMenuFacade::createAction('module', 'Categorías', 'category', 'fa fa-sitemap');  
CategoryFacade::addPermission('module');  
CategoryFacade::createTabs('modulo', 'Listado de XXXXXX'); // Productos, entradas, etc  

 ```   

### Modelo

En el modelo al que se quieren añadir categorías, añadir:

```php  
use HasCategorizable;  

Controlador

Añadir:

use CategoryController;  

En el constructor, llamar a:

$this->setCategoryControllerProperties(Model::class);  

Habrá que sustituir Model por la clase correspondiente al modelo del módulo al que se quieren añadir categorías.

Métodos del controlador:

Hay que añadir lo siguiente a los distintos métodos del controlador, sustituyendo Model por el modelo del módulo:

Create y edit
Pasar la variable categories a la vista:

->with([  
...  
'categories' => CategoryFacade::getAllAsArray(Model::class),  
...  

Store y update

CategoryFacade::associateToModel($model, $category);

Parámetros: - model: modelo al que se quieren asociar las categorías - category: el resultado de $request->input('category'), donde category es el name del campo <x-bpanel4-category::select/> ('category' por defecto)

Nota: Model debe haber sido guardado (debe tener id)

Destroy
Nota: no he comprobado este método al hacer la documentación, que alguien lo actualice si hay que hacer algún cambio.

if (is_null($request->input('category'))) {    
    CategoryFacade::deleteModelCategorizable($model);  
} else {      
    CategoryFacade::associateWithCategory($model, $request->input('category'));  
}  

Rutas

 CategoryFacade::addRoutes('module', Model::class, ModuleController::class);    

 ```   

Habrá que sustituir `'module'` por el nombre del módulo, `Model` por la clase del modelo y `ModuleController` por el controlador al que hemos añadido el trait `CategoryController`.

## Shortcodes

Se puede usar un shortcode para generar un listado de categorías, por ejemplo:
[category-list parentId="" model="Bittacora\Bpanel4\Products\Models\Product" linktemplate="/productos?categories%5B0%5D=:id:"]
- `parent-id`: Id de la categoría padre, o "" si se quieren listar las categorías "raíz"
- `model`: Modelo que está asociado a las categorías que se quieren listar (ver tabla `category` de la base de datos)
- `linktemplate`: String a usar como plantilla para generar los enlaces. `:id:` se sustituirá por el ID de la categoría, y `:slug:` por el slug
- `view`: Aunque no sale en el ejemplo, con este parámetro se puede especificar la vista de blade que se usará para generar el listado. Por defecto se usará `bpanel4-category::shortcodes.category-list`

## Ejemplos

### Filtrar por varias categorías

Si se quieren seleccionar todos los productos que están en alguna de las categorías seleccionadas, puede usarse lo siguiente:

```php  
$model->whereHas('categorizable', function ($model) use ($categories) {  
    $model->whereIn('category_id', $categories);
});

$categories es un array con las categorías por las que se quiere filtrar.