Ergebnis 1 bis 16 von 16

Thema: fileTree Felder für Contao 3.2 migrieren in eigenen Erweiterungen

  1. #1
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.512
    User beschenken
    Wunschliste

    HTML fileTree Felder für Contao 3.2 migrieren in eigenen Erweiterungen

    Beim Update auf 3.2 werden nur die Core Module migriert. Das ist anders auch kaum möglich, da bei externen Erweiterungen ja die DCA bzw. database.sql mit geändert werden müsste, sonst schlägt Contao nach der Migration gleich vor diese wieder rückgängig zu machen (so war das in der RC Version noch).

    Also muss man als Erweiterungsprogrammierer nun selber migrieren.
    Hier mal grob an eins meiner Module skizziert wie man da ran gehen könnte.

    Als erstes natürlich muss das Datenbankfeld geändert werden. Das macht man natürlich direkt in der DCA / database.sql, hier mal bei der DCA:
    vorher für Single Felder:
    PHP-Code:
    'sql'                     => "varchar(255) NOT NULL default ''"
    jetzt
    PHP-Code:
    'sql'                     => "binary(16) NULL"
    Für multiSRC Felder bleibt es bei:
    PHP-Code:
        'sql' => "blob NULL"
    Jetzt muss man dafür sorgen, dass nur bei einem Update, dieses Feld migriert wird und auch nur wenn es nicht bereits migriert wurde.
    Ich tue das mittels der runonce.php, diese wird VOR dem DB Update aufgerufen.
    Dazu prüfe ich, ob die Tabelle überhaupt existiert.
    Wenn ja, hat es noch das alte Format? Wenn ja, migrieren.
    In dem Beispiel sind hier 2 Tabellen mit je einem Feld betroffen, ich prüfe aber nur eines, denn wenn dann....
    Für die Migration stellt Contao 3.2 nun 3 Methoden zur Verfügung:

    PHP-Code:
    // Ein singleSRC-Feld umwandeln
    Database\Updater::convertSingleField($table$field);

    // Ein multiSRC-Feld umwandeln
    Database\Updater::convertMultiField($table$field);

    // Ein orderSRC-Feld umwandeln
    Database\Updater::convertOrderField($table$field); 
    In meinem Beispiel (Ausschnitt) sind das beides Single Felder:

    PHP-Code:
    class BannerRunonceJob extends Controller
    {
        public function 
    __construct()
        {
            
    parent::__construct();
            
    $this->import('Database');
        }
        public function 
    run()
        {
            
    //Check for update to C3.2
            
    if ($this->Database->tableExists('tl_banner'))
            {
                
    $arrFields $this->Database->listFields('tl_banner');
                
    $blnDone false;
                
                
    //check for one table and field
                
    foreach ($arrFields as $arrField)
                {
                    if (
    $arrField['name'] == 'banner_image' && $arrField['type'] != 'varchar')
                    {
                        
    $blnDone true;
                    }
                }
                
    // Run the version 3.2 update in two tables
                
    if ($blnDone == false)
                {
                    
    Database\Updater::convertSingleField('tl_banner''banner_image');
                    
    Database\Updater::convertSingleField('tl_banner_category''banner_default_image');
                }
                
            }
            
        }
    }

    $objBannerRunonceJob = new BannerRunonceJob();
    $objBannerRunonceJob->run(); 
    Hinweis: Die convert* Methoden legen <feldname>_backup Felder an zur Migration und löschen diese nicht.
    Nach der Migration wird also im Backend angezeigt, man könnte diese löschen.
    Kann man machen, sollte man aber erst wenn alles funktioniert. So könnte man im Falle eine Falles per Hand die Migration wieder rückgängig machen.
    Auch könnte man in der runonce prüfen ob alles OK ist und diese Felder selber löschen.

    Ich hoffe es hilft jemandem, bei mir funktioniert es jedenfalls.
    Geändert von BugBuster (03.02.2014 um 17:34 Uhr) Grund: Ergänzung für multiSRC Felder
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  2. #2
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.512
    User beschenken
    Wunschliste

    Standard

    kleiner Nachtrag: da meine neue Version erst am C3.2 freigegeben sein wird, prüfe ich hier nicht ob das überhaupt die 3.2 ist.
    Wer übergreifende Versionen baut, muss das dann noch mit in der Prüfung mit aufnehmen.
    PHP-Code:
    if (version_compare(VERSION'3.1''>'))
    {
        ....

    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  3. #3
    Contao-Urgestein Avatar von tril
    Registriert seit
    07.01.2010.
    Ort
    Bad Marienberg
    Beiträge
    2.939
    User beschenken
    Wunschliste

    Standard

    Wichtig: Wenn man nicht aufpasst, kann es schnell zu Datenverlust führen!

    https://github.com/contao/core/issues/6481

  4. #4
    Contao-Hauptentwickler
    AG Core-Entwicklung
    Avatar von leo
    Registriert seit
    05.06.2009.
    Ort
    Wuppertal
    Beiträge
    816

    Standard

    Die AG Core ist schon dran, die Helfer-Methoden so umzubauen, dass die Probleme, die Tristan aufgezeigt hat (Danke für das ausführliche Ticket!), direkt im Updater umgangen werden. Sobald die Routine steht geben wir die Version 3.2.1 frei.

  5. #5
    AG Core-Entwicklung Avatar von Psi
    Registriert seit
    19.06.2009.
    Ort
    Mittelfranken
    Beiträge
    930
    Partner-ID
    5583
    User beschenken
    Wunschliste

    Standard

    Hi Kollegen,

    https://github.com/psi-4ward/contao-...se/Updater.php

    ich wäre Dankbar wenn ihr das mal testen könntet!
    Geändert von Psi (27.11.2013 um 15:00 Uhr)
    Anerkennung motiviert: Amazon-Wunschliste && TANSTAAFL
    Kontakt: http://www.4wardmedia.de

  6. #6
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Hallo,

    mal ne Frage muss man das nur in binary umwandeln wenn man den src Pfad in der DB hat?

    Ich habe nur die Bild ID drinund wen nich den Code anwende, bringt das mir nichts, es legt nicht mal ein Backup Feld an

    Das Ganze ruft man doch in der DCA-Datei auf oder?
    PHP-Code:
    class updateTERMS extends Controller
    {
        public function 
    __construct()
        {
            
    parent::__construct();
            
    $this->import('Database');
        }
        public function 
    run()
        {
            
    //Check for update to C3.2
            
    if ($this->Database->tableExists('tl_wt_travel_org'))
            {
                
    $arrFields $this->Database->listFields('tl_wt_travel_org');
                
    $blnDone false;
                
                
    //check for one table and field
                
    foreach ($arrFields as $arrField)
                {
                    if (
    $arrField['name'] == 'orgTerms' && $arrField['type'] != 'varchar')
                    {
                        
    $blnDone true;
                    }
                }
                
    // Run the version 3.2 update in two tables
                
    if ($blnDone == false)
                {
                    
    Database\Updater::convertSingleField('tl_wt_travel_org''orgTerms');
                }
                
            }
            
        }
    }

    $updateTERMS = new updateTERMS ();
    $updateTERMS ->run(); 

  7. #7
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.512
    User beschenken
    Wunschliste

    Standard

    nein, in einer runonce.php Datei, das soll ja nur ein mal durchgeführt werden.
    Die legst du im Verzeichnis config deiner Erweiterung ab. Beim DB Udpate (bei Installation/Update einer Erweiterung bzw. Aufruf von install.php oder "DB aktualisieren" in der Erweiterungsverwaltung) wird vorher diese Datei dann ausgeführt.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  8. #8
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Ah ja steht ja auch oben


    Also in dieser Reinfolge?

    1. im DCA die Felder anpassen
    2. runonce.php erstellen
    3. Update durüchführen?


    EDIT: Irgendwas haut noch net hin, es wird das backupfeld nicht erstellt und meine Werte in der Tabelle sehen so aus..31303433000000000000000000000000

    EDIT2: nutze auhc das hier?? https://github.com/psi-4ward/contao-...se/Updater.php
    Geändert von WebRoxx (21.01.2014 um 09:46 Uhr)

  9. #9
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Wenn ich das hier abändere

    PHP-Code:
    if ($blnDone == 1
    statt

    PHP-Code:
    if ($blnDone == false
    läuft es perfekt, versteh nur nicht warum

  10. #10
    Contao-Nutzer
    Registriert seit
    06.10.2009.
    Beiträge
    161

    Standard

    Hallo.
    Ich verzweifele gerade an dieser groben Änderung mit den UUIDs im Contao 3.2.x file system! :-(
    Wer weiß, wofür das gut sein soll, aber eigene Erweiterungen zu programmieren macht so gar keinen Spaß, wenn man das nach 2 Monaten alles wieder umbauen muß.
    Hmmh, genug gemeckert, zu meinem Problem:

    Ich habe ein DB-Feld für einen Folder, das ich schon (meine ich) migriert habe. In der Datenbank steht nun als Wert (UUID???) für folder SRC:
    701c3f4b8a6211e3909d0026b9eede19

    In meinem template für das Modul "Auflistung" kommt aber etwas ganz anderes raus:
    Code:
     [folderSRC] => Array
                    (
                        [raw] => p?K�b㐝&���
                        [label] => Bilder Ordner
                        [content] => p?K�b㐝&���
                        [class] => row_9 row_last odd
                    )
    Was läuft da falsch?????

  11. #11
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.512
    User beschenken
    Wunschliste

    Standard

    Das Modul Auflistung macht genau das was es sagt, es listet auf, und zwar die Roh Daten aus der Tabelle.
    Da die UUID aber nicht als varchar gespeichert wird, sondern als binary(16), siehts du genau das, die binäre Form deiner UUID.

    Und genau die musst du nun umwandeln wenn du damit arbeiten willst.
    Das binary nach UUID:
    PHP-Code:
    $string_wert String::binToUuid($binärer_wert); 
    und dann die UUID zum Pfad+Dateiname wie weiter oben schon gezeigt.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  12. #12
    Contao-Nutzer
    Registriert seit
    06.10.2009.
    Beiträge
    161

    Standard

    Danke, das ist schon mal eine heiße Spur...
    Jetzt steht in meiner Variablen der gleiche Wert, den ich auch mit PHPmyAdmin in der DB sehe (wobei ich letzteres auch nicht so ganz verstehe...):
    701c3f4b-8a62-11e3-909d-0026b9eede19
    Trotzdem bekomme ich meine Dateien aus dem Ordner noch nicht ausgelesen. die entsprechende Stelle in meinem "info_" Template sieht so aus:
    PHP-Code:
        $folder String::binToUuid($this->record[folderSRC]['content']);  
        if(
    $folder){
            
    $objSubfiles = \FilesModel::findByPid($folder);
            while (
    $objSubfiles->next())
                {
                    echo 
    "<li><img src=\"" .  $objSubfiles->path "\"></li>\n";                
                }
        } 
    das ergibt aber einen Fehler: Call to a member function next() ...
    Auch probiert habe ich :
    PHP-Code:
    $objSubfiles = \FilesModel::findByPid($folder->uuid); 
    Was ist verkehrt??

  13. #13
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.512
    User beschenken
    Wunschliste

    Standard

    Da musst du mal selber in den Quellen suchen.
    Nur soviel:
    PHP-Code:
    $pfad_object FilesModel::findByPk($folder);
    //Order-Pfad steht nun in $pfad_object->path 
    Damit hast du aber immer noch nicht die Dateien die im Ordner liegen.
    Die musst du nun selber mit scan() (eine Funktion vom Contao Core: https://github.com/contao/core/blob/...tions.php#L169 )
    rausfinden und damit dann weiter arbeiten.
    Vielleicht gibt es auch was besseres im aktuellem Core, was die aus der Ordner UUID gleich die multiplen Datei UUIDs zurückgibt die du dann einzeln wandeln müsstest.
    Kann ich dir nicht sagen.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  14. #14
    Contao-Nutzer
    Registriert seit
    06.10.2009.
    Beiträge
    161

    Standard

    Erstmal vielen Dank!
    Ich verstehe echt nicht, warum das auf einmal sooo kompliziert geworden ist, was vorher ein kleiner Dreizeiler war!? Unter 3.1 läuft es ja und dann wird das derart übern Haufen geschmissen, tststs...

  15. #15
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.512
    User beschenken
    Wunschliste

    Standard

    Weil in 3.1 die normalen IDs nicht eineindeutig waren, was aber für gewisse Anwendungen der Fall sein musste.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  16. #16
    Contao-Urgestein Avatar von Samson1964
    Registriert seit
    05.11.2012.
    Ort
    Berlin
    Beiträge
    2.794

    Standard

    In meiner 3.3.4-Testinstallation ist nach diesem Code
    PHP-Code:
    if (version_compare(VERSION'3.2''>='))
    {
        
    Database\Updater::convertSingleField('tl_adressen''singleSRC');

    in der runonce.php mein varchar-Feld zwar in binary umgewandelt, aber alles ist auf NULL gesetzt worden. Auch wo vorher Datei-ID's drin waren.
    Im DCA habe ich binary(16) bei singleSRC zu stehen. Danach habe ich meine Tabelle importiert, wo singleSRC als varchar(255) definiert ist und runonce ausgelöst.

    EDIT: Habe wahrscheinlich die Lösung gefunden. In Updater.php wird mit FilesModel::findByPk die ID abgefragt. Die existiert natürlich nicht in meiner tl_files. Ergo wird das Feld auf NULL gesetzt. Wahrscheinlich muß ich meine tl_files auch mal importieren um das zu verhindern.
    Geändert von Samson1964 (10.09.2014 um 10:47 Uhr)
    Viele Grüße
    Frank

    Seit Mai 2013 Fan von Contao
    Webmaster vom Deutschen Schachbund und Berliner Schachverband
    Mein Blog: Schachbulle
    Meine Erweiterungen bei GitHub
    Meine Videos auf YouTube: Playlist zur Contao-Programmierung/Einrichtung

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
  •