Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedostojen listaus painikkeiksi

verkko2022 [11.03.2022 15:16:06]

#

Palaan tähän aiempaan teemaan vielä uudemman kerran, minulla siis oli tällainen koodi:

<div class="dropdown">
    <button class="dropbtn" onclick="myFunction_4()">MALLIT
      <i class="fa fa-caret-down"></i>
    </button>
    <form action= <?php echo $polkufaar; ?> method="post">
    <div class="dropdown-content" id="myDropdown_4">
      <div class="header">
        <P>OHJEET sisältöä!</P>
      <div class="row">
        <div class="column">
          <input type = "submit" name = "ohje" value="malli_1.pdf" /><br>
          <input type = "submit" name = "ohje" value="malli_2.pdf" /><br>
        </div>
        </div>
        </div>
        </div>
        </div>
        </form>

Tämä toimii hyvin, mutta siinä on yksi hankaluus. Nyt kun lisään kansioon liitteitä .pdf niin minun on aina pakko käydä lisäämässä rivi <input type.... Voisiko tätä jotenkin kehittää siten, että nuo liitteet malli_1.pdf/2.pdf näkyisivät automaattisesti painikkeena, jos ne ovat oikeassa kansiossa?

verkko2022 [11.03.2022 21:19:40]

#

Jotain tällaista olen kehitellyt, mutta matkaa on vielä:

<?php
$dir = "/var/www/html/ohje/ohje/";
$dh = opendir($dir);
$file = readdir($dh);
echo $file;
closedir($dh);
?>

vesikuusi [11.03.2022 21:21:43]

#

Hyvin näyttää sujuvan, anna palaa vaan. Kyllä se siitä 👍

Teuro [11.03.2022 21:28:09]

#

Yksi vaihtoehto on käyttää PHP:n tarjoamaa scandir-funktiota, joka lukee annetusta kansiosta tiedostot taulukkoon.

<?php foreach (scandir("/") AS $file) : ?>
	<?php $file_info = pathinfo($file); ?>

	<?php $extension = (isset($file_info['extension'])) ? $file_info['extension'] : NULL; ?>
	<?php if ($extension !== NULL && strtolower($file_info['extension']) == 'pdf') : ?>
	<input type = "submit" name = "ohje" value="<?= $file; ?>" /><br>
	<?php endif ?>
<?php endforeach ?>

vesikuusi [12.03.2022 00:03:15]

#

Toinen vaihtoehto on käyttää PHP:n tarjoamaa rekursiivista hakemistoiteraattoria RecursiveDirectoryIterator-oliota, joka iteroi annetusta hakemistosta ja sen alihakemistoista tiedostot.

$it = new RecursiveDirectoryIterator(__DIR__);
foreach(new RecursiveIteratorIterator($it) as $file) {
    $fd = fopen($file, "rb");
    if (fread($fd, 4) === "%PDF")
        echo "<input type=\"submit\" name=\"ohje\" value=\"{$file}\" /><br>";
}

Metabolix [12.03.2022 09:35:56]

#

Vesikuusen koodi heittelee varoituksia kaikista kansioista. Pitää lisätä is_file-tarkastus. Selvyyden vuoksi myös käyttäisin lukemiseen funktiota file_get_contents.

if (is_file($file) && file_get_contents($file, length: 4) == "%PDF") {}

Toisaalta tiedostopäätteen tarkastus voi olla hyvin riittävä ratkaisu (ja sikäli hyödyllinen, että oikealla päätteellä palvelin myös tarjoaa tiedoston automaattisesti oikeassa muodossa). Jos jostain syystä str_ends_with ei tyydytä, myös Teuron esittämää pathinfo-funktiota voi käyttää vähän lyhyemmin:

if (pathinfo($file, PATHINFO_EXTENSION) == "pdf") {}

Kirjainkoon merkityksestä voi olla monta mieltä, minusta ylläpitäjän olisi syytä tietää tiedostonimien kirjainkoko ja pitää ne yhtenäisinä, ettei ole sekaisin pdf, PDF, Pdf ynnä muita.

Tiedostonimetkin on syytä käsitellä ennen HTML:ään tulostamista. Tässä htmlspecialchars on oikea funktio, ja PHP 8.1:stä alkaen se toimii vihdoin vielä vähän helpommin, kun myös heittomerkit käsitellään oletuksena.

<ul>
<?php
$it = new RecursiveDirectoryIterator(".");
foreach (new RecursiveIteratorIterator($it) as $file) {
	if (str_ends_with($file, ".pdf")) {
		$html = htmlspecialchars($file);
		echo "<li><input type='submit' name='ohje' value='$html' />\n";
	}
}
?>
</ul>

Tai tietysti jos halutaan iteraattoreilla oikein hifistellä:

<ul>
	<?php foreach (
		new CallbackFilterIterator(
			new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")),
			fn($x) => is_file($x) && str_ends_with($x, ".pdf")
		)
		as $file): ?>
		<li><input type="submit" name="ohje" value="<?= htmlspecialchars($file) ?>" />
	<?php endforeach; ?>
</ul>

Viimeiseksi, br ei ole tyylikäs ratkaisu nappien asetteluun, vaan tämän voisi tehdä loogisesti oikeammin esimerkiksi listaelementeillä ja CSS:llä. Myöskin alkuperäisessä koodissa oleva valtava div-massa viittaa siihen, että pitäisi miettiä tarkemmin sivujen loogista rakennetta, oikeita elementtejä ja CSS:n käyttöä.

verkko2022 [12.03.2022 10:27:58]

#

Aivan loistavia ohjeita:-)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta