Jump to content

[Gelöst] Overrides Richtig Nutzen Ps 1.6.1.x


Recommended Posts

Ich habe jetzt mal eine ganz blöde Frage: Wie kann man die Overrides richtig nutzen?

 

Es ist jetzt mein dritter Versuch und irgendwie funktioniert es bei mir nicht. Daher habe ich die Core-Dateien direkt geändert, weil es das einzige ist, bei dem die Änderungen übernommen werden.

Aktuelles Beispiel:
Damit die fancybox-Script Dateien immer geladen werden, wollte ich die Klasse "FrontController.php" entsprechend anpassen.

 

Folgendes habe ich gemacht:

  1. Kopie der Original-Datei "/classes/controller/FrontController.php" heruntergeladen
  2. Änderungen in der Kopie vorgenommen:
    <?php
    class FrontControllerCore extends Controller
    {
        /**
         * Sets controller CSS and JS files.
         *
         * @return bool
         */
        public function setMedia()
        {
            /**
             * If website is accessed by mobile device
             * @see FrontControllerCore::setMobileMedia()
             */
            if ($this->useMobileTheme()) {
                $this->setMobileMedia();
                return true;
            }
    
            $this->addCSS(_THEME_CSS_DIR_.'grid_prestashop.css', 'all');  // retro compat themes 1.5.0.1
            $this->addCSS(_THEME_CSS_DIR_.'global.css', 'all');
            $this->addJquery();
            $this->addJqueryPlugin('easing');
    		$this->addjqueryPlugin('fancybox'); //manuell hinzugefügt und unten auskommentiert
            $this->addJS(_PS_JS_DIR_.'tools.js');
            $this->addJS(_THEME_JS_DIR_.'global.js');
    
            // Automatically add js files from js/autoload directory in the template
            if (@filemtime($this->getThemeDir().'js/autoload/')) {
                foreach (scandir($this->getThemeDir().'js/autoload/', 0) as $file) {
                    if (preg_match('/^[^.].*\.js$/', $file)) {
                        $this->addJS($this->getThemeDir().'js/autoload/'.$file);
                    }
                }
            }
            // Automatically add css files from css/autoload directory in the template
            if (@filemtime($this->getThemeDir().'css/autoload/')) {
                foreach (scandir($this->getThemeDir().'css/autoload', 0) as $file) {
                    if (preg_match('/^[^.].*\.css$/', $file)) {
                        $this->addCSS($this->getThemeDir().'css/autoload/'.$file);
                    }
                }
            }
    
            if (Tools::isSubmit('live_edit') && Tools::getValue('ad') && Tools::getAdminToken('AdminModulesPositions'.(int)Tab::getIdFromClassName('AdminModulesPositions').(int)Tools::getValue('id_employee'))) {
                $this->addJqueryUI('ui.sortable');
                //$this->addjqueryPlugin('fancybox');
                $this->addJS(_PS_JS_DIR_.'hookLiveEdit.js');
            }
    
            if (Configuration::get('PS_QUICK_VIEW')) {
                //$this->addjqueryPlugin('fancybox');
            }
    
            if (Configuration::get('PS_COMPARATOR_MAX_ITEM') > 0) {
                $this->addJS(_THEME_JS_DIR_.'products-comparison.js');
            }
    
            // Execute Hook FrontController SetMedia
            Hook::exec('actionFrontControllerSetMedia', array());
    
            return true;
        }
    }
    ?>
    
  3. Geänderte Datei in "/override/classes/controller/FrontController.php" per FTP hochgeladen.
  4. Cache im BO gelöscht
  5. Datei "/cache/class_index.php" gelöscht
  6. Nachdem in der Datei "/cache/class_index.php" der Eintrag für die Override-Datei eingetragen wurde, habe ich hier den Eintrag in Zeile 2196 von "'override' => false," nach "'override' => true," geändert und gespeichert.
      'FrontController' => 
      array (
        'path' => '',
        'type' => 'class',
        'override' => false,
      ),
      'FrontControllerCore' => 
      array (
        'path' => 'override/classes/controller/FrontController.php',
        'type' => 'class',
        'override' => true,  // --> Eintrag von false nach true geändert
      ),
      'Gender' => 
      array (
        'path' => '',
        'type' => 'class',
        'override' => false,
      ),
    
  7. Seite neu geladen und dennoch wird ein Fehler ausgegeben und die Seite bleibt leer.
    
    Fatal error: Class FrontControllerCore contains 9 abstract methods and must therefore be declared abstract or implement the remaining methods (ControllerCore::checkAccess, ControllerCore::viewAccess, ControllerCore::postProcess, ...) in /www/htdocs/v118360/shop/prestashop/override/classes/controller/FrontController.php on line 89
    

