FriendsOfREDAXO / mblock

Beliebig viele Datenblöcke innerhalb eines Moduls, per Drag & Drop verschiebbar.
MIT License
81 stars 10 forks source link

Keine Ausgabe in Verbindung mit MForm #158

Closed goldfoot closed 1 year ago

goldfoot commented 1 year ago

Redaxo: 5.14.2 MForm: 7.2.7 MBlock: 3.4.9 PHP: 8.2.0

Bei Verwendung von MForm in Verbindung mit MBlock erfolgt keine Ausgabe. Stattdessen werden leere Blöcke angezeigt. Es handelt sich scheinbar um ein Problem beim Konvertieren von einem Zeichensatz in einen anderen (hier: UTF-8 zu ISO-8859-1) mit iconv(). Es wird folgende Notice ausgegeben: Detected an illegal character in input string

Um die Konvertierung robuster zu gestalten, habe ich folgende Lösung implementiert:

In MBlockReplacerTrait.php

private static function createDom($html)
{
    $dom = new DOMDocument();
    $html_entities = htmlentities($html, ENT_COMPAT, 'UTF-8');
    // Try converting with iconv()
    $converted_string = @iconv('UTF-8', 'ISO-8859-1//IGNORE', $html_entities);
    if(!$converted_string && extension_loaded('mbstring')) {
        // Conversion failed, try mb_convert_encoding instead
        $converted_string = @mb_convert_encoding($html, 'ISO-8859-1', 'UTF-8');
    }

    $html = htmlspecialchars_decode($converted_string, ENT_QUOTES);
    @$dom->loadHTML("<html xmlns=\"http://www.w3.org/1999/xhtml\"><body>$html</body></html>");
    $dom->preserveWhiteSpace = false;
    return $dom;
}

Alternativ, wenn man auf das kodieren mit mb_convert_encoding() gänzlich verzichten möchte, sollte der //IGNORE Filter in iconv() genutzt werden:

private static function createDom($html)
{
    $dom = new DOMDocument();
    $html = htmlspecialchars_decode(iconv('UTF-8', 'ISO-8859-1//IGNORE', htmlentities($html, ENT_COMPAT, 'UTF-8')), ENT_QUOTES);
    @$dom->loadHTML("<html xmlns=\"http://www.w3.org/1999/xhtml\"><body>$html</body></html>");
    $dom->preserveWhiteSpace = false;
    return $dom;
}
goldfoot commented 1 year ago

Ich sehe, dass das Problem gestern (!) in 724966054b6197da3e7e6d957e7393a9d3ff10c7 gefixt wurde. Freue mich auf ein baldiges Release!