Erscheint in dem System-Logfile var/log/ system.log diese Fehlermeldung: DEBUG (7): HEADERS ALREADY SENT: <pre>[0] PFAD_ZUR_MAGENTO_ISTALLATION\app\ code\core\Mage\Core\Controller\Response\Http.php:53, gilt es zuerst, die Stelle zu finden an der der Fehler entsteht, da die Http.php nur nachgeschaltet ist. Hierzu fügen wir z.B. in der Datei
\lib\Zend\Controller\Response\Abstract.php
in der Funktion
public function canSendHeaders($throw = false)
diese zwei Zeilen an, um Dateinamen und Zeile auszugeben:
Mage::log('File: ' . $file);
Mage::log('Line: ' . $line);
In unserem Falle ist der Verursacher hier die Datei
\lib\Varien\Image\Adapter\Gd2.php
und hierin die Funktion
public function display()
Man könnte auch in der o.g. Http.php die Direktive
Mage::log(print_r(get_included_files(),true));
einfügen, jedoch sind wir dann Wochen damit beschäftigt, die ganze Liste der bis dahin eingebundenen Dateien zu untersuchen.
An welchen Stellen wird diese Funktion display() jedoch aufgerufen? Unter anderem in
\app\code\core\Mage\Adminhtml\controllers\Cms\WysiwygController.php
in der Funktion
public function directiveAction()
Wir sehen hier auf unserem Wege einige Threads, in denen die Problematik beschrieben wird, unter anderem sehen wir in den Release Notes von Magento CE 1.9.3 (http://devdocs.magento.com/guides/m1x/ce19-ee114/ce1.9_release-notes.html), dass dieser Bug anscheinend in Magento 1.9.3. behoben wurde ("Using a Portable Network Graphics (.png
) image on a CMS page no longer results in a HEADERS_ALREADY_SENT
message to be logged."). Aber welche Datei ist in Magento CE 1.9.3 anders? Eben die oben genannte
\app\code\core\Mage\Adminhtml\controllers\Cms\WysiwygController.php
Um versehentliches Überschreiben zu vermeiden, legen wir hierzu eine kleine Extension an, die wir "Headererror" nennen und erweitern mit dieser den Cms-Controller: Zuerst legen wir die config.xml an:
\app\code\local\Econcess\Headererror\etc\config.xml
die wir dann z.B. so befüllen:
<config>
<admin>
<routers>
<adminhtml>
<args>
<modules>
<Econcess_Headererror before="Mage_Adminhtml">Econcess_Headererror_Adminhtml</Econcess_Headererror>
</modules>
</args>
</adminhtml>
</routers>
</admin>
</config>
Danach fehlt dann noch die Datei
\app\code\local\Econcess\Headererror\controllers\Adminhtml\Cms\WysiwygController.php
die wir dann z.B. so befüllen (gem. Pendant in Magento CE 1.9.3):
<?php
require_once 'Mage/Adminhtml/controllers/Cms/WysiwygController.php';
class Econcess_Headererror_Adminhtml_Cms_WysiwygController extends Mage_Adminhtml_Cms_WysiwygController
{
public function directiveAction()
{
$directive = $this->getRequest()->getParam('___directive');
$directive = Mage::helper('core')->urlDecode($directive);
$url = Mage::getModel('cms/adminhtml_template_filter')->filter($directive);
try {
$image = Varien_Image_Adapter::factory('GD2');
$image->open($url);
} catch (Exception $e) {
$image = Varien_Image_Adapter::factory('GD2');
$image->open(Mage::getSingleton('cms/wysiwyg_config')->getSkinImagePlaceholderPath());
}
ob_start();
$image->display();
$this->getResponse()->setBody(ob_get_contents());
ob_end_clean();
}
}
Danach müssen wir das Modul Magento nur noch bekannt machen unter
\app\etc\modules\Econcess_Headererror.xml
mit dem Inhalt
<?xml version="1.0"?>
<config>
<modules>
<Econcess_Headererror>
<active>true</active>
<codePool>local</codePool>
</Econcess_Headererror>
</modules>
</config>
Danach kann man den WYSIWYG-Editor im Magento-Backend wieder ohne Probleme und ohne Error-Ausgaben im Logfile nutzen. Getestet in Magento CE 1.9.2.4.