Ergebnis 1 bis 8 von 8

Thema: Problem mit file_put_contents

  1. #1
    Contao-Nutzer
    Registriert seit
    29.03.2012.
    Beiträge
    60

    Standard Problem mit file_put_contents

    Hallo,

    ich arbeite gerade an einem Modul, welches eine externe XML-Datei auswertet. Diese Cache ich im Moment auf meinem Server. Dafür verwende ich folgenden Code:
    PHP-Code:
            $filename 'ftps://' $strFtpUser ':' $strFtpPass '@server/' $xmlFilename '.xml';

            
    $filenameLocal 'system/modules/modul/assets/xml/' $xmlFilename '.xml';

            
    $ageInSeconds 3600// eine Stunde
            
    $updateNow false// auf true setzen um direkt zu aktualisieren
            
    if (!file_exists($filenameLocal) || filemtime($filenameLocal) > time() + $ageInSeconds || $updateNow) {
                
    $content file_get_contents($filename);
                
    file_put_contents($filenameLocal$content);
            } 
    Nun erhalte ich im Backend beim bearbeiten des Moduls, die Fehlermeldung, dass die lokale Datei nicht gefunden wird. Ich vermute es liegt daran, dass es mit dem relativen Dateipfad nicht funktioniert. Wie löse ich das Problem am besten?

    Besteht die Möglichkeit zu sagen, dass die Dateien nur aktualisiert werden, wenn die Seite im Frontend aufgerufen wird?

    Vielen Dank!

  2. #2
    Contao-Nutzer
    Registriert seit
    29.03.2012.
    Beiträge
    60

    Standard

    Kann mir jemand weiterhelfen? Konnte das Problem noch nicht lösen, bin für jeden Tipp dankbar

  3. #3
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    Zitat Zitat von Murmelschorsch Beitrag anzeigen
    Nun erhalte ich im Backend beim bearbeiten des Moduls, die Fehlermeldung, dass die lokale Datei nicht gefunden wird. Ich vermute es liegt daran, dass es mit dem relativen Dateipfad nicht funktioniert. Wie löse ich das Problem am besten?
    TL_ROOT vor $filenameLocal setzen.

    Besteht die Möglichkeit zu sagen, dass die Dateien nur aktualisiert werden, wenn die Seite im Frontend aufgerufen wird?
    Wie sieht denn Dein Code aus? Normalerweise müsste das mit der Abfrage von TL_MODE in der generate-Methode laufen. Und Deine Abfrag der Datei steht in der compile-Methode. Schau Dir doch einfach mal andere Module an.

  4. #4
    Contao-Nutzer
    Registriert seit
    29.03.2012.
    Beiträge
    60

    Standard

    Mit TL_ROOT hatte ich keinen Erfolg, dann funktioniert es im Frontend nicht mehr.

    Ich habe eine abstrakte Klasse erstellt, da ich die Methode aus unterschiedlichen Modulen aufrufe. Mein Code sieht dann so aus:
    PHP-Code:
    abstract class Beispiel {
        public static function 
    getXMLContent($xmlFilename) {...(siehe oben)...}

    Ich rufe die Methode dann in einer Methode der gleichen Klasse folgendermaßen auf:
    PHP-Code:
    abstract class Beispiel 
        public static function 
    macheWas(...) {
            
    $objXML self::getXMLContent(self::$strXMLFile);
        }

    Leider habe ich noch kein gutes Beispiel in Contao gesehen, dass ähnlich funktioniert, um mir etwas abzugucken. Vielleicht mache ich an der Stelle auch etwas komplett falsch?

  5. #5
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    OK, aber wie sieht die Struktur deiner Module aus, in denen Deine Hilfsklasse verwendet wird. Dort solltest Du doch rgeln können, wann Die Methode aufgerufen wird.

  6. #6
    Contao-Nutzer
    Registriert seit
    29.03.2012.
    Beiträge
    60

    Standard

    PHP-Code:
    class ContentElementBeispiel extends \ContentElement {
        protected function 
    compile() {
            
    $macheWasDaten = \AbstrakteKlasseBeispiel::macheWas(...);
        }


  7. #7
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.943

    Standard

    Zitat Zitat von Murmelschorsch Beitrag anzeigen
    PHP-Code:
    class ContentElementBeispiel extends \ContentElement {
        protected function 
    compile() {
            
    $macheWasDaten = \AbstrakteKlasseBeispiel::macheWas(...);
        }

    Also hast Du ein ContentElement und kein Modul.

    Sollte hoffentlich aber keinen Unterschied machen.

    Wie sieht es denn mit folgendem aus?

    PHP-Code:
    class ContentElementBeispiel extends \ContentElement {
        protected function 
    compile() {
            
    $macheWasDaten null;
            
    // Nur bei Einsatz im Fronten aufrufen
            
    if (TL_MODE == 'FE') {
              
    $macheWasDaten = \AbstrakteKlasseBeispiel::macheWas(...);
            }
        }

    Und zu Deinem Problem mit dem relativem Pfad bzw. TL_ROOT:
    Mit TL_ROOT hatte ich keinen Erfolg, dann funktioniert es im Frontend nicht mehr.
    Wie äußert sich denn das "funktioniert nicht mehr" bzw. was steht im error.log?

  8. #8
    Contao-Nutzer
    Registriert seit
    29.03.2012.
    Beiträge
    60

    Standard

    Super, der Tipp mit TL_MODE war genau nach was ich gesucht habe. Meine Lösung:
    PHP-Code:
    if (TL_MODE == 'BE') {
        
    $filenameLocal TL_ROOT '/' $filenameLocal;

    Beim Aufruf im Backend wird der absolute Dateipfad benötigt. 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
  •