Probando Nested Set Behavior

Buenas a todos los compañeros yii,

he estado probando la extensión nestedsetbehavior ubicada en la siguiente direccion

http://www.yiiframework.com/extension/nestedsetbehavior

la verdad no he entendido cómo es que funciona la extensión, a continuacion las dudas:

  1. al crear el root

$root=new Root;

$root->title='Mobile Phones';

$root->saveNode();



sin embargo en la base de datos no menciona el campo title, tampoco existe tal Root como modelo, simplemente existe la tabla categoría.

Les agradezco anticipadamente.

Hola Datevid,

La extensión es una behavior, es decir, puede aplicarse a cualquier modelo, … entonces en el ejemplo en cuestión se asume un modelo llamado "Root" que tiene una propiedad "title", además de las propiedades o campos propios de la extensión.

Saludos.

Hola robregonm, gracias por responder.

¿probaste la extensión?, me gustaría que lo pruebes y me aclares esta duda que tengo.

hasta donde yo tengo entendido Root forma parte de Category, o de donde sale esto?


$roots=Category::model()->roots()->findAll();

segun la linea arriba se está aplicando al modelo Category

[/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"]Esto dice la documentación, lo que indica que el behavior adiciona esa función o scope para devolver de Category, sólo los elementos raíces, es decir, que no tienen padres.[/size][/font][/color]

[color="#222222"][font="Arial, sans-serif"][size="4"]Saludos[/size][/font][/color]

Robregonm,

no logro echar andar esta extensión…

podrías orientarme sobre qué tablas tengo que usar?

tengo entendido que la primera tabla a usar es category


CREATE TABLE `category` (

  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

  `root` INT(10) UNSIGNED DEFAULT NULL,

  `lft` INT(10) UNSIGNED NOT NULL,

  `rgt` INT(10) UNSIGNED NOT NULL,

  `level` SMALLINT(5) UNSIGNED NOT NULL,

  PRIMARY KEY (`id`),

  KEY `root` (`root`),

  KEY `lft` (`lft`),

  KEY `rgt` (`rgt`),

  KEY `level` (`level`)

);

ahora necesito otra tabla clasificación?, en caso de que asi sea

que campos debe tener?

que hay de la tabla root?

Gracias Robregonm

Sí y No, básicamente lo que hay que hacer es que las tablas que necesiten tener el "anidamiento" o "jerarquía" o "nodos" deben incluir los campos de la extensión… que en el caso del ejemplo es la tabla Category, que asumo que tiene los campos:

  • id // La llave primaria

  • title // Este es de la tabla como tal

  • lft //Nodo anterior, que puede ser NULL para los casos en que sea Root

  • rgt // Nodo derecho

  • level // Nivel

Saludos

Creo que el asunto es más de comprensión de lo que es un behavior, que palabras más, palabras menos, es el método que utiliza yii para permitir herencia múltiple, porque internamente cuando una función o variable no existe en la clase como tal, entonces procede a buscarlas en los behaviors asociados al modelo.

Un behavior NO es un modelo en sí, ni es un controlador… es sencillamente una clase que contiene funciones y variables que pueden "adjuntarse" a otra clase para su posterior uso.

Podríamos verlo en cierto modo como los traits de PHP 5.4, pero para PHP 5.2 que no soporta este tipo de cosas.

Saludos.

Hola robregonm, gracia por la información logré hacer funcionar la extensión.


CREATE TABLE IF NOT EXISTS `clasificaciones` (

  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

  `root` int(10) unsigned DEFAULT NULL,

  `lft` int(10) unsigned DEFAULT NULL,

  `rgt` int(10) unsigned DEFAULT NULL,

  `level` smallint(5) unsigned DEFAULT NULL,

  `nombre` varchar(100) NOT NULL,

  `descripcion` text,

  PRIMARY KEY (`id`),

  KEY `root` (`root`),

  KEY `lft` (`lft`),

  KEY `rgt` (`rgt`),

  KEY `level` (`level`)

) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;



y para crear un nuevo nodo se realiza de esta forma




$root = new Category();

$root->nombre = 'root'; 

$root->saveNode( false );



ahora si logré entender la funcionalidad y la forma de hacerlo(considerando que en la tabla category existe el campo nombre), sólo un único detalle; como modifico el nombre de un nodo ya creado? y como puedo crear un front-end para mostrar esto, si hay una extensión perfecto, y si no, bueno ahora puedo hacerlo con lo que tengo. Gracias una vez mas :D

Hola datevid,

No he usado la extensión, pero podría suponer que como cualquier otro modelo usando las funciones de CActiveRecord:




$model = Category::model()->findByPk($id); // o findByAttributes, o find()...

$model->nombre = 'Otro nombre';

$model->saveNode(false); // No estoy seguro si solo con save() funciona, tocaría leer la documentación al respecto.



Saludos.

Hola a todos,

Digamos que tengo las tablas de productos y categorias con llave foranea, el problema que tengo es a la hora de eliminar categorias

Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails.

que puedo hacer en este caso.