Ver Mensaje Individual
  #8 (permalink)  
Antiguo 27/08/2013, 10:16
Nisrokh
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 15 años, 2 meses
Puntos: 12
Respuesta: [APORTE] Estructura de árbol desde de base de datos

Ahora, un ejemplo igual al anterior, pero con el código orientado a objetos:

Nota: sólo por si acaso, les comento que me gusta utilizar siempre "camelCase" en código orientado a objetos y clases, y con guión bajo en funciones. Por eso mísmo, notar ésta diferencia: en las opciones por defecto de la función, utilizan guión bajo, y en la orientada a objetos, "camelCase" (por eso el alias en la consulta).

Código PHP:
Ver original
  1. <?php
  2.  
  3. use Diba\GenericTree\Node;
  4. use Diba\GenericTree\NodeList;
  5. use Diba\GenericTree\TableTree;
  6. use Diba\GenericTree\TableTreeOptions;
  7. use Diba\GenericTree\TableTreeHelper;
  8.  
  9. // MySQL info.
  10. define('MYSQL_HOSTNAME', 'localhost');
  11. define('MYSQL_USERNAME', 'root');
  12. define('MYSQL_PASSWORD', '123456');
  13. define('MYSQL_DATABASE', 'test');
  14.  
  15. // Crear conexión
  16. try {
  17.     $sqlConnection = new PDO(
  18.         'mysql:dbname=' .MYSQL_DATABASE. ';host=' .MYSQL_HOSTNAME,
  19.         MYSQL_USERNAME,
  20.         MYSQL_PASSWORD
  21.     );
  22. } catch (PDOException $e) {
  23.     exit(sprintf(
  24.         'Database connection error: %s', $e->getMessage()
  25.     ));
  26. }
  27.  
  28. $sqlConnection->query('SET NAMES \'utf8\'');
  29.  
  30. // Obtener todas las filas del grupo "0"
  31. $sqlQuery = '
  32.     SELECT
  33.         links.id,
  34.         links.name,
  35.         links_hierarchy.group_id AS groupId,
  36.         links_hierarchy.parent_id AS parentId,
  37.         links_hierarchy.order_no AS orderNo
  38.     FROM links
  39.     INNER JOIN links_hierarchy
  40.         ON links_hierarchy.link_id = links.id
  41.     WHERE links_hierarchy.group_id = :group
  42.         AND links.id > 0
  43. ';
  44.  
  45. // Crear "statement"
  46. $sqlStatement = $sqlConnection->prepare($sqlQuery);
  47. $sqlStatement->bindValue(':group', 0, PDO::PARAM_INT);
  48. $sqlStatement->execute();
  49.  
  50. // Obtener los resultados
  51. $sqlResult = $sqlStatement->fetchAll(PDO::FETCH_OBJ);
  52.  
  53. // Aplicar shuffle() sólo para demostrarles que no importa el orden, el árbol
  54. // siempre se construirá normalmente
  55. shuffle($sqlResult);
  56.  
  57. // Crear árbol desde la tabla de datos
  58. $treeOptions = new TableTreeOptions();
  59. $treeOptions->setIdKey('id');
  60. $treeOptions->setParentIdKey('parentId');
  61. $treeOptions->setComparator(function($a, $b) {
  62.     $a = $a->getValue()->name;
  63.     $b = $b->getValue()->name;
  64.    
  65.     return strcasecmp($a, $b);
  66. });
  67.  
  68. $tree = new TableTree($treeOptions);
  69. $tree->build($sqlResult, true);


Bueno, eso es todo amigos... Espero que les sea útil y les haya gustado.

Les dejo un ejemplo online donde implementé el código con un menú (jQuery Sooperfish Menu Plugin), un breadcrumb, y algo similar a un "Tree View" (jQuery Nested Sortable Plugin) para administrar las ubicaciones con un simple "Drag and Drop":

http://test.dpmbaltar.com.ar/tree/ex...procedural.php

¡Hasta luego!
__________________
Amigos de Foros del Web: seamos más solidarios. ¡No dejemos que un tema se valla al final de las páginas con 0 (cero) respuestas! ¡Gracias por su ayuda! :-)

Última edición por Nisrokh; 27/08/2013 a las 10:33