¿Retrato o paisaje ?

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Cómo seleccionar la imágenes de un bucle DOCUMENTS en función de su orientación. Un ejemplo de las nuevas funcionalidades en SPIP 1.8

En un boucle DOCUMENTS que sirve para mostrar imágenes (por ejemplo para una galería), se prentende seleccionar las imágenes por su orientación.

En función de la compaginación que se busca, puede ser importante saber si la imagen que se va a indicar será vertical [1] o apaisada

Aquí van algunas soluciones que utilizan las nuevas funcionalidades de SPIP 1.8.x

La primera intuición

Se sabe que en un bucle documents, se puede acceder a las balizas #HAUTEUR [2] y #LARGEUR [3]. Eso significa que también se puede poner un criterio que limite la altura o la anchura de los DOCUMENTOS seleccionados :

<BOUCLE_doc(DOCUMENTS) {id_article} {largeur < 800}>
#LOGO_DOCUMENT
</BOUCLE_doc>

Siguiendo esa lógica, podría intentarse una comparación entre la anchura y la altura entre sí :

<BOUCLE_doc(DOCUMENTS) {id_article} {largeur < hauteur}>
#LOGO_DOCUMENT
</BOUCLE_doc>

SPIP autoriza el primer bucle. En efecto, se puede comparar cualquier columna de la base de datos con un valor constante. Sin embargo en del 2do bucle propuesto, el valor a la derecha no es una constante, sino un dato de la base. Por lo tanto este criterio va a fallar.

Una solución limitada : anidar bucles

Cuando se dice que el valor a la derecha debe ser una constante, eso quiere decir que puede ser :

  • una constante numérica (un id, un tamaño, etc...),
  • una cadena de carácteres (un título de artículo, de sección, etc...)
  • una expresión regular
  • el valor de una baliza de un bucle englobante

Efectivamente, dentro de una iteración específica de un bucle, los valores de sus balizas son constantes observadas desde los bucles anidados de nivel inferior. [4]

Entonces se puede utilizar un bucle englobante para pasar el tamaño del documento a la derecha del operador

<BOUCLE_doc(DOCUMENTS) {id_article}>
<BOUCLE_portrait(DOCUMENTS) {id_document} {hauteur >= #LARGEUR}>
#LOGO_DOCUMENT
</BOUCLE_portrait>
</BOUCLE_doc>

En el bucle _doc se usa para encontrar todos los documentos de un artículo (aunque se podrían utilizar otros criterios). A continuación, el bucle _portrait gracias al criterio id_document sólo selecciona un documento y comprueba que la altura sea mayor o igual a la anchura del documento seleccionado por el bucle superior, que es exactamente el mismo.

He aquí entonces una primera solución funcional para seleccionar documentos de acuerdo a su orientación.

Desgraciadamente, un criterio frecuentemente utilizado no funcionará correctamente con este bucle : {a,b}.

Explicación :
Suponga que un artículo contiene imagenes con id 1, 2, 3, 4, 5 y 6 de la cuales 1, 3, 4 y 6 son verticales. Si quiero mostrar sólo las primeras dos fotos verticales, sería erroneo plantear

<BOUCLE_doc(DOCUMENTS) {id_article}{0,2}>
<BOUCLE_portrait(DOCUMENTS) {id_document} {hauteur >= #LARGEUR}>
#LOGO_DOCUMENT
</BOUCLE_portrait>
</BOUCLE_doc>

Este bucle devolvería sólo la foto 1, y perdería la foto 3, ya que el bucle superior devolvió los dos primeros resultados de todo el artículo.

Una solución más flexible : utilizar doublons

Una solución para poder utilizar el criterio {a,b} es usando doublons :

<BOUCLE_doc(DOCUMENTS) {id_article}>
<BOUCLE_paysage(DOCUMENTS) {id_document} {largeur >= #HAUTEUR} {doublons}>
</BOUCLE_paysage>
</BOUCLE_doc>

<BOUCLE_portrait(DOCUMENTS) {id_aticle} {doublons} {0,5}>
#LOGO_DOCUMENT
</BOUCLE_portrait>

Un primer bucle marca con doublons los documentos que no se quieren motrar [5], en este caso las fotos apaisadas. El segundo bucle muestra todos los documentos excepto los que están con doublons, es decir, los que no han sido eliminados por el bucle anterior.

Una solución integral : brindar nuevos criterios

A veces es complicado código respetar el código SPIP puro. Desgraciadamente, en casos especiales incluso la segunda solución tiene algunas limitaciones.

He aquí una solución se vale de la extensibilidad en la versión 1.8 de SPIP, para añadir tres nuevos criterios de bucles. Como es código php puro, no están obligados a comprenderlo para utilizarlo.

Los criterios {portrait} y {paysage} estarán entonces disponibles. Por ejemplo :

<BOUCLE_portrait(DOCUMENTS) {id_article} {portrait} {0,5}>
#LOGO_DOCUMENT
</BOUCLE_portrait>

Es necesario colocar este código en mes_fonctions.php3.

Atención, los dos criterios utilizan desigualdades estrictas para seleccionar las imágenes. Por ello, las imágenes cuadradas : Hauteur = Largeur no se seleccionarán por estos dos criterios. Esta es la razón por la que se añade también el criterio {carre} que, obviamente, devuelve las imágenes cuadradas.

<?php

function critere_portrait($idb, &$boucles, $param, $not) {
  $boucle = &$boucles[$idb];
  $table = $boucle->id_table;

  if ($not) 
	$boucle->where[] = $table.".hauteur <= ".$table.".largeur";
  else
	$boucle->where[] = $table.".hauteur > ".$table.".largeur";
}


function critere_paysage($idb, &$boucles, $param, $not) {
  $boucle = &$boucles[$idb];
  $table = $boucle->id_table;

  if ($not) 
	$boucle->where[] = $table.".largeur <= ".$table.".hauteur";
  else 
	$boucle->where[] = $table.".largeur > ".$table.".hauteur";
}

function critere_carre($idb, &$boucles, $param, $not) {
  $boucle = &$boucles[$idb];
  $table = $boucle->id_table;

  if ($not) 
	$boucle->where[] = $table.".largeur != ".$table.".hauteur";
  else
	$boucle->where[] = $table.".largeur = ".$table.".hauteur";
}
?>

Les dejo aquí algunas explicaciones para los que se interesan por el código. Las tres funciones hacen esencialmente lo mismo :

  1. Las dos primeras líneas recuperan el bucle en el cual se encuentra el critero y el nombre de la tabla de la base en cuestión.
  1. Se comprueba a continuación que el criterio no esté invertido (por la señal » !") ; y en tal caso, se utiliza el criterio de comparación opuesto.
  1. Se añade finalmente una nueva condición a la petición que se hará a la base. Esta condición compara las columnas hauteur y largeur de la tabla en cuestión.

Notes

[1en francés, « portrait », retrato

[2Alto

[3Largo

[4El « parser » de SPIP analiza los bucles desde « afuera hacia adentro

[5notar que el criterio es inverso al planteado antes


Traducción por Martín Gaitán.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom