Vypis gallerii Get Request

Tomas8698
Člen | 109
+
0
-

Ahojte poradil by mi niekto ako fixnut aby mi zobrazovalo vsetky obrazky z galerie? Teraz to funguje iba pre jednu a mam obrazky aj v inych

$data = array( "Gallerie" => array(),"Obrázky" => array());

            for ($i= 0;$i< count($galleries);$i++ ) {
                $thisGalleryPath = basename($galleries[$i]);

                $data["Gallerie"][$i]["path"] = $thisGalleryPath;
                $data["Gallerie"][$i]["name"] = ucfirst($thisGalleryPath);

                $thisGallery = glob($galleryFile . "/" . $thisGalleryPath . "/*.{jpg,png,gif}", GLOB_BRACE);

            if ($thisGallery){
                for ($e=0; $e < count($thisGallery); $e++){

                    $thisPath = basename($thisGallery[$e]);
                    $name= (ucfirst(basename($thisGallery[$e],".jpg")));
                    $modified = date ("Y-m-d H:i:s.", filemtime($thisGallery[$e]));

                    $data["Obrázky"][$e]["path"] = $thisPath;
                    $data["Obrázky"][$e]["fullpath"] = $thisGalleryPath."/".$thisPath;
                    $data["Obrázky"][$e]["name"] = $name;
                    $data["Obrázky"][$e]["modified"] = $modified;
                }
            }
Result:

{"Gallerie":[
{"path":"Name","name":"Name"},
{"path":"Nnames","name":"Nnames"}
,{"path":"name","name":"Name"}],
"Obrázky":[
{"path":"asds.jpg","fullpath":"name/asds.jpg","name":"Asds","modified":"2021-10-05 21:04:00."},{"path":"asdsa.jpg","fullpath":"name/asdsa.jpg","name":"Asdsa","modified":"2021-10-05 21:08:24."},{"path":"name.jpg","fullpath":"name/name.jpg","name":"Name","modified":"2021-10-05 19:42:59."},{"path":"stiahnuť.jpg","fullpath":"name/stiahnuť.jpg","name":"Stiahnuť","modified":"2021-10-06 16:22:15."}
]}

Editoval Tomas8698 (7. 10. 2021 22:12)

Polki
Člen | 553
+
0
-

Pošli strukturu, co je v $galleries
a jak chceš aby vypadala výsledná struktura

Editoval Polki (7. 10. 2021 22:33)

Tomas8698
Člen | 109
+
0
-
  public function actionDefault(){

        $dir = dirname(__DIR__ ,2);
        $galleryFile = $dir.'/www/AllGalleries'; //Cesta k vsetkym galleriam
        $galleries = glob($galleryFile."/*", GLOB_ONLYDIR);

        if ($this->getHttpRequest()->isMethod('GET')){

            $data = array( "Gallerie" => array(),"Obrázky" => array());

A dalo by sa to upravit tak, aby bola? :

"Galeria": [
{
"path":"Name",
"name":"Name"
},
// A tu by boli obrazky ku konkretnej galerii
"Obrázky":[{
"path":"asds.jpg",
"fullpath":"name/asds.jpg",
"name":"Asds",
"modified":"2021-10-05 21:04:00."
}
// Dalsia galleria
// Obrazky v tejto galerii

Editoval Tomas8698 (7. 10. 2021 22:46)

Polki
Člen | 553
+
0
-

Tak správně by to mělo být takto nějak:
config.neon:

parameters:
	allGalleriesPath: %wwwDir%/AllGalleries

service:
	- App\Model\GalleriesManager(allGalleriesPath: %allGalleriesPath%)

GalleriesManager.php:

<?php

declare(strict_types = 1);

namespace App\Model;

use Nette\SmartObject;
use Nette\Utils\DateTime;
use Nette\Utils\Finder;
use Nette\Utils\Json;
use SplFileInfo;

class GalleriesManager
{
	use SmartObject;

	public function __construct(
		private string $allGalleriesPath,
	) { }

	private function findImagesInGallery(string $galleryPath): array
	{
		$retVal = [];

		$images = Finder::findFiles('*')
			->in($galleryPath);

		foreach ($images as $imagePath => $imageInfo) {
			assert($imageInfo instanceof SplFileInfo);
			$retVal[] = [
				'path' => $imageInfo->getFilename(),
				'fullpath' => $imagePath,
				'name' => $imageInfo->getBasename('.' . $imageInfo->getExtension()),
				'modified' => DateTime::from($imageInfo->getMTime()),		// případně přidat ->format()
			];
		}

		return $retVal;
	}

	public function findAllGalleries(): array
	{
		$galleries = Finder::findDirectories('*')
			->from($this->allGalleriesPath);	// hledá do hloubky, tedy více úrovní adresářů... Případně si změň na ->in()

		$retVal = [];

		foreach ($galleries as $galleryPath => $galleryInfo) {
			assert($galleryInfo instanceof SplFileInfo);
			$retVal[] = [
				'Galeria' => [
					'path' => $galleryPath,
					'name' => $galleryInfo->getBasename(),
				],
				'Obrázky' => $this->findImagesInGallery($galleryPath),
			];
		}

		return $retVal;
	}

	public function findAllGalleriesInJson(): string
	{
		return Json::encode($this->findAllGalleries());
	}
}

presenter:

class SomePresenter extends Presenter
{
	#[Inject] public GalleriesManager $galleriesManager;

	public function actionDefault(): void
	{
		$allGalleriesInRequiredArray = $this->galleriesManager->findAllGalleries();
		$allGalleriesInRequiredJSONformat = $this->galleriesManager->findAllGalleriesInJson();
	}
}

Alternativně můžeš ve finderu použít ještě metodu find, která vrátí oboje. Jak složky, tak soubory.

Polki
Člen | 553
+
0
-

Nicméně toto nevypadá jako dotaz na Nette, ale spíše na PHP a programování jako takové.

Tomas8698
Člen | 109
+
0
-

Wau, super je lepšie keď je to oddelené v presenteri, ktorý to riesi. Krajšie to vyzerá 🙂

Ja si tie dáta posiela do JSON-U, dajú sa tam poslať obe aj galérie aj obrázky? Myslim spolocne do jedneho JSONU.

$this->sendJson($data)

A pomocou funkcie si vytiahneme data o danom subore ze

assert($galleryInfo instanceof SplFileInfo);

Editoval Tomas8698 (8. 10. 2021 8:49)

Polki
Člen | 553
+
0
-

Ta funkce vrací oboje, takže odpověď je ano, můžeš to dát pospolu…

Ohledně toho assertu, ten dělá jen to, že ti ověří, jestli se opravu jedná o instanci dané třídy, takže ti pak bude IDE napovídat. Jiný význam to nemá.

Tomas8698
Člen | 109
+
0
-

GalleriesManager

	public function __construct(
		private string $allGalleriesPath,
	) { }


Mam otazku prečo GalleriesManager potrebuje constructor? :) ,ked ho zmazem vypise error ze contructor tam nieje.
Alebo klasicky tam pridat $this->allGalleriesPath = $allGalleriesPath ?
Lebo ten $allGalleriesPath je z config.neon adresa foldera

Editoval Tomas8698 (8. 10. 2021 19:10)

Polki
Člen | 553
+
0
-

To v mém kódu jsou fičury z PHP 8.0.
A konstruktor potřebuje na inject té cesty z configu

Editoval Polki (8. 10. 2021 19:51)

Tomas8698
Člen | 109
+
0
-

takto ze? a v use ma byt cesta do configu?

    /** @var AllGalleries */
    private $allGalleriesPath;

    public function __construct( AllGalleriesPath $allGalleriesPath)
    {
        $this->allGalleriesPath = $allGalleriesPath;
    }

Polki
Člen | 553
+
0
-

Nerozumím otázce. Možná bychom si mohli napsat soukromě.
Začátečníky učím zadarmo.

Tomas8698
Člen | 109
+
0
-

Polki napsal(a):

Nerozumím otázce. Možná bychom si mohli napsat soukromě.
Začátečníky učím zadarmo.

Pisal som email :) dakujem
zatial som nepracoval s inject cestami z config file