Écrire une réponse

Veuillez écrire votre message et l'envoyer

Cliquez dans la zone sombre de l'image pour envoyer votre message.

Retour

Résumé de la discussion (messages les plus récents en premier)

Culinde
2005-07-17 22:59:59

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

Culinde
2005-07-17 21:43:27

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

plg
2005-07-17 18:02:08

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.

Culinde
2005-07-17 17:44:28

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)."'";

      ...

plg
2005-07-17 17:22:41

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 ?

Culinde
2005-07-17 17:02:12

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?

plg
2005-07-17 16:31:07

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).

Culinde
2005-07-17 16:06:47

Hello,
en version 1.4.1 j'essaie désespérément de contrôler l'ordre d'affichage des photos d'une catégorie
(il faudra que je m'interroge un jour sur cette manie de ne rien vouloir laisser au hasard).

Dans cette démarche j'ai modifié:
1. la table images en rajoutant un champ "myrank" de type unsigned integer,
    avec une valeur par défaut (nulle actuellement, je la passerai au max plus tard)
2. la requète $conf['order_by'] pour prendre en compte ce champ
3. le template info_images.tpl pour l'afficher
4. le script info_images.php pour le gérer, en me basant sur le traitement réalisé pour le champ author

J'arrive à saisir une valeur dans myrank,
quand je fais le "submit" je vois l'ordre d'affichage se modifier de façon correcte,
par contre la valeur du champ myrank n'est pas réaffichée, ce champ est vidé.

Que faut-il faire (et où???) pour qu'il soit rafraichi à partir de la base de donnée?

Gerald
2003-07-11 11:34:49

  :D Merci z0rglub, ça fonctionne :D .

Il n'y a plus qu'un problème, quand je veux modifier les infos d'une image, la page reprenant toutes les images ne correspond pas.
Je n'ai pas encore eu le temps de chercher mais je vais me pencher sur le problème.

En tout cas merci encore de ta réponse rapide et efficace.

Bonne journée

plg
2003-07-10 21:52:04

pour la where, il faut le mettre de même dans photo.php (dans la version 1.2, il faut reprendre le where...)

Pour le order_by, je te conseille de le mettre dans le ./include/init.inc.php

Gerald
2003-07-10 19:38:55

J'ai deux categories

Deux cas :
Je voulais par exemple donner la possibilité de faire une recherche par auteur.
Dans Diapo.php j'ai ajouté une clause where  dans les critère de recherche.

//Critère de recherche
if ( $page['cat'] == 'search' )
{
    $page['where'] = " where ( file like '%".$HTTP_GET_VARS['search']."%'";
    $page['where'].= " or name like '%".$HTTP_GET_VARS['search']."%'";
    // Ajout de la recherche dans le champ auteur-------------------------
    $page['where'].= " or author like '%".$HTTP_GET_VARS['search']."%'";
    //--------------------------------------------------------------------
   
etc...

Ça fonctionne bien et j'arrive à sélectionner toutes les images d'un auteur. Tant que les images correspondent à la 1ère catégorie affichée, je peux voir les grandes images, dès que j'essaye d'afficher une image qui appartient à la deuxième catégorie j'ai ce message

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in f:\gallerie_php\include\functions.php on line 782

----------------------------------------------------------
Deuxième cas, tri par auteur :
l'utilisateur choisit un critère de tri et en fonction de ce critère, je modifie la clause order by :
Pour un classement par auteur par exemple

if ( $user['critere_tri'] == 'auteur')
    {
        //Classement par auteur
        $conf['order_by'] = " order by author, date_available desc";
    }

Les images sont bien classées par auteur mais quand je clique pour voir la grande image, celle qui apparaît ne correspond pas à la miniature.
Si je clique sur la seconde miniature (classesment par auteur), j'obtiens en fait la grande image de la seconde image de la catégorie classée par date.
--------------------------------------------------------

Je ne sais pas si je suis clair mais ce n'es pas très évident à expliquer.

En tout cas, merci de prendre le temps de te pencher sur nos problèmes et encore bravo :D 

plg
2003-07-10 19:17:14

bizarre bizarre... tu as modifié comment ?

Gerald
2003-07-10 16:31:17

Bonjour, j'ai installé il y a quelques jours phpWebGallery et je trouve vraiment cette appli super. Merci de nous en faire profiter :D

Au sujet de l'ordre d'affichage ou de la sélection, j'arrive bien à modifier les critères et le résultat obtenu est correct sur la page diapo.
Par contre, si je clique sur une miniature, je n'obtiens pas la bonne image dans la page photo. A priori, il mémorise la position de l'image dans la galerie et pas son nom ou son id.

Mes connaissances Php étant limitées, est-ce qu'il est possible de modifier cela de manière à pointer vers la bonne image.

Par avance merci :D   

justeleblanc
2003-05-19 22:19:17

ah tiens j'avais pas vu ta réponse...
j'vais essayer
encore merci  :) 

plg
2003-05-18 08:01:02

et un affichage en ordre aléatoire ?

Code:

$conf['order_by'] = " order by rand()";

par contre, tu ne pourras pas visionner toutes les images avec photo.php, il fuadra repasser par la page des miniatures... tu comprendras quand tu essaiera

Pied de page des forums

Propulsé par FluxBB

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