TUTORIAL: Las jerarquías de menú y Pan rallado

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13455
  • Loc: Florida
  • Status: Offline

Nota Abril 29th, 2010, 10:38 am

Introducción



Escribí este tutorial, debido a este hilo y, posteriormente, este hilo . Estaba empezando a frustrarse con tratar de explicarme a mí mismo sin salirse de un montón de direcciones así que pensé que sería más fácil comenzara desde el principio y recorrer el código que uso al hacer este tipo de cosas.

Esto no es un novato tutorial, asume tu tienes un mango en PHP y MySQL en su mayor parte y son quizás explorando nuevas maneras de hacer las cosas.


Categorías tabla de base de datos



Primero necesito una tabla de base de datos para almacenar mis categorías. A efectos de ejemplo, sólo necesito tres columnas para mantener una jerarquía.

SQL Código: [ Select ]
CREATE TABLE `categories` (
  `category_id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  `parent_id` smallint(6) UNSIGNED DEFAULT NULL,
  `label` varchar(64) NOT NULL,
  PRIMARY KEY  (`category_id`),
)
  1. CREATE TABLE `categories` (
  2.   `category_id` smallint(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `parent_id` smallint(6) UNSIGNED DEFAULT NULL,
  4.   `label` varchar(64) NOT NULL,
  5.   PRIMARY KEY  (`category_id`),
  6. )


category_id como se puede ver es un auto_increment y mi clave principal. Malos utilizar esta columna para hacer un seguimiento de cada categoría individual y esta columna con hacer referencia a recortar not_id para crear una jerarquía. etiqueta es exactamente lo que suena, el nombre legible de la categoría.

Si un pare categorías not_id es siempre NULL, sé que es una categoría de raíz y no una sub-categoría.


Consultar La base de datos



Mi primer instinto sería pedir a la base de datos para todas las categorías de raíz, o categorías con un NULL not_id pare. Esta es una mala idea, sin embargo, eso significa que necesita hacer otra consulta para recuperar el sub-categorías, y luego tengo que hacer más consultas para recuperar el sub-categorías de las sub-categorías, y así sucesivamente. Si tengo 4 categorías de la raíz con 4 sub-categorías que cada uno tiene 2 sub-categorías, necesito un montón de preguntas. Eso es como seguir una receta en un libro de cocina e ir a la tienda y comprar de cada ingrediente como llegue a ella en la lista de ingredientes recetas.

En su lugar, me voy a utilizar una consulta. Una consulta sencilla que sólo saca cada fila de la tabla a la vez sin clasificación ni nada.

SQL Código: [ Select ]
SELECT category_id, parent_id, label
FROM categories;
  1. SELECT category_id, parent_id, label
  2. FROM categories;


Ahora para una discusión de rosca o algo probable que vuelva a cientos de miles de filas, probablemente sería una idea horrible debido a la cantidad de memoria se perdería la celebración de la tabla completa en la mayoría de las solicitudes. (Un escenario mucho más probable sería el funcionamiento de memoria) Pero para los fines de las categorías en que puede ser su probable es que la mayoría de filas utilizadas en cada solicitud y siempre que, suponiendo que tengo el 65535 categorías mis cuentas de SMALLINT, sólo utilizará 16 millones de .

¿Por qué iba alguna vez tengo 65535 categorías? La única razón que utiliza un SMALLINT, en primer lugar es para proporcionar espacio para las categorías eliminado.
Yo no recuerdo haber visto una página web, que es realmente utilizable, utilizando incluso 1000 categorías. Heck, creo que la categoría más alta de identificación para cualquiera de los foros Ozzus es sólo en la baja en la mayoría de 100s.

Usando que la mayoría de base de la tabla de base de datos que tengo allí, básicamente, me da 4 categorías por cada 1 KB.


Jerarquía



En primer lugar quiero una variable para construir mi jerarquía pulg Quiero configurar esta jerarquía en una forma que puedan ser utilizados por las rutinas para la construcción de numerosos elementos de navegación. La idea aquí es crear una vez y reutilizarlo varias veces.

PHP Código: [ Select ]
$category_lineage = new array();


Im que va a utilizar la extensión MySQLi PHP y se supone que está familiarizado con ella, es decir, me voy a saltar todas las piezas de conexión y te dicen que de aquí en adelante $ db es la base de datos de objeto devuelto por " $ db = nueva mysqli (...); "

Utilizando el método de consulta MySQLi objetos, saco todas las filas utilizando la consulta anterior. Quiero reiterar esta consulta para que pueda señalar que estoy usando la bandera mysqli_use_result cuando en realidad la ejecución de la consulta. Puedo usar esta bandera para que el paso de recuperar las filas antes de usarlos se omite. Sin utilizar esta bandera que sería básicamente la recuperación de las filas de dos veces ya que no desea ejecutar cualquier tipo de duda antes de Ive interactúa a través de las filas de retorno y, por tanto, no se preocupe acerca de los errores de sincronización de consulta.

PHP Código: [ Select ]
$result = $db->query('SELECT category_id, parent_id, label FROM categories', MYSQLI_USE_RESULT);


Con $ resultado la celebración de una referencia a las filas de mi categoría, puedo empezar iteración a través de las filas y llenando mi category_lineage $ utilizando el category_id como el índice de matriz en lugar de limitarse a dejar que PHP asigna los índices.

PHP Código: [ Select ]
while($row = $result->fetch_object())
{
   $row->sub_categories = array();
   $category_lineage[$row->category_id] = $row;
}
$result->close();
  1. while($row = $result->fetch_object())
  2. {
  3.    $row->sub_categories = array();
  4.    $category_lineage[$row->category_id] = $row;
  5. }
  6. $result->close();


La razón por la que el uso category_lineage $ [] $ row-> category_id = $ fila; en lugar de utilizar, por ejemplo, category_lineage $ [] = $ fila; es que quiero una respuesta rápida si una category_id existe cuando tengo que responder a esa pregunta, si Im pidiendo un control de seguridad, o cuando Im que busca no para el pare de una sub-categoría.

Por ejemplo, si un usuario desea ver la página category_id "12" me puede pasar rápidamente a $ category_lineage y ver si existe ese índice.

PHP Código: [ Select ]
if( empty($category_lineage[(int)$_GET['category_id']]))
{
    // bail on account of non-existant category
}
  1. if( empty($category_lineage[(int)$_GET['category_id']]))
  2. {
  3.     // bail on account of non-existant category
  4. }


Sin el $ I category_lineage probablemente se preguntan sobre la base de datos para ver si existe la categoría. Desde Im más que probablemente va a necesitar los $ category_lineage de elementos de menú y otras cosas de todos modos, yo podría también revisar su contra en lugar de pedir a la base de datos si existe una categoría.

Otra cosa que usted notará es que estoy añadiendo una serie de sub-categorías a la fila de objeto devuelto. Podría pasar el argumento de nombre de la clase fetch_object tener esta matriz añadido automáticamente a través de una clase, sino por el bien de este ejemplo Im apenas va a hacer como que tengo a continuación.

PHP Código: [ Select ]
$row->sub_categories = array();


A primera vista puede parecer Im va a llenar la matriz con otras matrices para crear una matriz multi-dimensional para la jerarquía, pero no soy. Ese array subcategoría en realidad sólo contienen referencias a otros artículos en los $ category_lineage.

Heres la matriz enfermedad tiene después de Ive recuperar todas las filas de la base de datos y configuración de una matriz para que contenga las referencias subcategoría.
Nota cómo la propiedad de cada category_id corresponde a la clave matriz de elementos / index.
Código: [ Select ]
Array
(
    [1] => stdClass Object
        (
            [category_id] => 1
            [parent_id] =>
            [label] => Sports
            [sub_categories] => Array()
        )
    [2] => stdClass Object
        (
            [category_id] => 2
            [parent_id] => 1
            [label] => Baseball
            [sub_categories] => Array()
        )
    [5] => stdClass Object
        (
            [category_id] => 5
            [parent_id] => 1
            [label] => Basketball
            [sub_categories] => Array()
        )
    [8] => stdClass Object
        (
            [category_id] => 8
            [parent_id] => 1
            [label] => Hockey
            [sub_categories] => Array()
        )
    [11] => stdClass Object
        (
            [category_id] => 11
            [parent_id] => 1
            [label] => Football
            [sub_categories] => Array()
        )
    [14] => stdClass Object
        (
            [category_id] => 14
            [parent_id] =>
            [label] => Babes
            [sub_categories] => Array()
        )
    [15] => stdClass Object
        (
            [category_id] => 15
            [parent_id] => 14
            [label] => Eva Mendes
            [sub_categories] => Array()
        )
    [16] => stdClass Object
        (
            [category_id] => 16
            [parent_id] => 14
            [label] => Elisha Cuthbert
            [sub_categories] => Array()
        )
    [21] => stdClass Object
        (
            [category_id] => 21
            [parent_id] =>
            [label] => test
            [sub_categories] => Array()
        )
)
  1. Array
  2. (
  3.     [1] => stdClass Object
  4.         (
  5.             [category_id] => 1
  6.             [parent_id] =>
  7.             [label] => Sports
  8.             [sub_categories] => Array()
  9.         )
  10.     [2] => stdClass Object
  11.         (
  12.             [category_id] => 2
  13.             [parent_id] => 1
  14.             [label] => Baseball
  15.             [sub_categories] => Array()
  16.         )
  17.     [5] => stdClass Object
  18.         (
  19.             [category_id] => 5
  20.             [parent_id] => 1
  21.             [label] => Basketball
  22.             [sub_categories] => Array()
  23.         )
  24.     [8] => stdClass Object
  25.         (
  26.             [category_id] => 8
  27.             [parent_id] => 1
  28.             [label] => Hockey
  29.             [sub_categories] => Array()
  30.         )
  31.     [11] => stdClass Object
  32.         (
  33.             [category_id] => 11
  34.             [parent_id] => 1
  35.             [label] => Football
  36.             [sub_categories] => Array()
  37.         )
  38.     [14] => stdClass Object
  39.         (
  40.             [category_id] => 14
  41.             [parent_id] =>
  42.             [label] => Babes
  43.             [sub_categories] => Array()
  44.         )
  45.     [15] => stdClass Object
  46.         (
  47.             [category_id] => 15
  48.             [parent_id] => 14
  49.             [label] => Eva Mendes
  50.             [sub_categories] => Array()
  51.         )
  52.     [16] => stdClass Object
  53.         (
  54.             [category_id] => 16
  55.             [parent_id] => 14
  56.             [label] => Elisha Cuthbert
  57.             [sub_categories] => Array()
  58.         )
  59.     [21] => stdClass Object
  60.         (
  61.             [category_id] => 21
  62.             [parent_id] =>
  63.             [label] => test
  64.             [sub_categories] => Array()
  65.         )
  66. )


Heres donde el uso de estas referencias combinadas con las teclas elemento significativo realmente viene en práctico. En lugar de iteración a través de la matriz y para cada elemento iteración a través de la matriz de nuevo en busca de elementos con el elemento actual como el no pare de identificación, lo único que recorrer en iteración la matriz category_lineage un dólares momento de construir la jerarquía completa.

Código: [ Select ]
foreach($category_lineage as $key => $val)
{
    if($val->parent_id)
    {
        $category_lineage[$val->parent_id]->sub_categories[$key] =& $category_lineage[$key];
    }
}
  1. foreach($category_lineage as $key => $val)
  2. {
  3.     if($val->parent_id)
  4.     {
  5.         $category_lineage[$val->parent_id]->sub_categories[$key] =& $category_lineage[$key];
  6.     }
  7. }


Tenga en cuenta que category_lineage $ sigue siendo una matriz de dos dimensiones, pero cuando utilizo el print_r esta vez me sale el siguiente resultado.

Código: [ Select ]
Array
(
  [1] => stdClass Object
    (
      [category_id] => 1
      [parent_id] =>
      [label] => Sports
      [sub_categories] => Array
        (
          [2] => stdClass Object
            (
              [category_id] => 2
              [parent_id] => 1
              [label] => Baseball
              [sub_categories] => Array()
            )
          [5] => stdClass Object
            (
              [category_id] => 5
              [parent_id] => 1
              [label] => Basketball
              [sub_categories] => Array()
            )
          [8] => stdClass Object
            (
              [category_id] => 8
              [parent_id] => 1
              [label] => Hockey
              [sub_categories] => Array()
            )
          [11] => stdClass Object
            (
              [category_id] => 11
              [parent_id] => 1
              [label] => Football
              [sub_categories] => Array()
            )
        )
    )
  [2] => stdClass Object
    (
      [category_id] => 2
      [parent_id] => 1
      [label] => Baseball
      [sub_categories] => Array()
    )
  [5] => stdClass Object
    (
      [category_id] => 5
      [parent_id] => 1
      [label] => Basketball
      [sub_categories] => Array()
    )
  [8] => stdClass Object
    (
      [category_id] => 8
      [parent_id] => 1
      [label] => Hockey
      [sub_categories] => Array()
    )
  [11] => stdClass Object
    (
      [category_id] => 11
      [parent_id] => 1
      [label] => Football
      [sub_categories] => Array()
    )
  [14] => stdClass Object
    (
      [category_id] => 14
      [parent_id] =>
      [label] => Babes
      [sub_categories] => Array
        (
          [15] => stdClass Object
            (
              [category_id] => 15
              [parent_id] => 14
              [label] => Eva Mendes
              [sub_categories] => Array()
            )
          [16] => stdClass Object
            (
              [category_id] => 16
              [parent_id] => 14
              [label] => Elisha Cuthbert
              [sub_categories] => Array()
            )
        )
    )
  [15] => stdClass Object
    (
      [category_id] => 15
      [parent_id] => 14
      [label] => Eva Mendes
      [sub_categories] => Array()
    )
  [16] => stdClass Object
    (
      [category_id] => 16
      [parent_id] => 14
      [label] => Elisha Cuthbert
      [sub_categories] => Array()
    )
  [21] => stdClass Object
    (
      [category_id] => 21
      [parent_id] =>
      [label] => test
      [sub_categories] => Array()
    )
)
  1. Array
  2. (
  3.   [1] => stdClass Object
  4.     (
  5.       [category_id] => 1
  6.       [parent_id] =>
  7.       [label] => Sports
  8.       [sub_categories] => Array
  9.         (
  10.           [2] => stdClass Object
  11.             (
  12.               [category_id] => 2
  13.               [parent_id] => 1
  14.               [label] => Baseball
  15.               [sub_categories] => Array()
  16.             )
  17.           [5] => stdClass Object
  18.             (
  19.               [category_id] => 5
  20.               [parent_id] => 1
  21.               [label] => Basketball
  22.               [sub_categories] => Array()
  23.             )
  24.           [8] => stdClass Object
  25.             (
  26.               [category_id] => 8
  27.               [parent_id] => 1
  28.               [label] => Hockey
  29.               [sub_categories] => Array()
  30.             )
  31.           [11] => stdClass Object
  32.             (
  33.               [category_id] => 11
  34.               [parent_id] => 1
  35.               [label] => Football
  36.               [sub_categories] => Array()
  37.             )
  38.         )
  39.     )
  40.   [2] => stdClass Object
  41.     (
  42.       [category_id] => 2
  43.       [parent_id] => 1
  44.       [label] => Baseball
  45.       [sub_categories] => Array()
  46.     )
  47.   [5] => stdClass Object
  48.     (
  49.       [category_id] => 5
  50.       [parent_id] => 1
  51.       [label] => Basketball
  52.       [sub_categories] => Array()
  53.     )
  54.   [8] => stdClass Object
  55.     (
  56.       [category_id] => 8
  57.       [parent_id] => 1
  58.       [label] => Hockey
  59.       [sub_categories] => Array()
  60.     )
  61.   [11] => stdClass Object
  62.     (
  63.       [category_id] => 11
  64.       [parent_id] => 1
  65.       [label] => Football
  66.       [sub_categories] => Array()
  67.     )
  68.   [14] => stdClass Object
  69.     (
  70.       [category_id] => 14
  71.       [parent_id] =>
  72.       [label] => Babes
  73.       [sub_categories] => Array
  74.         (
  75.           [15] => stdClass Object
  76.             (
  77.               [category_id] => 15
  78.               [parent_id] => 14
  79.               [label] => Eva Mendes
  80.               [sub_categories] => Array()
  81.             )
  82.           [16] => stdClass Object
  83.             (
  84.               [category_id] => 16
  85.               [parent_id] => 14
  86.               [label] => Elisha Cuthbert
  87.               [sub_categories] => Array()
  88.             )
  89.         )
  90.     )
  91.   [15] => stdClass Object
  92.     (
  93.       [category_id] => 15
  94.       [parent_id] => 14
  95.       [label] => Eva Mendes
  96.       [sub_categories] => Array()
  97.     )
  98.   [16] => stdClass Object
  99.     (
  100.       [category_id] => 16
  101.       [parent_id] => 14
  102.       [label] => Elisha Cuthbert
  103.       [sub_categories] => Array()
  104.     )
  105.   [21] => stdClass Object
  106.     (
  107.       [category_id] => 21
  108.       [parent_id] =>
  109.       [label] => test
  110.       [sub_categories] => Array()
  111.     )
  112. )


Recuerde, $ category_lineage sigue siendo una matriz de dos dimensiones. Se puede ser reiterado, como una jerarquía de profundidad ilimitada, debido a referencias en lugar de valores copiados sin embargo.

Mostrar



Volviendo al ejemplo de antes, donde empty () se utiliza para ver si la categoría solicitada por el usuario existe, y se va a asumir que la categoría no existe a los efectos de este tutorial y me voy a referir a los $ controlados _GET ["category_id"] como current_category $ de aquí en adelante.

PHP Código: [ Select ]
$current_category = (int)$_GET['category_id'];


¿Cómo podría generar una lista de enlaces para migas de pan a la categoría actual?

PHP Código: [ Select ]
   $t->breadcrumbs            = new stdClass;
   $t->breadcrumbs->current   =& $category_lineage[$current_category];
   $t->breadcrumbs->url_mask  = 'index.php?category_id=%1$s&category_label=%2$s&page=%3$s';
 
   $t->breadcrumbs->links = array(
      sprintf('<a href="%1$s">%2$s</a>',
         sprintf($t->breadcrumbs->url_mask, $t->breadcrumbs->current->category_id, $t->breadcrumbs->current->label, 1),
         $t->breadcrumbs->current->label
      )
   );
 
   while($t->breadcrumbs->current->parent_id)
   {
      $t->breadcrumbs->current =& $category_lineage[$t->breadcrumbs->current->parent_id];
      array_unshift(
         $t->breadcrumbs->links,
         sprintf('<a href="%1$s">%2$s</a>',
            sprintf($t->breadcrumbs->url_mask, $t->breadcrumbs->current->category_id, $t->breadcrumbs->current->label, 1),
            $t->breadcrumbs->current->label
         )
      );
   }
 
   $t->breadcrumbs = implode(' &bull; ', $t->breadcrumbs->links);
  1.    $t->breadcrumbs            = new stdClass;
  2.    $t->breadcrumbs->current   =& $category_lineage[$current_category];
  3.    $t->breadcrumbs->url_mask  = 'index.php?category_id=%1$s&amp;category_label=%2$s&amp;page=%3$s';
  4.  
  5.    $t->breadcrumbs->links = array(
  6.       sprintf('<a href="%1$s">%2$s</a>',
  7.          sprintf($t->breadcrumbs->url_mask, $t->breadcrumbs->current->category_id, $t->breadcrumbs->current->label, 1),
  8.          $t->breadcrumbs->current->label
  9.       )
  10.    );
  11.  
  12.    while($t->breadcrumbs->current->parent_id)
  13.    {
  14.       $t->breadcrumbs->current =& $category_lineage[$t->breadcrumbs->current->parent_id];
  15.       array_unshift(
  16.          $t->breadcrumbs->links,
  17.          sprintf('<a href="%1$s">%2$s</a>',
  18.             sprintf($t->breadcrumbs->url_mask, $t->breadcrumbs->current->category_id, $t->breadcrumbs->current->label, 1),
  19.             $t->breadcrumbs->current->label
  20.          )
  21.       );
  22.    }
  23.  
  24.    $t->breadcrumbs = implode(' &bull; ', $t->breadcrumbs->links);


¿Qué tal una jerarquía de categorías anidadas utilizando <ul> elementos, algo youd ver mucho en los menús y mapas de sitio?

PHP Código: [ Select ]
$c = new stdClass;
$c->listing = '';
 
function recursive_ul(&$cat)
{
   $str = sprintf('<div><a href="%1$s">%2$s</a></div><ul>', $cat->list_link, $cat->label);
   foreach($cat->sub_categories as &$sub_cat)
   {
      $str .= '<li>' . recursive_ul($sub_cat) . '</li>';
   }
   return "$str</ul>";
}
 
foreach($category_lineage as &$c->category)
{
   $c->url = '?category_id=%1$s&amp;title=%2$s&amp;page=%3$s';
   $c->category->list_link = sprintf($c->url, $c->category->category_id, $c->category->label, 1);
}
 
foreach($category_lineage as &$c->category)
{
   if(empty($c->category->parent_id))
   {
      $c->listing .= '<li>' . recursive_ul($c->category) . '</li>';
   }
}
  1. $c = new stdClass;
  2. $c->listing = '';
  3.  
  4. function recursive_ul(&$cat)
  5. {
  6.    $str = sprintf('<div><a href="%1$s">%2$s</a></div><ul>', $cat->list_link, $cat->label);
  7.    foreach($cat->sub_categories as &$sub_cat)
  8.    {
  9.       $str .= '<li>' . recursive_ul($sub_cat) . '</li>';
  10.    }
  11.    return "$str</ul>";
  12. }
  13.  
  14. foreach($category_lineage as &$c->category)
  15. {
  16.    $c->url = '?category_id=%1$s&amp;title=%2$s&amp;page=%3$s';
  17.    $c->category->list_link = sprintf($c->url, $c->category->category_id, $c->category->label, 1);
  18. }
  19.  
  20. foreach($category_lineage as &$c->category)
  21. {
  22.    if(empty($c->category->parent_id))
  23.    {
  24.       $c->listing .= '<li>' . recursive_ul($c->category) . '</li>';
  25.    }
  26. }


Adiciones



Lo que si quería recuperar una lista de artículos de una categoría, y cada nivel de la subcategoría en esta categoría?
Yo podría golpear la base de datos varias veces en busca de sub-categorías, o yo podría volver a usar mi $ category_lineage de alguna manera.

Puedo añadir un descendientes matriz al lado de la matriz sub_categories. Podría utilizar referencias para los elementos de la matriz descendientes como lo hago con la matriz sub_categories, pero creo que más veces que no soy sólo va a querer una lista de identificadores de categoría en lugar de toda la información sobre cada categoría en lo que respecta a este .

PHP Código: [ Select ]
function category_lineage($branch)
{
   $descendants = array();
   foreach($branch->sub_categories as $key => $val)
   {
      $descendants[] = $key;
      $descendants   = array_merge($descendants, category_lineage($val));
   }
   return $descendants;
}
 
foreach($category_lineage as $key => $val)
{
   $category_lineage[$key]->descendants = category_lineage($val);
}
  1. function category_lineage($branch)
  2. {
  3.    $descendants = array();
  4.    foreach($branch->sub_categories as $key => $val)
  5.    {
  6.       $descendants[] = $key;
  7.       $descendants   = array_merge($descendants, category_lineage($val));
  8.    }
  9.    return $descendants;
  10. }
  11.  
  12. foreach($category_lineage as $key => $val)
  13. {
  14.    $category_lineage[$key]->descendants = category_lineage($val);
  15. }


Ahora digamos que mis $ current_category es de 14, y cuando me miras categoría 14 quiero incluir los elementos de las categorías 15 y 16, puesto que theyre subcategorías de la categoría 14. Que puedo hacer algo como esto.

PHP Código: [ Select ]
   if(isset($category_lineage[$current_category]->descendants[0]))
   {
      $t->category_sql = "SELECT item_id FROM category_relations WHERE category_id IN($current_category," . implode(',', $category_lineage[$current_category]->descendants) . ')';
   }
   else
   {
      $t->category_sql = "SELECT item_id FROM category_relations WHERE category_id = $current_category";
   }
  1.    if(isset($category_lineage[$current_category]->descendants[0]))
  2.    {
  3.       $t->category_sql = "SELECT item_id FROM category_relations WHERE category_id IN($current_category," . implode(',', $category_lineage[$current_category]->descendants) . ')';
  4.    }
  5.    else
  6.    {
  7.       $t->category_sql = "SELECT item_id FROM category_relations WHERE category_id = $current_category";
  8.    }


Conclusión



Recuerde, usted no es un ordenador, lo que significa que debe hacer tantas preguntas como sea necesario sin tener que preocuparse acerca de la eficiencia al hacer preguntas. Podría sentarme aquí por días y anticiparse a las preguntas cada uno podría preguntar, pero luego Id nunca llegar a ir a pescar. ;)
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Abril 29th, 2010, 10:38 am

Publicar Información

  • Total de mensajes en este tema: 1 mensaje
  • Moderador: Tutorial Writers
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC