Dateianhänge werden nicht beim Erstellen eines Eintrags gespeichert

  • Ich versuche gerade im FormBuilder ein Wysiwyg-Container einzufügen, der auch mit Dateianhängen umgehen kann (speziell Bilder).

    Dazu habe ich mir im FormBuilder entsprechend einen WysiwygFormContainer erstellt:

    PHP
    WysiwygFormContainer::create("message")
                    ->messageObjectType("mein.object.entry")
                    ->supportSmilies(false)
                    ->attachmentData("mein.object.entry", $this->parentID)
                    ->required()

    Wenn ich jetzt einen Eintrag bearbeite, sprich mit der objectAction edit statt create arbeite, kann ich die Dateianhänge entsprechend einfügen und speichern. Dazu maßgeblich ist die entsprechende update-Methode in meiner Action-Klasse:

    PHP
            $htmlInputProcessor = $this->parameters["message_htmlInputProcessor"];
            $message = $htmlInputProcessor->getHtml();
            $this->parameters["data"]["message"] = $message;
    
            parent::update();
    
            $htmlInputProcessor->setObjectID($this->getObjectIDs()[0]);
            MessageEmbeddedObjectManager::getInstance()->registerObjects($htmlInputProcessor);
    
            return new Entry($this->getObjectIDs()[0]);

    Erstelle ich aber einen Eintrag, kann ich zwar die Dateianhänge hochladen und im WyiswygFormField einfügen, aber diese werden beim Absenden des Formulars nicht dem Eintrag zugeordnet. Analog zur update-Methode habe ich auch eine create-Methode, die eigentlich gleich funktionieren sollte:

    PHP
            $htmlInputProcessor = $this->parameters["message_htmlInputProcessor"];
            $message = $htmlInputProcessor->getHtml();
            $this->parameters["data"]["message"] = $message;
    
            $entry = parent::create();
    
            $htmlInputProcessor->setObjectID($entry->getObjectID());
            MessageEmbeddedObjectManager::getInstance()->registerObjects($htmlInputProcessor);
    
            return $entry;

    Der einzige Unterschied, den ich erkennen kann, ist dass beim Erstellen des Eintrages noch keine ObjectID vorhanden ist (bis diese durch parent::create() erzeugt wird), beim Bearbeiten hingegen schon. Das deckt sich auch mit den Einträgen in wcf1_attachment.

    Beim Erstellen sieht das ganze dann so aus:

    und nach dem Absenden des Formulars so:

    Es ist dann nur noch der BB Code für das Attachment vorhanden, aber es wird nicht eingebunden.

    Bearbeite ich den Eintrag und lade die Datei erneut hoch, wird sie ordnungsgemäß dem Eintrag zugeordnet und anschließend auch entsprechend in dem Eintrag eingebunden.

    Was muss ich beim Erstellen des Eintrags beachten, damit der Dateianhang korrekt dem Eintrag zugeordnet wird?

  • Ich habe mich gerade nochmal damit genauer beschäftigt und folgendes Herausgefunden:

    Beim Aktivieren der Attachments wird für den File-Upload ein tmpHash angelegt. Schaue ich in die Devtools sehe ich diesen. Lade ich Bilder hoch, werden diese mit dem entsprechenden tmpHash in der Datenbank-Tabelle wcf1_attachments gespeichert.

    Sende ich das Formular ab, speichere also den Eintrag, wird allerdings ein neuer tmpHash generiert, der nicht mehr dem in dem versteckten input-Feld (und den Anhängen in der Datenbank) entspricht. Jetzt kann ich also nicht mehr herausfinden, welche Attachments entsprechend zu meinem Eintrag gehören:

    Aber wcfDebug($attachmentHandler->getTmpHashes()); gibt beim Speichern folgendes aus:

    Code
    Array
    (
        [0] => 093e1a5833debec8328ba335b10cc6ef45225e1a
    )

    Woran liegt das? Ist das ein Fehler im WSC?

  • Hallo,

    ohne vollständigen Code ist es schwierig eine genaue Beurteilung zu geben, aber ich rate einfach mal:

    Behandelst du den Parameter message_attachmentHandler in deiner Action? Dieser enthält den AttachmentHandler mit den hochgeladenen Attachments.

    Hier mal ein Beispiel, wie wir diese mit dem FormBuilder in der Action-Klasse beim Upload behandeln:

    Grüße

    Josh

  • Meine DBOAction sieht derzeit so aus, bzw. genauer die create-Funktion:

    Wenn ich versuche das ganze wie ihr mit $attachmentHandler->updateObjectID($object->objectID); zu machen (was soweit ich das sehe äquivalent zu der foreach sein sollte bei mir), funktioniert es ebenfalls nicht. In meiner Datenbank bleiben durchgehend die Hashes gespeichert und die Dateianhänge keiner objectID zugewiesen:

    Der Datenbankeintrag mit attachmentID 29 ist beim Bearbeiten von einem meiner Einträge über das Bearbeiten-Formular entstanden. Das kann man für den Fall gerade ignorieren.

    An dem erzeugen des FormContainer habe ich nichts geändert. Das ist nach wie vor:

    PHP
                WysiwygFormContainer::create("message")
                    ->messageObjectType("mein.object.entry")
                    ->supportSmilies(false)
                    ->attachmentData("mein.object.entry", $this->parentID)
                    ->required()

    Wie bereits oben erwähnt, stimmen der Hash, der im Formular steht (und für die attachments dann auch in der Datenbank gesetzt wird), und der Hash, der in $this->parameters["message_attachmentHandler"] steht nicht überein, was mich halt entsprechend verwundert, weil sie aus der gleichen Anfrage kommen (sollten) und dementsprechend identisch sein müssten - soweit zumindest mein Verständnis.

    EDIT: Wenn ich mal ein wcfDebug($this->parameters["message_attachmentHandler"]); einfüge, erhalte ich folgendes:

    Und meine KnowledgeEntryAttachmentObjectType erweitert AbstractAttachmentObjectType und beinhaltet lediglich die Überprüfungen für die Rechte für canDownload, canUpload und canDelete. Habe mich da grob an https://github.com/WoltLab/WCF/bl…tType.class.php orientiert.

    Edited 3 times, last by ilou (October 2, 2021 at 6:47 PM).

  • Und meine KnowledgeEntryAttachmentObjectType erweitert AbstractAttachmentObjectType und beinhaltet lediglich die Überprüfungen für die Rechte für canDownload, canUpload und canDelete. Habe mich da grob an https://github.com/WoltLab/WCF/bl…tType.class.php orientiert.

    Hab meinen Fehler gefunden. Ich habe bei der Überprüfung der Rechte immer anhand der objectID geprüft, ob der Nutzer lesenden, bzw. schreibenden Zugriff auf die Elternkategorie hat. Beim Erstellen ist die objectID allerdings 0 und dementsprechend wird dann zurückgegeben, dass er das Recht nicht hat, weil es für die objectID keine Elternkategorie gibt, und damit insbesondere auch keine, für die der Nutzer die Rechte hat.

    Nachtrag:

    Hallo,

    kann ich so nicht reproduzieren. Es funktioniert bei mir lokal (als auch hier auf WoltLab.com produktiv) wie erwartet. Ausschnitte wie oben bringen uns aber nicht wirklich weiter. Kannst du also mal das komplette Plugin anhängen (alternativ gerne auch per Mail an ruesweg@woltlab.com), damit ich da mal drüber schauen kann?

    Das hatte ich nämlich vor, ist aber blöd, weil das Plugin 3 Dependencies hat und dann müsste ich alle anhängen. Wollte deswegen dann eine abgespeckte Version davon zusammenbasteln und auch damit testen und da funktionierte es dann. Der einzige Unterschied war zu dem Zeitpunkt, dass bei dem einen im AttachmentObjectType immer true zurückgegeben wurde.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!