Ergebnis 1 bis 17 von 17

Thema: File Upload im Frontend und Verknüpfung mit Artikel

  1. #1
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard File Upload im Frontend und Verknüpfung mit Artikel

    Hallo Comunity,

    es geht um eine schon bestehenden contao 3.3 Knowledge Base- Webanwendung. Auf mehreren FE Seiten werden Info-Bilder angezeigt. Der FE User soll nun diese Bilder durch eigene Uploads ergänzen können. Die Bilder sollen nach dem Upload auf dem gelchen Content Element / Artikel, bei dem sie hochgeladen wurden, angezeigt werden.

    Dies setze ich mit einem FE Formular zum Bild Upload um. Ich verwende keinen Formulargenerator weil es zu aufwändig wäre, ein solches Formular auf den zahlreichen, schon bestehenden Seiten einzutragen. Ich erweitere stattdessen ein vorhandenes Content Element, welches auf mehreren Seiten integriert ist und Bilder im FE ausgibt / anzeigt.

    Der Bild Upoload funktioniert. Ich habe Elemente aus FormFileUpload->validate() übernommen. Mein Problem ist nun: Wie kann ich das Hochgeladene Bild mit dem entsprechenden Content Element / Artikel verknüpfen, so dass es auf der Seite, von der aus es über das Formular hochgeladen wurde, auch wieder ausgegeben / angezeigt wird?

    Ich habe keine entsprechende Verknüpfung in der DB finden können.

    Vielen Dank für eure Hife!

  2. #2
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.452
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Moin,

    also wenn du eh alles selbst machst, wirst auch die Verknüpfung selbst erstellen müssen. Dazu brauchst vlt. ne Hildstabelle, in der du Bidl-Id und Artikel-ID verbindest ... und dann wirst das auch selbst wieder auslesen müssen.

    Gruß, Cliff

  3. #3
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard

    Hallo Cliff,

    da werde ich hoffentlich keine neue Tabelle benötigen. Die Verbindung sollte ja innerhalb der bestehenden Tabellen definiert sein.

    Wenn ich einen Artikel mit einem Content Element "Text" erstelle und in dieses ein Bild lade, oder direkt ein Bild in einen Artikel einfüge, ist die Verknüpfung ja auch irgendwo hinterlegt. Ich kann sie aber auch in einem solchen Fall nicht finden.

    Wahrscheinlich liegts an der kryptischen pid in tl_files. Ich werde das mal untersuchen.

    Gruß
    Timtow

  4. #4
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard

    also inzwischen bin ich mal so weit:

    Die Verknüpfung von Bild und Content und damit der beiden Tabellen tl_files und tl_content erfolgt über einen Eintrag im serialisierten Array im Feld tl_content.multiSRC. Dieser Array enthält Pfade in Form von BLOBs und diese sollten wohl die uuid der referenzierten Bilddateien in tl_files sein.

    Wenn ich nun ein hochgeladenes BIld in einen content element einfügen möchte, muss ich also die uuid des Bildes aus der tl_files rauslesen und einfach in den besagten Array in multiSRC in tl_content einfügen.

    Das klappt leider nicht so einfach. Irgend etwas geht wohl mit der Konvertierung der Werte schief. Im Moment ziehe ich dne binären Wert aus tl_files.uuid direkt ohne Konvertierung raus und array_push() ihn auf den zuvor deserialisierten Array aus tl_content.multiSRC. Dann serialisiere ich diesen wieder und klopfe ihn in ein UPDATE-Statement. Klappt leider nicht! Auch die Variante, den Wert mit bin2Hex zu konvertieren und noch im UPDATE Statement mit UNHEX( bin2Hex(<binäre uuid>) ) wieder zu ent-hexen klappt nicht. Sowas ähnliches hatte ich in FilesModel::findMultipleByUuids() fgefunden.

    Wer kann mir weiterhelfen?

    Grüße
    Timtow

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Zitat Zitat von timtow Beitrag anzeigen
    Wenn ich nun ein hochgeladenes BIld in einen content element einfügen möchte, muss ich also die uuid des Bildes aus der tl_files rauslesen und einfach in den besagten Array in multiSRC in tl_content einfügen.
    Du musst es nicht extra suchen, sondern nur folgendes machen:
    PHP-Code:
    $objFile = \Dbafs::addResource$filepath );
    echo 
    $objFile->uuid

    multiSRC (under orderSRC) sind ein serialisiertes Array mit ein oder mehreren UUIDs.

  6. #6
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard

    ja Stimmt, das war missverständlich formuliert. Ich tu genau das, was du vorschlägst. Hier mal der Code, der z.T. aus den ich z.T. FormFrontendUpad::validate( ) rauskopiert habe.

    PHP-Code:
    // Generate the DB entries
    $strFile $strUploadFolder '/' $file['name'];
    $objFile = \FilesModel::findByPath($strFile);

    // Existing file is being replaced (see #4818)
    if ($objFile !== null)
    {
        
    $objFile->tstamp time();
        
    $objFile->path   $strFile;
        
    $objFile->hash   md5_file(TL_ROOT '/' $strFile);
        
    $objFile->save();
    }
    else
    {
        
    $objFile = \Dbafs::addResource($strFile);
    }
    $newUuid $objFile->uuid;

    // Update the hash of the target folder
    \Dbafs::updateFolderHashes($strUploadFolder);

    // Hänge Path an mulitSRC vom Content Element dran
    $multiSRC $this->multiSRC;// schon deserialisiert
    $multiSRC[] = $newUuid;
    $multiSRC serialize($multiSRC);

    $orderSRC deserialize($this->orderSRC);
    $orderSRC[] = $newUuid;
    $orderSRC serialize($orderSRC);

    // Hier sieht ein Dump von $multiSRC okay aus, das neue Element ist eingefügt
    // aktualisiere DB
    $this->import("Database");
    $sql "UPDATE tl_content SET tstamp='" time()."',multiSRC= '".$multiSRC."' ,orderSRC= '".$orderSRC."' WHERE id=" $this->id;
    // ...Das klappt aber leider nicht 
    Geändert von timtow (11.09.2015 um 11:04 Uhr)

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Das alles brauchst du ja nicht. Mach' einfach nur:
    PHP-Code:
    // Generate the DB entries
    $strFile $strUploadFolder '/' $file['name'];
    $objFile = \Dbafs::addResource($strFile);
    $newUuid $objFile->uuid;

    // Hänge Path an mulitSRC vom Content Element dran
    $multiSRC $this->multiSRC;// schon deserialisiert
    $multiSRC[] = $newUuid;
    $multiSRC serialize($multiSRC);

    $orderSRC deserialize($this->orderSRC);
    $orderSRC[] = $newUuid;
    $orderSRC serialize($orderSRC); 
    Aber ganz verstehe ich deinen Code nicht. Wo machst du das überhaupt? Was ist das genaue Ziel? Woher kommt $this->multiSRC?

  8. #8
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard

    okay, jetzt hast du die aktualisierung des Folder hashes und die Prüfung, ob die Datei existiert, weggelassen. Das hilft mir aber nicht wirklich weiter.

    Der Code steht in einer Klasse, die von ContentDownloads erbt. Er steht dort in der methode compile(), die nach dem Absenden des Formulars zusätzlich zur generate()-ausgeführt wird. Daher existiert $this->multiSRC schon.

    Bei der Anwendung geht es darum, eine Datei über ein FE Formular hochzuladen und sie automatisch in das content element einzufügen, das auf der Seite, auf der der Upload ausgeführt wird, gerade angezeigt wird. Dabei handelt sich es um ein Content-Download Content-Element, welches sich im aktuell angezeigten Artikel befindet, daher arbeite ich in einem Child von ContentDownload, weil cih ja dieses Content Element "Download" verändern möchte.

    Ich hab es auch am Anfang vom Thread schon beschrieben.

    Ist es jetzt klarer, was das ganze soll?

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Zitat Zitat von timtow Beitrag anzeigen
    okay, jetzt hast du die aktualisierung des Folder hashes und die Prüfung, ob die Datei existiert, weggelassen. Das hilft mir aber nicht wirklich weiter.
    Unbedingt brauchst du diese Abfrage nicht, kannst du aber natürlich drin lassen.

    Zitat Zitat von timtow Beitrag anzeigen
    Der Code steht in einer Klasse, die von ContentDownloads erbt. Er steht dort in der methode compile(), die nach dem Absenden des Formulars zusätzlich zur generate()-ausgeführt wird. Daher existiert $this->multiSRC schon.
    Versteh, aber was genau funktioniert nun nicht? Wo hapert es?
    Geändert von Spooky (11.09.2015 um 13:17 Uhr)

  10. #10
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard

    es hapert im sql UPDATE unterhalb der von dir gepasteten Codeteile. Der Array scheint okay und enthält die hinzugefügte, binäre Pfadangabe. Sieht jedenfalls so aus weil er aus ähnlichen Sonderzeichen besteht wie die anderen Pfadangaben im gleichen Array. Auch entsprechen diese Sonderzeichen den Angaben in tl_files.uuid. Der UPDATE haut aber nicht hin. es wird nix in die DB geschrieben.

    Ich werde mal mit INSERTS versuchen, das Problem weiter einzukreisen.

    vielen Dank auf jeden Fall schon mal so weit!

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Hm, naja in deinem Code generierst du ja nur den SQL String, führst aber den eigentlichen Database query nicht aus. Ich bin davon ausgegangen, dass du diese Code Zeile einfach hier nicht gepostet hast, aber evt. ist das nicht der Fall?

  12. #12
    Contao-Fan Avatar von Hendriks
    Registriert seit
    28.08.2009.
    Ort
    Stuttgart
    Beiträge
    275

    Standard

    Hi!

    Möchte mich hier mal einklinken... Ich habe ein EFG-Formular für tl_news, und möchte es dem Mitglied ermöglichen, durch ein Datei-Upload (-Feld) automatisch das Bildmotiv für die News zu setzen. Frage mich nun auch, wie ich in diesem Fall das singleSRC-Feld der News automatisch genau auf das hochgeladene Bild gesetzt bekomme? Welche Felder benötige ich dazu im Formular, un wie müssten die konfiguriert sein? Ein Datei-Upload-Feld auf die singleSRC-Spalte der tl_news zu setzen reicht ja (leider) nicht aus... Wie könnte ich das konkret und "einfach" hinbekommen?

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    In so einem Fall kannst du wahrscheinlich einfach diese Mini Extension verwenden: [store_uuid]

  14. #14
    Contao-Fan Avatar von Hendriks
    Registriert seit
    28.08.2009.
    Ort
    Stuttgart
    Beiträge
    275

    Standard

    Danke Dir für den Tipp!

    Werd' ich gleich mal antesten...

  15. #15
    Contao-Fan Avatar von Hendriks
    Registriert seit
    28.08.2009.
    Ort
    Stuttgart
    Beiträge
    275

    Standard

    Perfekt! Genau was ich wollte!

    Danke Dir für dieses praktische kleine Hilfsmodul!

  16. #16
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.254
    Partner-ID
    10107

    Standard

    Bitteschön


    Nochmal @timtow: Falls du tatsächlich vergessen hast den Datenbank Query auch wirklich abzusetzen, dann brauchst du noch folgendes:
    PHP-Code:
    \Database::getInstance()->query($sql); 
    Besser wäre jedoch:
    PHP-Code:
    $sql "UPDATE tl_content SET tstamp = NOW(), multiSRC = ?, orderSRC = ? WHERE id = ?";
    \
    Database::getInstance()->prepare($sql)->execute($multiSRC$orderSRC$this->id); 
    Weitere Alternative:
    PHP-Code:
    $objContent = new \ContentModel($this->id);
    $objContent->tstamp time();
    $objContent->multiSRC serialize($this->multiSRC);
    $objContent->orderSRC serialize($this->orderSRC);
    $objContent->save(); 
    Geändert von Spooky (12.09.2015 um 16:29 Uhr)

  17. #17
    Contao-Nutzer
    Registriert seit
    30.03.2011.
    Beiträge
    18

    Standard

    Es war ein Fehler im SQL. Ich hatte ihna abgesetzt aber eben falsch. Jetzt läuft alles.

    Die Betreffenden oben fehlenden Codezeilen sind diese:

    PHP-Code:
    $this->import("Database");
    $sqlUpdate =   "UPDATE tl_content SET tstamp='" time()."',multiSRC= '".$multiSRC."' ,orderSRC= '".$orderSRC."' WHERE id=" $this->id;
    $this->Database->prepare$sqlUpdate)->execute(); 
    womit das betreffende Content Element aktualisiert wird und nun das zusätzliche Bild enthält.

    Spooky, Vielen Dank!

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •