Ergebnis 1 bis 17 von 17

Thema: Metamodel Item Collection Objekt serialisieren

  1. #1
    Contao-Nutzer
    Registriert seit
    11.03.2015.
    Ort
    Österreich
    Beiträge
    59

    Standard Metamodel Item Collection Objekt serialisieren

    Hallo Leute!

    Ich möchte gerne die Metamodel Item Collection, welche ich als Objekt ermittle, serialisieren und dann als Datei Speichern.

    PHP-Code:
    $container $GLOBALS['container']['metamodels-service-container'];
    $factory $container->getFactory();

    // Objekt vom Metamodel erstellen
    $MMObject $factory->byTableName('MM-Tabellenname');

    // MM Item Collection ermitteln
    $AllObjItems $MMObject->findByFilter($objFilter"id"00"DESC" );

    $ObjString serialize($AllObjItems); 
    Bei einer älteren Metamodel Installation hat dies auch super funktioniert, nur bei den neuen Metamodels sind im ItemObjekt scheinbar "Closures" enthalten und bekomme daher folgende Fehlermeldung:
    "Uncaught exception Exception with message Serialization of 'Closure' is not allowed"

    Hat jemand vielleicht eine Idee wie ich trotzdem zu meinem Ziel komme?

    Danke und lg

  2. #2

  3. #3
    Contao-Urgestein
    Registriert seit
    03.06.2010.
    Ort
    Wuppertal
    Beiträge
    2.149
    User beschenken
    Wunschliste

    Standard

    Hmm, könntest du nicht die Daten per parseAll rausholen und das Array für die Instanzierung des neuen Objekts nutzen?
    Ich würde es mal ausprobieren.

  4. #4
    Contao-Nutzer
    Registriert seit
    11.03.2015.
    Ort
    Österreich
    Beiträge
    59

    Standard

    Danke

    PHP-Code:
    $arrObjItems $AllObjItems>parseAll(); 
    Hat mir schon weitergeholfen, nur wie kann ich dann das Array wieder (einfach) zurück in das ursprüngliche Objekt wandeln?

    Wäre es so richtig?

    PHP-Code:
    $AllObjItemsCopy = new \MetaModels\Items($arrObjItems); 
    Geändert von Flash (29.04.2015 um 14:04 Uhr)

  5. #5
    Contao-Urgestein
    Registriert seit
    03.06.2010.
    Ort
    Wuppertal
    Beiträge
    2.149
    User beschenken
    Wunschliste

    Standard

    In das ursprüngliche Objekt geht nicht - es wäre ja auch beim Serialisieren ein neues gewesen.

    Aber probier es mal mit:

    PHP-Code:
    $objItems = new MetaModelItems($arrItems); 

  6. #6
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    @Flash. in Contao (Core) gibt es für serialize aus eine eigene Alternative - musst mal nachsehen, was da besser/anders ist...

  7. #7
    Contao-Nutzer
    Registriert seit
    11.03.2015.
    Ort
    Österreich
    Beiträge
    59

    Standard

    Zitat Zitat von zonky Beitrag anzeigen
    In Contao (Core) gibt es für serialize aus eine eigene Alternative
    Hm, ich kann leider keine im Core Code finden

  8. #8

  9. #9
    Contao-Nutzer
    Registriert seit
    11.03.2015.
    Ort
    Österreich
    Beiträge
    59

    Standard

    Habs rausgefunden

    Beispiel um Alle Werte eines Metamodels als String oder Json zu speichern

    PHP-Code:
    $container $GLOBALS['container']['metamodels-service-container'];
    $factory $container->getFactory();

    // Objekt vom Metamodel erstellen
    $MMObject $factory->byTableName('MM-Tabellenname');

    // MM Item Collection ermitteln
    $AllObjItems $MMObject->findByFilter($objFilter"id"00"DESC" );

    // Alle Werte als Array holen
    $arrObjItems $AllObjItems->parseAll();

    // In ein json umwandeln
    $JsonObjItems json_encode($arrObjItems);

    // ggf. in einen String umwandeln
    #$StringObjItems = serialize($arrObjItems);

    // z.B.: Als json Datei speichern
    $objFile = new \File('files/Datei.json'true);
    $objFile->write($JsonObjItems);
    $objFile->close(); 
    Beispiel um die Werte wieder zurück zu wandeln

    PHP-Code:
    $container $GLOBALS['container']['metamodels-service-container'];
    $factory $container->getFactory();

    // Objekt vom Metamodel erstellen
    $MMObject $factory->byTableName('MM-Tabellenname');

    $JsonFile = @file_get_contents html_entity_decode ('files/Datei.json'));

    // Falls die Datei ein String ist
    #$arrObjItems = unserialize($StringObjItems);

    // Json wieder in ein Array zurück wandeln
    $arrObjItems json_decode($StringObjItems);

    foreach(
    $arrObjItems as $arrObjItem)
    {
           
    $ObjItem = new \MetaModels\Item($MMObject$arrObjItem['raw']);

           
    // Speichern
           
    $ObjItem->save();

           
    // Oder
           
    $MMObject->saveItem($ObjItem);

    Ich hoffe ich konnte so manchen Entwickler damit helfen
    Geändert von Flash (30.04.2015 um 20:04 Uhr)

  10. #10
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    PHP-Code:
           // Speichern
           
    $ObjItem->save();[/INDENT
    hmm was macht das "INDENT" dort?

  11. #11
    Contao-Nutzer
    Registriert seit
    01.04.2015.
    Beiträge
    127

    Standard

    Wie kann man die json Datei schöner Formatiert erstellen?
    oder greift hier der Contao Allgemeine Kompressionsalgoritmus der alles zusammen staucht?

    Und wie kann man lediglich den "text" ausgeben und nicht raw und attribute?

    MfG
    supahr

  12. #12
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von supahr Beitrag anzeigen
    Wie kann man die json Datei schöner Formatiert erstellen?
    was soll die Frage bedeuten?? Für JSON gibt es Regeln, wie die auszusehen hat - mit "schöner formatiert" is da nix...

  13. #13
    Contao-Urgestein
    Registriert seit
    03.06.2010.
    Ort
    Wuppertal
    Beiträge
    2.149
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von supahr Beitrag anzeigen
    Wie kann man die json Datei schöner Formatiert erstellen?
    oder greift hier der Contao Allgemeine Kompressionsalgoritmus der alles zusammen staucht?

    Und wie kann man lediglich den "text" ausgeben und nicht raw und attribute?

    MfG
    supahr
    json_encode kennt als Optionsparameter: JSON_PRETTY_PRINT

    Einfach vorher im Array die Einträge entfernen.

  14. #14
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Flex Beitrag anzeigen
    json_encode kennt als Optionsparameter: JSON_PRETTY_PRINT

    Einfach vorher im Array die Einträge entfernen.
    der JSON-"String" wird doch wohl nicht pur im FE angezeigt?!?!

  15. #15
    Contao-Nutzer
    Registriert seit
    01.04.2015.
    Beiträge
    127

    Standard

    Ich meine damit, durch den Quellcode oben wird bei mir minimized ausgeben, ich hätte es gerne eingerückt.

    Siehe Screenshots

    PHP-Code:
    // In ein json umwandeln
    $JsonObjItems json_encode($arrObjItemsJSON_PRETTY_PRINT); 
    macht was ich möchte
    Angehängte Grafiken Angehängte Grafiken
    Geändert von supahr (30.05.2015 um 17:06 Uhr)

  16. #16
    Contao-Fan
    Registriert seit
    28.06.2009.
    Ort
    Steffisburg
    Beiträge
    473

    Frage

    Und wie kann man lediglich den "text" ausgeben und nicht raw und attribute?
    Das würde mich auch interessieren. Ich bräuchte dann nur "raw"

  17. #17
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von tognit Beitrag anzeigen
    Das würde mich auch interessieren. Ich bräuchte dann nur "raw"
    lass Dir das Array ausgeben z.B. per print_r - und guck nach dem entsprechenden Knoten [text]

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
  •