Ahso - damit die PHP Fehlermeldung angezeigt wird, habe ich die Datei "defines.inc.php" angepasst

/* Debug only */
if (!defined('_PS_MODE_DEV_')) {
define('_PS_MODE_DEV_', true);
}

Kann mir jemand erklären, warum das so ist und wie man die overrides richtig nutzen kann? Zusammen mit den Infos aus der Doku werde ich nicht wirklich schlau.

Edited by LukasHH (see edit history)
Link to comment
Share on other sites

Funktioniert auch micht. Da kommt dann diese Fehlermeldung:

Fatal error: Class 'FrontControllerCore' not found in /www/htdocs/v118360/shop/prestashop/override/classes/controller/FrontController.php on line 4

Habe es so geändert:
 

<?php
//class FrontControllerCore extends Controller
class FrontController extends FrontControllerCore
{
    /**
     * Sets controller CSS and JS files.
     *
     * @return bool
     */
    public function setMedia()
    {
.
.
.
    }
}
?>

:(

Link to comment
Share on other sites

Den Punkt 6 habe ich vorhin glatt übersehen! Dein Eigentor! ;)

 

Wenn du schon völlig unnötig Einträge in der /cache/class_index.php änderst, dann auch bitte gleich richtig:

  'FrontController' => 
  array (
    'path' => 'override/classes/controller/FrontController.php',
    'type' => 'class',
    'override' => false,
  ),

Es gibt schon gute Gründe, warum man diese Datei am besten gar nicht ändert, sondern lediglich von PrestaShop neu generieren lässt (was bei jedem Neustart automatisch geschieht) - entweder durch STRG+F5 im Back Office oder durch manuelles Löschen der Datei via FTP.

Link to comment
Share on other sites

Ich glaube ich habe es jetzt. Zumindest als Ansatz:

In der Datei "/override/classes/controller/FrontController.php" hatte ich ja alles herausgenommen, bis auf die geänderte Funktion "public function setMedia()".

Jetzt habe ich die Kopie der Original-Datei genommen, darin die Funktion geändert und so komplett in das Override-Verzeichnis hochgeladen. Das heißt, mit allen anderen darin befindlichen Funktionen, die nicht geändert wurden.

 

Jetzt wird die Datei aus dem Override-Verzeichnis auch genommen und keine Fehlermeldung mehr ausgegeben.

 

Frage: Muss denn die geänderte Datei immer komplett sein? Ich hatte es bisher so verstanden, dass nur die darin geänderte Funktion o.ä. enthalten sein muss.

 

Die Datei /cache/class_index.php habe ich dann noch einmal gelöscht und neu anlegen lassen.
(P.S. Dein Eintrag hatte ich geändert, da ich erst vermutete, dass es an dem false Eintrag lag.)

Edited by LukasHH (see edit history)
Link to comment
Share on other sites

Ich kann keinen Unterschied finden - bis auf die erste Zeile mit der die Klasse angesprochen wird.

 

Ich habe Deine Datei nochmal in das Override-Verzeichnis hochgeladen und im Cache Verzeichnis die Datei class_index.php gelöscht. Funktioniert jetzt auch - wobei ich das ja zuvor auch gemacht hatte.

 

Naja - scheint jetzt jedenfalls über beide Wege zu funktionieren. :)

 

Danke Dir für Deine Unerstützung.

Link to comment
Share on other sites

  • 7 months later...

Änderungen an einem Template macht man grundsätzlich immer in einer Kopie, sodaß man immer die Möglichkeit hat auf das Original zurückzugehen.

 

Backoffice-->Voreinstellungen-->Templates & Vorlagen oben rechts "Template hinzufügen" --> ganz unten "neues Template erstellen" neuen Templatenahmen vergeben und bei "Fehlende Dateien aus vorhandenem Template kopieren " den Namen des zu kopierenden Templates auswählen.

 

Grüsse

Whiley

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...