Extender taxonomías en Drupal 6
Supongamos que tenemos nuestro listado de taxonomías y lo que necesitamos es poder adjuntarle campos adicionales como si de CCK se tratara. En este caso una descripción adicional para mostrar al publico.
Para ello necesitaríamos extender la cantidad de información relacionada a esta taxonomía y ademas tener la posibilidad de hacer la carga dicha descripción por algún lado.
La información relacionada vamos a guardarla en una nueva tabla en la que el id de la misma este relacionada con el id de la taxonomía que vamos a modificar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * Implementation of hook_schema. */ function extender_taxonomy_schema() { $schema['extender_taxonomy'] = array( 'fields' => array( 'tid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'description' => t("nuestra referencia al term"), ), 'descripcion_usuarios' => array( 'type' => 'text', 'size' => 'normal', ) ), 'primary key' => array('tid'), 'indexes' => array('tid' => array('tid')) ); return $schema; } |
Ahora bien, el punto que he seleccionado para ofrecer la posibilidad de extender una taxonomía es lógicamente la de creación/edición de la misma. Parece una tontería que aclare algo tan obvio pero no se olviden que hay mas formas de encontrar solución a estos asuntos.
Entonces para agregar un field nuevo a la pantalla de administración de una taxonomía tenemos que alterar el formulario de la misma por medio del hook_form_alter(). En este caso usamos un alter especifico:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/** * Implementacion del hook_form_alter * Modificamos un poco la visualizacion de la edicion de una taxonomia y agregamos un field de imagen para asignarle imagenes */ function extender_taxonomy_form_taxonomy_form_term_alter(&$form, $form_state){ //En el caso de que estemos editando una taxonomia cuya cabecera hubiera sido cargada con anterioridad, tratamos de recuperarla para mostrarsela al usuario. $db_extender_taxonomy = db_fetch_object ( db_query ( "SELECT * FROM {extender_taxonomy} WHERE tid = %d", $form ['#term'] ['tid'] ) ); //definimos el nuevo textarea para nuestra descripcion. $form['identification']['descripcion_usuarios'] = array( '#title' => t('Descripción para los usuarios'), '#type' => 'textarea', '#description' => t('Descripción que se le mostrará a los usuarios cuendo naveguen por esta taxonomía.'), '#default_value' => $db_extender_taxonomy->descripcion_usuarios, ); } |
Ahora necesitamos poder tomar los datos rellenados en el formulario que hemos extendido y guardarlos en nuestra tabla. Para ello vamos a usar el hook_taxonomy():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
/** * implementacion de hook_taxonomy * Capturamos en envio de una taxonomia para actuar en consecuencia y poder guardar su información adicional * */ function extender_taxonomy_taxonomy($op, $type, $array = array()) { switch ($type) { case 'term' : //nos interesa en caso de que sea un term y no un vocabulario //Preparemos los datos para insertar o actualizar: $datos = new stdClass (); $datos->tid = $array ['tid']; $datos->descripcion_usuarios = $array ['descripcion_usuarios']; switch ($op) { case 'insert' : //escribomos en ls DB drupal_write_record ( "extender_taxonomy", $datos ); break; case 'update' : /* Antes de actualizar los datos extendidos de una taxonomia tenemos que serciorarnos que la informacion extendida exista, y en caso de que no fuera asi mas bien insertamos antes que actualizar: */ //tratemos de encontrar la taxonomia que vamos a actualizar $existe = db_fetch_object ( db_query ( "SELECT tid FROM {extender_taxonomy} WHERE tid = %d", $array ['tid'] ) ); if ($existe) { drupal_write_record ( "extender_taxonomy", $datos, "tid" ); } else { drupal_write_record ( "extender_taxonomy", $datos ); } break; } break; } } |
Bien, ya tenemos todo lo que necesitamos. lo único que hace falta es probar nuestro código. Para facilitar un poco el tramite les dejé un modulo que pueden descargar a continuación con el código que estuvimos creando recién para que lo habiliten y prueben en sus instalaciones de drupal.
Van a poder ver que al crear o editar una taxonomía se van a encontrar el textarea que estuvimos trabajando. Y si escriben información en este campo se pueden ir a la base de datos en la tabla que especificamos antes para verificar que efectivamente la información relacionada se esta guardando.
De acá en mas solo queda divagar con las posibilidades que ofrece esta técnica: Imágenes, videos, desplegables…. podes hacer verdaderas virguerías si te hace falta.
Hola, muchas gracias por esta información, me ha sido muy util.
Solo me falta un detalle y quería saber si me puede ayudar…
Necesito que este campo aparezca en la pantalla de visualización del catalogo.
Como hago para imprimirlo en pantalla.??
Gracias
Hola, no se a que te referís cuando decís catalogo, pero puedo decirte como usar el campo extra que se crea en el código del tutorial.
Siempre y cuando tengas disponible el tid (id del termino) disponible podes cargar un objeto de la información extendida de la siguiente forma:
Ok tienes razon, no me di a entender, estoy usando Ubertcart para un catalogo de productos.
En la pagina principal de las categorias necesito una descripcion ya que solo aparece La imagen, el nombre y las subcategorias.
Aqui precisamente: http://enersyscr.com/catalog/1
Lo que no se es que tengo que modificar para que aparezca el campo con la descripcion ahi.
En caso de que pueda ayudarme se lo agradecería bastante.
Saludos.
La verdad es que nunca usé Ubercart. Miré la pagina que etas haciendo y veo que todo lo que sea /catalog/x es como un view o algo asi. en todo caso deberiamos ver que es lo que se dibuja bajo esa URL para saber por donde podemos tocar.
Al margen de eso. ¿estas programando algo o estas mas bien configurandolo?. Pregunto porque si lo que estas haciendo es configurar en lugar de programar, esto no te va a servir.
What I find so inteestring is you could never find this anywhere else.
Listo ya lo conseguí, hay que agregar este codigo en la función function THEME_uc_catalog_browse
La palabra THEME cambiarla por el nombre del tema que esté usando.
Toda la función debe ir copiada en el template.php del tema que se está usando.
//Este codigo despliega cada categoria con imagen nombre y detalle
$cell_link = $image .’‘. l($child->name, uc_catalog_path($child)) . ‘ - ‘ . l($child->description, uc_catalog_path($child)) .’‘;
if (variable_get(‘uc_catalog_show_subcategories’, TRUE)) {
$cell_link .= “”. implode(‘, ‘, $grandchildren) .”n”;
}
$child_list[] = $cell_link;
Hola amigo, soy nuevo en drupal, al menos en cuestiones avanzadas, estoy intentando hacer algo parecido a un catalogo de productos, con posibilidad de filtrar los productos por varios criterios, ejemplo: tipo, pais, marca, etc, y quiero que el listado de productos se haga en primer lugar por un vocabulario de taxonomia, donde al seleccionar en un menu desplegable formado por ese vocabulario un termino, me muestre un listado de productos que pertenecen al mismo pero que me permita a ese listado hacer los refinamientos o filtrados que te comente arriba; por tipo, pais, marca, etc. Si trabajo con el módulo taxonomia menu, consigo que se muestre el listado de productos del termino seleccionado, pero no me da la posibilidad de hacer los filtrados que deseo. No se si me hago entender mucho, este sitio, hace algo similar a lo que quiero hacer: http://www.alibaba.com/
Cuando seleccionas en el menú lateral izquiero:
Agriculture/cigarettes se te muetra un listado de productos que perteneces al termino cigarettes y con posibilidad de refinar la busqueda por varios criterios, si comprendes lo que te explico y tienes alguna sugerencia de a donde debo inclinar mi atención para lograrlo te lo agradeceria mucho. Gracias de antemano