[risolto] Nuova pagina lista oggetti (gdrcd)
[risolto] Nuova pagina lista oggetti (gdrcd) postato il 13/03/2023 15:04:52 nel forum programmazione, open source e hosting e modificato da haruka il 15/03/2023 15:13:22
Mi sto perdendo in un bicchier d'acqua, lo so.
In poche parole, voglio permettere alla gestione di poter vedere quali immagini sono presenti nella folder /themes/advanced/imgs/items
considerando che da noi i giocatori possono creare oggetti bypassando la gestione. Un controllo visivo è immediato e possiamo capire a colpo d'occhio se c'è stato un abuso - i giocatori possono solo creare abbigliamento, oggetti di vita quotidiana e non armi e simili.
Ho implementato questo codice, la pagina si chiama "servizi_listaoggettifolder.inc.php" e si trova in pages
Funziona per la prima pagina, funziona anche il sorting, ma se cerco di andare a pagina 2, mi dice "modulo non trovato" che è errore generico di gdrcd.
Che sto sbagliando con la paginazione? ^^'
<?php /*HELP: */
if($_SESSION['permessi'] >= MODERATOR) { /* se almeno admin */
?>
<div>
<!-- Titolo della pagina -->
<div class="page_title">
<h3>Elenco immagini nella cartella dedicata</h3>
</div>
<!-- Operazioni -->
<div class="page_body">
<?php /**/
$path = '***PARTE OSCURATA***/themes/advanced/imgs/items';
// get the directory contents as an array
$dir_contents = scandir($path);
// remove . and .. from the array
$dir_contents = array_diff($dir_contents, array('.', '..'));
// check if the sort option is set in the query string
if (isset($_POST['sort_by'])) {
$sort_by = $_POST['sort_by'];
} else {
$sort_by = 'date_asc'; // default sorting is by date
}
// sort the array based on the selected option
switch ($sort_by) {
case 'name_desc':
sort($dir_contents, SORT_NATURAL | SORT_FLAG_CASE); // sort by name, ascending
break;
case 'date_asc':
$dir_contents = array_map(function($file) use($path) {
return [$file, filemtime("$path/$file")];
}, $dir_contents); // add file modification time to each file name
usort($dir_contents, function($a, $b) {
return $b[1] - $a[1]; // sort by modification time, descending
});
$dir_contents = array_map(function($file) {
return $file[0]; // remove the modification time from the array
}, $dir_contents);
break;
default:
sort($dir_contents, SORT_NATURAL | SORT_FLAG_CASE); // default sorting is by name, ascending
}
// set the number of images per page
$per_page = 200;
// get the current page number from the query string
if (isset($_POST['page'])) {
$page = $_POST['page'];
} else {
$page = 1;
}
// calculate the offset
$offset = ($page - 1) * $per_page;
// slice the array to get the current page's images
$images = array_slice($dir_contents, $offset, $per_page);
// print the images
echo 'IMMAGINI:';
echo '<div style="display: flex; flex-wrap: wrap;">';
foreach ($images as $image) {
// check if the file is an image
if (exif_imagetype("$path/$image")) {
// print the image
echo '<div style="width: 200px; height: 200px; margin: 5px;">';
echo "<a href='../../themes/advanced/imgs/items/$image' target='_blank'><img src='../../themes/advanced/imgs/items/$image' width='200' height='200'></a>";
echo "<div style='text-align: center;'>$image</div>";
echo '</div>';
}
}
echo '</div>';
// calculate the total number of pages
$total_pages = ceil(count($dir_contents) / $per_page);
// print the pagination links
echo '<div style="text-align: center;">';
echo '<form action="main.php?page=servizi_listaoggettifolder" method="post">';
echo '<select name="sort_by">';
echo "<option value='name_desc'".($sort_by == 'name_desc' ? ' selected' : '').">Name (A to Z)</option>";
echo "<option value='date_asc'".($sort_by == 'date_asc' ? ' selected' : '').">Date Edited (Newest First)</option>";
echo '</select>';
echo '<input type="submit" value="Sort">';
echo '</form>';
// loop through the total number of pages and print the pagination links
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == $page) {
echo "<span style='font-weight: bold;'>$i</span> ";
} else {
echo "<a href='main.php?page=servizi_listaoggettifolder&page=$i&sort_by=$sort_by'>$i</a> ";
}
}
echo '</div>';
} else { echo '<div class="warning">Non sei abilitato a vedere questa pagina</div>'; }//fine if se non si è admin ?>
</div><!-- operazioni-->
</div><!-- box -->
Pagine → 1 2
13/03/2023 16:31:27 e modificato da cbr89 il 13/03/2023 16:47:02
Ciao Haruka,
Probabilmente la variabile $_POST['page'] è vuota perché quando usi il link con href di fatto non vai in post ma in Get.
Quindi secondo me se cambi
$_POST['page']
Con
$_GET['page']
probabilmente risolvi.
Stessa cosa col sort.
Quello funziona perché usi un form con method post.
Se vuoi una cosa non molto safe , puoi usare la variabile $_REQUEST[] , altrimenti la paginazione va sempre in get e così anche il sorting.
Spero di averci preso, sono su un bus e non leggo benissimo.
😃😃
13/03/2023 18:25:28
Usare un ?page=qualcosa&page=altro è un po’ rischioso, no? :P
13/03/2023 18:57:37
playergdr ha scritto: Usare un ?page=qualcosa&page=altro è un po’ rischioso, no? :P
Ottima osservazione!
14/03/2023 13:53:30
Intanto grazie a entrambi. E no, se al posto di _post metto _get non va proprio più il form di selezione.
playergdr ha scritto: Usare un ?page=qualcosa&page=altro è un po’ rischioso, no? :P
domanda da nabba assoluta - che però ha molta voglia di documentarsi e capire - perché?
Anche il pacchetto dei gruppi messaggi, tanto per dire, crea una url di questo tipo:
main.php?page=messages_center&op=read&group=536&offset=6
14/03/2023 20:17:05
haruka ha scritto: Intanto grazie a entrambi. E no, se al posto di _post metto _get non va proprio più il form di selezione.
[quote]playergdr ha scritto: Usare un ?page=qualcosa&page=altro è un po’ rischioso, no? :P
domanda da nabba assoluta - che però ha molta voglia di documentarsi e capire - perché?
Anche il pacchetto dei gruppi messaggi, tanto per dire, crea una url di questo tipo:
main.php?page=messages_center&op=read&group=536&offset=6
[/quote]tutto quello che vedi dopo il "?" in un URL è chiamato "query string" ed è formato dalla coppia
chiave, valore.
page(chiave)=messages_center(valore)
la & separa le chiavi, quindi nel caso che hai indicato tu hai
page
op
group
offset
che sono le chiavi della variabile $_GET[''] (o post nel caso di un form con metodo post) che arriverà al tuo script.
quando in php fai questa assegnazione
$pagina= $_GET['page'];
stai dicendo:
Assegnao alla variabile $pagina il valore dell'array $_GET che ha come chiave 'page'.
mettere "?page=servizi_immagini&page=1"
è formalmente sbagliato perché in un array non possono esserci due chiavi uguali.
14/03/2023 21:39:08
haruka ha scritto: Intanto grazie a entrambi. E no, se al posto di _post metto _get non va proprio più il form di selezione.
Non è quello.
Oltre alla risposta tecnica e molto molto corretta da un punto di vista informatico, (complimenti), io preferisco fartela su un esempio.
La tua ?page=qualcosa ti porta a una specifica pagina.
Se in qualcosa ci aggiunti dei “richiami” come &richiamo=valore&richiamo2=valore2 va benissimo.
Però tu chiami due cose diverse con lo stesso nome e questo rischia di generare un conflitto.
Prova pure a cambiare semplicemente quel page dopo & e via
15/03/2023 14:30:55 e modificato da haruka il 15/03/2023 14:39:15
playergdr ha scritto:
Non è quello.
Oltre alla risposta tecnica e molto molto corretta da un punto di vista informatico, (complimenti), io preferisco fartela su un esempio.
La tua ?page=qualcosa ti porta a una specifica pagina.
Se in qualcosa ci aggiunti dei “richiami” come &richiamo=valore&richiamo2=valore2 va benissimo.
Però tu chiami due cose diverse con lo stesso nome e questo rischia di generare un conflitto.
Prova pure a cambiare semplicemente quel page dopo & e via
AHHH! Ora ho capito! Una svista completa perché ho scritto il codice senza pensare che in effetti gdrcd usa già page= per le url.
Ok, provo a vedere se magari ciò che crea problemi è proprio questo!
Grazie mille :)
Edit. Il codice adesso è questo:
<?php /*HELP: */
if($_SESSION['permessi'] >= MODERATOR) { /* se almeno admin */
?>
<div>
<!-- Titolo della pagina -->
<div class="page_title">
<h3>Elenco immagini nella cartella dedicata</h3>
</div>
<!-- Operazioni -->
<div class="page_body">
<?php /**/
$path = '**parte oscurata**/themes/advanced/imgs/items';
// get the directory contents as an array
$dir_contents = scandir($path);
// remove . and .. from the array
$dir_contents = array_diff($dir_contents, array('.', '..'));
// check if the sort option is set in the query string
if (isset($_POST['sort_by'])) {
$sort_by = $_POST['sort_by'];
} else {
$sort_by = 'date_asc'; // default sorting is by date
}
// sort the array based on the selected option
switch ($sort_by) {
case 'name_desc':
sort($dir_contents, SORT_NATURAL | SORT_FLAG_CASE); // sort by name, ascending
break;
case 'date_asc':
$dir_contents = array_map(function($file) use($path) {
return [$file, filemtime("$path/$file")];
}, $dir_contents); // add file modification time to each file name
usort($dir_contents, function($a, $b) {
return $b[1] - $a[1]; // sort by modification time, descending
});
$dir_contents = array_map(function($file) {
return $file[0]; // remove the modification time from the array
}, $dir_contents);
break;
default:
sort($dir_contents, SORT_NATURAL | SORT_FLAG_CASE); // default sorting is by name, ascending
}
// set the number of images per page
$per_page = 200;
// get the current page number from the query string
if (isset($_POST['pagination'])) {
$pagination = $_POST['pagination'];
} else {
$pagination = 1;
}
// calculate the offset
$offset = ($pagination - 1) * $per_page;
// slice the array to get the current page's images
$images = array_slice($dir_contents, $offset, $per_page);
// print the images
echo 'IMMAGINI:';
echo '<div style="display: flex; flex-wrap: wrap;">';
foreach ($images as $image) {
// check if the file is an image
if (exif_imagetype("$path/$image")) {
// print the image
echo '<div style="width: 200px; height: 200px; margin: 10px;">';
echo "<a href='../../themes/advanced/imgs/items/$image' target='_blank'><img src='../../themes/advanced/imgs/items/$image' width='200' height='200'></a>";
echo "<div style='text-align: center; height:100%;'>$image</div>";
echo '</div>';
}
}
echo '</div>';
// calculate the total number of pages
$total_pages = ceil(count($dir_contents) / $per_page);
// print the pagination links
echo '<div style="text-align: center;">';
echo '<form action="main.php?page=servizi_listaoggettifolder" method="post">';
echo '<select name="sort_by">';
echo "<option value='name_desc'".($sort_by == 'name_desc' ? ' selected' : '').">Name (A to Z)</option>";
echo "<option value='date_asc'".($sort_by == 'date_asc' ? ' selected' : '').">Date Edited (Newest First)</option>";
echo '</select>';
echo '<input type="submit" value="Sort">';
echo '</form>';
// loop through the total number of pages and print the pagination links
for ($i = 1; $i <= $total_pages; $i++) {
if ($i == $pagination) {
echo "<span style='font-weight: bold;'>$i</span> ";
} else {
echo "<a href='main.php?page=servizi_listaoggettifolder&pagination=$i&sort_by=$sort_by'>$i</a> ";
}
}
echo '</div>';
} else { echo '<div class="warning">Non sei abilitato a vedere questa pagina</div>'; }//fine if se non si è admin ?>
</div><!-- operazioni-->
</div><!-- box -->
non mi da più l'errore di modulo non trovato, ma la paginazione non funziona.
O per meglio dire, la paginazione cea correttamente l'url (esempio: https://www.leggendra.eu/main.php?page=servizi_listaoggettifolder&pagination=7&sort_by=date_asc) ma in fondo nella lista delle pagine, quella evidenziata rimane la nr. 1 e gli oggetti mostrati sono sempre i primi 200 e sempre nell'ordine di default (cioè dall'ultimo modificato - date_asc).
15/03/2023 15:05:05
Ciao Haruka,
Quando segui un link come fai tu per la paginazione , usando
<a href="main.php?paginazione=7" > Link </a>
Il metodo che viene usato per la richiesta HTTP è quello GET (che vuol dire "dammi qualcosa usando questi parametri").
Di conseguenza, il tuo
if(isset($_POST['pagination']))
va sempre nel blocco dell'else, ovvero assegnando alla paginazione = 1
stessa cosa per il 'sort_by'.
Funziona quando usi la tendina perché il metodo del form che hai scelto è il "POST" , ma quando va a prenderli dalla query string, non sono settati.
Se vuoi risolvere, puoi usare la variabile $_REQUEST['pagination'] e $_REQUEST['sort_by'] che dovrebbe comprendere i valori ottenuti sia in GET che in POST.
25/07/2025 08:24:03
Riesumo questo Topic per chiedere, cosa si intende per "percorso assoluto" da indicare nel path?
Discussione seguita da
Pagine → 1 2
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
CRSED: F.O.A.D. ↗
Cafuné ↗
The Coven ↗
RAID Shadow Legends ↗
New Orleans ↗
Exclusive Villa GdR ↗
Tibia ↗
Storie di Agarthi ↗