Anicky of Micropole Lyon Pole web
3/26/2016 - 5:31 PM

Adapte un contenu pour son envoi dans un email : convertit les liens relatifs en absolus, modifie le HTML posant problème, ...

Adapte un contenu pour son envoi dans un email : convertit les liens relatifs en absolus, modifie le HTML posant problème, ...

/**
 * Lors de l'envoi de notifications par mail, les liens relatifs doivent être convertis. Cette fonction
 * modifie les liens et les images qui ont une URL relative pour les convertir en URL absolue.
 * @param string $contenu Le contenu HTML à traiter
 * @param string $url_base L'URL de base du site (pour l'URL absolue)
 * @return string Le contenu HTML modifié avec les URL absolues
 */
function utils_mail_prepare_content($contenu, $url_base = NULL) {
    if ($url_base) {
        /* Le DOMDocument gère mal les accents, il faut donc forcer l'encodage UTF-8 du contenu */
        $contenu = utils_convert_utf8($contenu);
        $doc = new DOMDocument();
        $doc->loadHTML($contenu);
        /* Traitement des liens */
        $liens = $doc->getElementsByTagName('a');
        foreach ($liens as $lien) {
            $url = $lien->getAttribute('href');
            $url_parts = parse_url($url);
            if (!isset($url_parts['host']) || ($url_parts['host'] == '')) {
                $lien->setAttribute('href', $url_base . $url);
            }
        }
        /* Traitement des paragraphes à centrer */
        $paragraphes = $doc->getElementsByTagName('p');
        foreach($paragraphes as $paragraphe) {
            $classes = $paragraphe->getAttribute('class');
            if(strstr($classes, 'rtecenter') !== FALSE) {
                $classes = preg_replace('/rtecenter/', '', $classes);
                $paragraphe->setAttribute('class', $classes);
                $style = $paragraphe->getAttribute('style');
                $style .= 'text-align:center;';
                $paragraphe->setAttribute('style', $style);
            }
        }
        /* Traitement des images */
        $images = $doc->getElementsByTagName('img');
        foreach ($images as $image) {
            $url = $image->getAttribute('src');
            $url_parts = parse_url($url);
            if (!isset($url_parts['host']) || ($url_parts['host'] == '')) {
                $image->setAttribute('src', $url_base . $url);
            }

            /* Conversion des dimensions en style en attributs HTML */
            $pattern = '~([a-z-]+)\s*:\s*([^;$]+)~si';
            if (preg_match_all($pattern, $image->getAttribute('style'), $match)) {
                $style = array_combine(
                    array_map('strtolower', $match[1]),
                    array_map(function($val) { return trim($val, '"\' '); }, $match[2])
                );
                if(!empty($style)) {
                    $style['width'] = preg_replace('/px/', '', $style['width']);
                    $style['height'] = preg_replace('/px/', '', $style['height']);
                    $image->setAttribute('width', $style['width']);
                    $image->setAttribute('height', $style['height']);
                    $style = $image->getAttribute('style');
                    $style = preg_replace('/width:([^;$]+);/', '', $style);
                    $style = preg_replace('/height:([^;$]+);/', '', $style);
                    $image->setAttribute('style', $style);
                }
            }
        }
        /* Le DOMDocument ajoute le doctype, des balises <head>...Il faut donc les supprimer, car on renvoie ici seulement un morceau de page HTML */
        $text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $doc->saveHTML()));
    } else {
        $text = $contenu;
    }
    return $text;
}