LukasHH Posted February 14, 2016 Share Posted February 14, 2016 (edited) 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: Kopie der Original-Datei "/classes/controller/FrontController.php" heruntergeladen Ä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; } } ?> Geänderte Datei in "/override/classes/controller/FrontController.php" per FTP hochgeladen. Cache im BO gelöscht Datei "/cache/class_index.php" gelöscht 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, ), 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 February 14, 2016 by LukasHH (see edit history) Link to comment Share on other sites More sharing options...
eleazar Posted February 14, 2016 Share Posted February 14, 2016 Versuchs mal so: class FrontController extends FrontControllerCore Link to comment Share on other sites More sharing options...
LukasHH Posted February 14, 2016 Author Share Posted February 14, 2016 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 More sharing options...
eleazar Posted February 14, 2016 Share Posted February 14, 2016 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 More sharing options...
LukasHH Posted February 14, 2016 Author Share Posted February 14, 2016 (edited) 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 February 14, 2016 by LukasHH (see edit history) Link to comment Share on other sites More sharing options...
eleazar Posted February 14, 2016 Share Posted February 14, 2016 Nen, die muss nicht komplett sein. Das Override der Funktion reicht aus. Bei mir lief es auch. Irgendeine Kleinigkeit ist dir wohl entgangen. Kannst ja mal vergleichen: FrontController.zip Link to comment Share on other sites More sharing options...
LukasHH Posted February 14, 2016 Author Share Posted February 14, 2016 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 More sharing options...
Claudiocool Posted October 10, 2016 Share Posted October 10, 2016 Kann man in die Overrides alles reistecken, was man geändert hat, also auch z.B. Themes, um was zu testen, und wenn man es dann versemmelt hat, einfach wieder löschen und der geht dann wieder auf die Originaldateien? Link to comment Share on other sites More sharing options...
Whiley Posted October 10, 2016 Share Posted October 10, 2016 Ä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 More sharing options...
Claudiocool Posted October 12, 2016 Share Posted October 12, 2016 Das habe ich gemacht, allerdings war dann im kopierten Template kein Templatekonfigurator drin, nur die erweiterten Einstellungen Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now