Annonce

  •  » Utilisation
  •  » modifier l'ordre d'affichage des images

#16 2005-07-17 16:31:07

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12657

Re: modifier l'ordre d'affichage des images

Culinde, je pense que tu es allé un peu vite dans la réflexion, si tu le veux bien, voici plusieurs points à étudier :

- le champ images.rank est une erreur, il devrait plutôt s'agir de image_category.rank. En effet, une image peut appartenir à plusieurs catégories... il y a donc autant de rangs que d'associations image -> catégorie.

- $conf['order_by'] est utilisé pour l'affichage des miniatures sur category.php et pour l'ordre sur picture.php. Or ces deux pages peuvent afficher les catégories spéciales comme "favoris", "images récentes", "recherche", "list" (comme random) : utiliser alors le image_category.rank n'aurait plus de sens. Il faudrait surcharcher $conf['order_by'] dans include/functions_category.inc.php:initialize_category

- a priori il ne faut pas utiliser un champ comportant des valeurs NULL pour le order by (sinon, attention les résultats...), il faudra donc veiller à ce que dans chaque catégorie, chaque image ait un rang.

Je pense qu'après l'énoncé de ces contraintes, tout le monde peut comprendre pourquoi l'ordre d'affichage des images n'est pas intégré en standard : ergonomiquement, ce serait lourd à gérer.

