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
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
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.
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)."'";
...
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 ?
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?
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 :
#!/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).
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?
: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
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
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
bizarre bizarre... tu as modifié comment ?
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
ah tiens j'avais pas vu ta réponse...
j'vais essayer
encore merci :)
et un affichage en ordre aléatoire ?
$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