Au dessus, j'explique ce à quoi il faut penser... pour intégrer cette fonctionnalité en standard. Mais dans un cas particulier, ta solution est tout à fait envisageable (en prenant en compte ses limites). Je l'ai personnellement mis en place pour le site de mon mariage. En effet, j'ai récupérer des très nombreuses photos faites par des amis et il a fallu reclasser tout ça dans l'ordre. Je ne pouvais pas utiliser le nom des fichiers, ni la date EXIF (car tout le monde n'avait pas synchroniser son appareil photo à la seconde près et même certains n'avaient pas d'appareils photos numérique, c'était de l'argentique scanné). Aller, j'arrête de raconter ma vie, je passe à la solution...

Donc, j'ai eu le même besoin, et j'ai rajouté un champ image_category.rank comme toi. Pour le remplir, je ne suis pas passé par interface graphique, j'ai préféré, catégorie par catégorie, liste les noms des fichiers images dans un fichier texte, dans l'ordre que je désirais au final. J'ai transformé les noms des fichiers image en requêtes SQL... Démonstration :

Extrait du fichier ordre_eglise_ceremonie.txt

bernard_mariage-074.jpg
etienne_mariage-009.jpg
etienne_mariage-010.jpg
etienne_mariage-011.jpg
etienne_mariage-012.jpg
etienne_mariage-013.jpg
sylvain_mariage-067.jpg
etienne_mariage-014.jpg

puis, je lance la ligne de commande (script Perl)...

$ order.pl ordre_eglise_ceremonie.txt

... qui détecte qu'il s'agit de la catégorie "ceremonie". Voici le script order.pl en question :

Code:

#!/usr/bin/perl -w

use strict;
use DBI;

my $file = $ARGV[0];
my %opt = (  dbname => 'special_mariage'
             ,dbuser => $ENV{MYSQL_USER}
             ,dbpass => $ENV{MYSQL_PASS}
             ,prefix_table => ''
          );

my $dbh = DBI->connect( 'DBI:mysql:'.$opt{dbname},$opt{dbuser},$opt{dbpass} );
my ($query,$sth,$row);
my $rank = 1;

open( INPUT, '< '.$file )
     or die( 'Error: fichier introuvable : "'.$file."\"\n" );

# retrieving category id
$file =~ m/_([^_]+)\.\w*$/;
$query = '
SELECT id
  FROM '.$opt{prefix_table}.'categories
  WHERE name = \''.$1.'\'
';
$sth = $dbh->prepare( $query );
$sth->execute();
$row = $sth->fetchrow_hashref();
my $category_id = $row->{id};

while ( <INPUT> )
{
  chomp;
  next if ( $_ eq '' );
  # retrieve image id from its filename
  $query = '
SELECT id
  FROM '.$opt{prefix_table}.'images AS i
  INNER JOIN '.$opt{prefix_table}.'image_category AS ic ON id=ic.image_id
  WHERE file = \''.$_.'\'
';
  $sth = $dbh->prepare( $query );
  $sth->execute();
  $row = $sth->fetchrow_hashref();

  $query = '
UPDATE '.$opt{prefix_table}.'image_category
  SET rank = '.$rank.'
  WHERE image_id = '.$row->{id}.'
  AND category_id = '.$category_id.'
';
  $sth = $dbh->prepare( $query );
  $sth->execute();

  $rank+= 1;
}

(c'est vraiment du code très spécifique...)

Tout ça pour dire que tenter d'utiliser la page infos_images n'est pas une bonne idée, tu vas très vite en avoir marre (personnellement, il m'a été bien plus rapide d'écrire le script ci-dessus).


Les historiens ont établi que Pierrick était le premier utilisateur connu de Piwigo.

Hors ligne

#17 2005-07-17 17:02:12

Culinde
Membre
2005-07-16
22

Re: modifier l'ordre d'affichage des images

Oui oui oui, c'est vrai que je raisonnais dans le contexte de ma propre gallerie,
dans laquelle une photo n'appartient qu'à une unique catégorie,
et les catégories "spéciales" m'avaient échappé.

Je pense que je vais persister, ne serait-ce que pour continuer à me familiariser avec php.

Est-ce que tu pourrais m'expliquer où/comment se fait la lecture de la database, qui permet de rafraichir
les champs auteur, date_de_creation, etc. ?

Je pensais qu'il suffisait de modifier dans le script info_images.php :
- le bloc "update individual options" pour la mise à jour de la database (qui semble ok)
- le bloc "form" pour la lecture de la database,

mais la lecture de la database ne fonctionne pas, soit je me suis trompé
soit il faut intervenir encore ailleurs - mézou?

Hors ligne

#18 2005-07-17 17:22:41

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12657

Re: modifier l'ordre d'affichage des images

Je pense sincèrement que tu ne pars pas dans la bonne direction (comprendre : tu vas galérer pour gérer l'ordre des images par interface graphique), mais voici les réponses à tes questions :

Culinde a écrit:

Est-ce que tu pourrais m'expliquer où/comment se fait la lecture de la database, qui permet de rafraichir
les champs auteur, date_de_creation, etc. ?

toujours dans admin/infos_images.php donc, dans la partie "form" (comme formulaire, mais en anglais), ajoutes une entrée dans le tableau en suivant le modèle NAME_IMG mais pour RANK_IMG. Il faut l'équivalent dans le formulaire, donc dans template/default/admin/infos_images.tpl

Culinde a écrit:

mais la lecture de la database ne fonctionne pas, soit je me suis trompé
soit il faut intervenir encore ailleurs - mézou?

Tu as bien fait le mapping entre les variables du formulaire et le formulaire du template ?


Les historiens ont établi que Pierrick était le premier utilisateur connu de Piwigo.

Hors ligne

#19 2005-07-17 17:44:28

Culinde
Membre
2005-07-16
22

Re: modifier l'ordre d'affichage des images

Voici mes modifs:

dans le .tpl
    <!-- BEGIN picture -->
    <tr>
      <td style="width:0px;">
        <div style="margin-left:2px;margin-right:2px;">
          <input type="checkbox" name="check-{picture.ID_IMG}" value="1" />
        </div>
      </td>
      <td style="text-align:center;"><a name="{picture.DEFAULTNAME_IMG}" href="{picture.URL_IMG}"><img src="{picture.TN_URL_IMG}" alt="" class="miniature" title="{picture.FILENAME_IMG}" /></a></td>
      <td style="text-align:center;">{picture.DEFAULTNAME_IMG}<br /><input type="text" name="name-{picture.ID_IMG}" value="{picture.NAME_IMG}" maxlength="255"/></td>
      <td style="text-align:center;"><input type="text" name="author-{picture.ID_IMG}" value="{picture.AUTHOR_IMG}" maxlength="255" size="12" /></td>
      <td style="text-align:center;"><input type="text" name="rank-{picture.ID_IMG}" value="{picture.RANK_IMG}" maxlength="5" size="5" /></td>
      <td style="text-align:center;"><textarea name="comment-{picture.ID_IMG}" rows="5" cols="30" style="overflow:auto">{picture.COMMENT_IMG}</textarea></td>
      <td style="text-align:center;"><input type="text" name="date_creation-{picture.ID_IMG}" value="{picture.DATE_IMG}" maxlength="10" size="10" /></td>
      <td style="text-align:center;"><input type="text" name="keywords-{picture.ID_IMG}" value="{picture.KEYWORDS_IMG}" length="255" /></td>
    </tr>
    <!-- END picture -->


     
et dans le .php je pense que le mapping se fait là, dans le bloc "form":
...
    $template->assign_block_vars(
      'picture',
      array(
        'ID_IMG'=>$row['id'],
        'URL_IMG'=>add_session_id($pic_mod_base_url.$row['id']),
        'TN_URL_IMG'=>$thumbnail_url,
        'FILENAME_IMG'=>$row['file'],
        'DEFAULTNAME_IMG'=>get_filename_wo_extension($row['file']),
        'NAME_IMG'=>@$row['name'],
        'DATE_IMG'=>date_convert_back(@$row['date_creation']),
        'AUTHOR_IMG'=>@$row['author'],
        'RANK_IMG'=>@$row['rank'],
        'KEYWORDS_IMG'=>@$row['keywords'],
        'COMMENT_IMG'=>@$row['comment']
       ));
...


J'avais aussi modifié la section suivante:

// +-----------------------------------------------------------------------+
// |                       update individual options                       |
// +-----------------------------------------------------------------------+

...

    while ($row = mysql_fetch_array($result))
    {
      $name            = 'name-'.$row['id'];
      $author           = 'author-'.$row['id'];
      $rank              = 'rank-'.$row['id'];
      $comment       = 'comment-'.$row['id'];
      $date_creation = 'date_creation-'.$row['id'];
      $keywords       = 'keywords-'.$row['id'];

      if (isset($_POST[$name]))
      {
        $query = 'UPDATE '.IMAGES_TABLE.' SET name = ';
        if ($_POST[$name] == '')
          $query.= 'NULL';
        else
          $query.= "'".htmlentities($_POST[$name], ENT_QUOTES)."'";

        $query.= ', author = ';
        if ($_POST[$author] == '')
          $query.= 'NULL';
        else
          $query.= "'".htmlentities($_POST[$author],ENT_QUOTES)."'";
         
   
        $query.= ', rank = ';
        if ($_POST[$rank] == '')
          $query.= '0';
        else
          $query.= "'".htmlentities($_POST[$rank],ENT_QUOTES)."'";

      ...

Hors ligne

#20 2005-07-17 18:02:08

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12657

Re: modifier l'ordre d'affichage des images

Là comme ça, je dirais que c'est tout bon. A part qu'il est inutile d'utiliser htmlentities sur une valeur a priori numérique.


Les historiens ont établi que Pierrick était le premier utilisateur connu de Piwigo.

Hors ligne

#21 2005-07-17 21:43:27

Culinde
Membre
2005-07-16
22

Re: modifier l'ordre d'affichage des images

Ma faute, ma très grande faute.
C'était un bête problème de casse, de case-sensitivity de php.

Maintenant reste à changer de table, et à faire tout ce qui m'avait échappé et que tu m'as montré.
@+, Culinde

Hors ligne

#22 2005-07-17 22:59:59

Culinde
Membre
2005-07-16
22

Re: modifier l'ordre d'affichage des images

Au passage, mais tu dois déjà le savoir, quand je consulte la structure de la table image_category,
j'ai le warning suivant: PRIMARY and INDEX keys should not both be set for column `image_id`

J'ai déplacé le champ rank vers la table image_category, j'ai passé en revue les requêtes utilisant la clause $conf['order_by']
et elles m'ont toutes semblé compatibles de "ORDER BY rank ASC, name ASC" (par exemple).

Quant aux catégories "spéciales", gérées comme tu me le disais par le script  include/functions_category.inc.php,
j'ai eu l'impression qu'elles possèdent déjà des surcharges de la clause $conf['order_by'].
En tous cas "images au hasard", "plus vues", me semblent donner des résultats corrects.

Je verrai à l'usage si je tombe sur des dysfonctionnements, pour l'instant je te remercie pour tes réponses et ta disponibilité.
Bye

Dernière modification par Culinde (2005-07-17 23:01:47)

Hors ligne

  •  » Utilisation
  •  » modifier l'ordre d'affichage des images

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2024 · Contact