src/Twig/Extension/Apik.php line 753

Open in your IDE?
  1. <?php
  2. namespace App\Twig\Extension;
  3. use Twig\Extension\AbstractExtension;
  4. use Twig\TwigFunction;
  5. use Pimcore\Model\Document;
  6. use Pimcore\Model\Document as PimcoreDocument;
  7. use Pimcore\Model\Document\Page;
  8. use Pimcore\Tool\Transliteration;
  9. use Pimcore\Model\WebsiteSetting;
  10. class Apik extends AbstractExtension
  11. {
  12.     /** Listing des fonctions reprises en dessous de ce block */
  13.     public function getFunctions(): array
  14.     {
  15.         return [
  16.             new TwigFunction('build_data_object_url', [$this'buildDataObjectUrl']),
  17.             new TwigFunction('build_data_tag_url', [$this'buildDataTagUrl']),
  18.             new TwigFunction('build_data_tag_array_url', [$this'buildDataTagArrayUrl']),
  19.             new TwigFunction('get_localized_page_url', [$this'getLocalizedPageUrl']),
  20.             new TwigFunction('get_language_switcher', [$this'getLanguageSwitcher']),
  21.             new TwigFunction('get_language_switcher_html', [$this'getLanguageSwitcherHtml']),
  22.             new TwigFunction('email_obfuscator', [$this'emailObfuscator']),
  23.             new TwigFunction('email_obfuscator_svg', [$this'emailObfuscatorSvg']),
  24.             new TwigFunction('email_obfuscator_svg_only', [$this'emailObfuscatorSvgOnly']),
  25.             new TwigFunction('convert_phone_to_url', [$this'convertPhoneToPhoneUrl']),
  26.             new TwigFunction('get_body_class', [$this'getBodyClass']),
  27.             new TwigFunction('get_robots_index', [$this'getRobotsIndex']),
  28.             new TwigFunction('get_links_alternate', [$this'getLinksAlternate']),
  29.             new TwigFunction('website_config_advanced', [$this'websiteConfigAdvanced']),
  30.             new TwigFunction('to_url', [$this'toUrl']),
  31.             new TwigFunction('convert_date', [$this'convertDate']),
  32.             new TwigFunction('metadatas_image', [$this'metadatasImage']),
  33.             new TwigFunction('add_slashes', [$this'apk_addslashes']),
  34.             new TwigFunction('set_seo', [$this'setSeo']),
  35.             new TwigFunction('base_64', [$this'base64'])
  36.         ];
  37.         
  38.     }
  39.     /**
  40.      * Construit l'URL d'un Data Object
  41.      * @param $staticRouteNameNotLocalized Le nom de la Static Route non localisée (ex pour 'recette_fr', alors la valeur sera 'recette')
  42.      * @param $language La langue à retourner
  43.      * @param $dataObject Le Data Object
  44.      * @return $string
  45.      *
  46.      * Exemple:
  47.      * <?php
  48.      * $dataObjectUrl = buildDataObjectUrl('recette', $this->getLocale(), $monDataObject);
  49.      *
  50.      * Remarque:
  51.      * - Le code actuel ne prend en charge que les Static Route construite de la sorte: %lang/%prefix/%slug-%id
  52.      * - Le Data Object doit obligatoirement posséder un champ 'Slug'
  53.      * - Le champ slug doit être automatiquement généré via l'EventListener SaveDataObjectListener
  54.      */
  55.     function buildDataObjectUrl($staticRouteNameNotLocalized$language$dataObject)
  56.     {
  57.         //$staticRouteLocalized = \Pimcore\Model\Staticroute::getByName($staticRouteNameNotLocalized . '_' . $language);
  58.         $staticRouteLocalized \Pimcore\Model\Staticroute::getByName($staticRouteNameNotLocalized);
  59.         if ($staticRouteLocalized) {
  60.             $link $staticRouteLocalized->getReverse(); // %lang/%prefix/%slug-%id
  61.             $link str_replace('%lang'$language$link);
  62.             $link str_replace('%prefix'$staticRouteLocalized->getDefaults(), $link);
  63.             if(strpos($link'%slug') !== false):
  64.                 $link str_replace('%slug'$dataObject->getSlug($language), $link);
  65.             endif;
  66.             if(strpos($link'%name') !== false):
  67.                 $link str_replace('%name'self::toUrl($dataObject->getName($language)), $link);
  68.             endif;
  69.             if(strpos($link'%title') !== false):
  70.                 $link str_replace('%title'self::toUrl($dataObject->getTitle($language)), $link);
  71.             endif;
  72.             $link str_replace('%id''id'.$dataObject->getId(), $link);
  73.         }
  74.         return '/' $link;
  75.     }
  76.     /**
  77.      * Construit l'URL pour un tag
  78.      * @param $staticRouteNameNotLocalized Le nom de la Static Route non localisée (ex pour 'recette_fr', alors la valeur sera 'recette')
  79.      * @param $language La langue à retourner
  80.      * @param $dataObject Le Data Object
  81.      * @return $string
  82.      *
  83.      */
  84.     function buildDataTagUrl($staticRouteNameNotLocalized$language$dataObject)
  85.     {
  86.         $staticRouteLocalized \Pimcore\Model\Staticroute::getByName($staticRouteNameNotLocalized '_' $language);
  87.         if ($staticRouteLocalized) {
  88.             $link $staticRouteLocalized->getReverse(); // %lang/%prefix/%slug-%id
  89.             $link str_replace('%lang'$language$link);
  90.             $link str_replace('%prefix'$staticRouteLocalized->getDefaults(), $link);
  91.             $link str_replace('%name'self::toUrl($dataObject->getName($language)), $link);
  92.             $link str_replace('%id''id'.$dataObject->getId(), $link);
  93.         }
  94.         return '/' $link;
  95.     }
  96.     function buildDataTagArrayUrl($staticRouteNameNotLocalized$language$dataArray)
  97.     {
  98.         $staticRouteLocalized \Pimcore\Model\Staticroute::getByName($staticRouteNameNotLocalized '_' $language);
  99.         if ($staticRouteLocalized) {
  100.             $link $staticRouteLocalized->getReverse(); // %lang/%prefix/%slug-%id
  101.             $link str_replace('%lang'$language$link);
  102.             $link str_replace('%prefix'$staticRouteLocalized->getDefaults(), $link);
  103.             $link str_replace('%name'self::toUrl($dataArray['name']), $link);
  104.             $link str_replace('%id''id'.$dataArray['id'], $link);
  105.         }
  106.         return '/' $link;
  107.     }
  108.     /**
  109.      * Localise une Page (Document) dans la langue courante à partir de son ID et retourne son URL (string)
  110.      * @param $objectThis L'objet $this appelée depuis la vue
  111.      * @param $pageId L'ID de la Page (Document)
  112.      * @return null|PimcoreDocument
  113.      *
  114.      * Exemple:
  115.      * echo Apik::getLocalizedPageUrl($this, 123);
  116.      */
  117.     public static function getLocalizedPageUrl($pageId)
  118.     {
  119.         $localizedPage self::getLocalizedPage($pageId);
  120.         if ($localizedPage) {
  121.             return $localizedPage->getFullPath();
  122.         }
  123.         return '';
  124.     }
  125.     /**
  126.      * Localise une Page (Document) dans la langue courante à partir de son ID et retourne son document (objet)
  127.      * @param $objectThis L'objet $this appelée depuis la vue
  128.      * @param $pageId L'ID de la Page (Document)
  129.      * @return null|PimcoreDocument
  130.      *
  131.      * Exemple:
  132.      * $localizedPage = Apik::getLocalizedPage($this, 123);
  133.      * if ($localizedPage) {
  134.      *      echo $localizedPage->getFullPath();
  135.      * }
  136.      */
  137.     public static function getLocalizedPage($pageId)
  138.     {
  139.         $document Document::getById($pageId);
  140.         if ($document instanceof Document) {
  141.             if ($document instanceof Document\Page) {
  142.                 /** @var Document\Service $service */
  143.                 $service = new Document\Service();
  144.                 $linkedDocuments $service->getTranslations($document);
  145.                 if (count($linkedDocuments) == 0) {
  146.                     return $document;
  147.                 } else {
  148.                     foreach ($linkedDocuments as $docLanguage => $docId) {
  149.                         if ($docLanguage == $this->getLocale()) {
  150.                             /** @var Document $doc */
  151.                             $doc Document::getById($docId);
  152.                             if ($doc instanceof Document\Page) {
  153.                                 return $doc;
  154.                             }
  155.                         }
  156.                     }
  157.                 }
  158.             }
  159.         }
  160.         return null;
  161.     }
  162.     /**
  163.      * Retourne le sélecteur de langues sous forme de tableau
  164.      * @param $objectThis L'objet $this appelée depuis la vue
  165.      * @return array
  166.      *
  167.      * Exemple:
  168.      * $languageSwitcher = Apik::getLanguageSwitcher($this);
  169.      * print_r($languageSwitcher);
  170.      */
  171.     public static function getLanguageSwitcher($objectThis)
  172.     {
  173.         $CurrentLanguageCode $objectThis->getProperty("language");
  174.        
  175.         $service = new PimcoreDocument\Service;
  176.         /** @var \App\Templating\Helper\LanguageSwitcher $languageSwitcher */
  177.         $languageSwitcher = new \App\Templating\Helper\LanguageSwitcher($service);
  178.        
  179.         $switcher = [];
  180.         $switcher['current'] = [];
  181.         $switcher['current_id'] = $objectThis->getId();
  182.         $switcher['other'] = [];
  183.         $switcher['all'] = [];
  184.         
  185.         foreach ($languageSwitcher->getLocalizedLinks($objectThis) as $link => $language):
  186.            
  187.             $host parse_url($linkPHP_URL_HOST);
  188.             // Si domaine courant, alors $link ne contiendra que le chemin de la page (ex: /exemple) sans l'host
  189.             // On va donc rajouter le protoctol et l'host.
  190.             if (empty($host)) {
  191.                 $link \Pimcore\Tool::getHostUrl() .'/'$link;
  192.             }
  193.            
  194.             if ($language['code'] == $CurrentLanguageCode) {
  195.                 $switcher['current'] = array_merge(['url' => $link], $language);
  196.             } else {
  197.                 $switcher['other'][] = array_merge(['url' => $link], $language);
  198.             }
  199.             $switcher['all'][] = array_merge(['current' => $language['code'] == $CurrentLanguageCode'url' => $link], $language);
  200.         endforeach;
  201.         
  202.         $_switcher $switcher;
  203.         $_switcher['current'] = $switcher['current'];
  204.         $_switcher['other'] = $switcher['other'];
  205.         $_switcher['all'] = $switcher['all'];
  206.         $switcher $_switcher;
  207.         return $switcher;
  208.     }
  209.     /**
  210.      * Retourne le sélecteur de langues en HTML
  211.      * @param $objectThis (Obligatoire) L'objet $this appelée depuis la vue
  212.      * @param string $render (Obligatoire) Le format de retour : 'inline' ou 'dropdown'
  213.      * @param string $show (Obligatoire) Ce qu'il faut montrer : 'label' (Français,...), 'code' (FR,...) ou $replace pour un libellé personnalisé
  214.      * @param string $options (Facultatif) Options pour personnaliser le sélecteur de langue
  215.      *
  216.      * $replace est permet remplacer le libellé code/label par un libellé personnalisé.
  217.      *
  218.      * Exemple:
  219.      * echo getLanguageSwitcherHtml($this, 'dropdown', 'label');
  220.      *
  221.      * Exemple d'utilisation de $replace pour le paramètre $show:
  222.      * $replace = [
  223.      *      'fr_FR' => $this->translate('FR (France)'), // Affichera 'FR (France)' si le code de langue est fr_FR
  224.      *      'fr_BE' => $this->translate('FR (Belgique)'), // Affichera 'FR (Belgique)' si le code de langue est fr_BE
  225.      *      'nl_BE' => $this->translate('NL'), // Affichera 'NL' si le code de langue est nl_BE
  226.      * ];e
  227.      *
  228.      * Exemple d'utilisation de $options:
  229.      * Pour utiliser $options, copier/coller du tableau $options ci-dessous et le passer en paramètre à la fonction getLanguageSwitcherHtml(). La documentation de chaque option y est indiquée.
  230.      *
  231.      * @return string
  232.      */
  233.     public static function getLanguageSwitcherHtml($document$render$show$options = [])
  234.     {
  235.        
  236.     
  237.         $custom_options $options;
  238.         $switcher self::getLanguageSwitcher($document);
  239.     
  240.         $options = [
  241.             'classes' => [
  242.                 'current' => 'uk-active'// Classe à ajouter sur la langue courante
  243.                 'other' => '' // Classe à ajouter sur les autres langues
  244.             ],
  245.             'dropdown' => [
  246.                 'properties' => 'pos: bottom-center' // Propriété du dropdown
  247.             ]
  248.         ];
  249.         // Fusionne les options
  250.         $options array_merge($options$custom_options);
  251.         $html '';
  252.       
  253.         if ($render == 'inline') {
  254.             $html .= '<nav class="apk-language-switcher">';
  255.             $html .= '<ul class="uk-subnav uk-subnav-divider">';
  256.             foreach ($switcher['all'] as $language):
  257.                 $html .= '<li';
  258.                 if ($language['current']) {
  259.                     $html .= ' class="uk-active"';
  260.                 }
  261.                 $html .= '>';
  262.                 $html .= '<a href="' $language['url'] . '"';
  263.                 if ($language['current'] && array_key_exists('current'$options['classes']) && !empty($options['classes']['current'])) {
  264.                     $html .= ' class="' $options['classes']['current'] . '"';
  265.                 } elseif (!$language['current'] && array_key_exists('other'$options['classes']) && !empty($options['classes']['other'])) {
  266.                     $html .= ' class="' $options['classes']['other'] . '"';
  267.                 }
  268.                 $html .= '>';
  269.                 if ($show == 'label') {
  270.                     $html .= ucfirst($language['label']);
  271.                 } elseif ($show == 'code') {
  272.                     $html .= strtoupper($language['code']);
  273.                 } elseif (is_array($show)) {
  274.                     if (array_key_exists($language['code'], $show)) {
  275.                         $html .= $show[$language['code']];
  276.                     } else {
  277.                         $html .= strtoupper($language['code']);
  278.                     }
  279.                 }
  280.                 $html .= '</a>';
  281.                 $html .= '</li>';
  282.             endforeach;
  283.             $html .= '</ul>';
  284.             $html .= '</nav>';
  285.         } elseif ($render == 'dropdown') {
  286.             $html .= '<nav class="apk-language-switcher uk-display-inline-block">';
  287.             $html .= '<div class="uk-active';
  288.             if (array_key_exists('current'$options['classes']) && !empty($options['classes']['current'])) {
  289.                 $html .= ' ' $options['classes']['current'];
  290.             }
  291.             $html .= '">';
  292.             if ($show == 'label') {
  293.                 $html .= ucfirst($switcher['current']['label']);
  294.             } elseif ($show == 'code') {
  295.                 $html .= '<span>'.strtoupper($switcher['current']['code']).'</span>';
  296.             } elseif (is_array($show)) {
  297.                 if (array_key_exists($switcher['current']['code'], $show)) {
  298.                     $html .= $show[$switcher['current']['code']];
  299.                 } else {
  300.                     $html .= strtoupper($switcher['current']['code']);
  301.                 }
  302.             }
  303.             $html .= '<svg class="uk-margin-small-left" xmlns="http://www.w3.org/2000/svg" width="11" height="7" viewBox="0 0 11 7"><g><g><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="20" stroke-width="2" d="M1.24 1.5v0l4.374 4.374v0L9.988 1.5v0"/></g></g></svg>';
  304.             $html .= '</div>';
  305.             $html .= '<div uk-dropdown="' $options['dropdown']['properties'] . '">';
  306.             $html .= '<ul class="uk-nav uk-dropdown-nav uk-text-left">';
  307.             foreach ($switcher['other'] as $language):
  308.               
  309.                 $html .= '<li>';
  310.                 $html .= '<a href="' $language['url'] . '"';
  311.                 if (array_key_exists('other'$options['classes']) && !empty($options['classes']['other'])) {
  312.                     $html .= ' class="' $options['classes']['other'] . '"';
  313.                 }
  314.                 $html .= '>';
  315.                 if ($show == 'label') {
  316.                     $html .= ucfirst($language['label']);
  317.                 } elseif ($show == 'code') {
  318.                     $html .= strtoupper($language['code']);
  319.                 } elseif (is_array($show)) {
  320.                     if (array_key_exists($language['code'], $show)) {
  321.                         $html .= $show[$language['code']];
  322.                     } else {
  323.                         $html .= strtoupper($language['code']);
  324.                     }
  325.                 }
  326.                 $html .= '</a>';
  327.                 $html .= '</li>';
  328.             endforeach;
  329.             $html .= '</ul>';
  330.             $html .= '</div>';
  331.             $html .= '</nav>';
  332.         }
  333.         
  334.         return $html;
  335.     }
  336.     
  337.     /**
  338.      * Retourne un lien mailto en cryptant l'adresse email ( OBFUSCATOR )
  339.      * Basé sur le script 2.1 de Andrew Moulden ( https://www.jottings.com/obfuscator/ )
  340.      * @param $email
  341.      * @return string
  342.      *
  343.      * @Author : Bastien Heynderickx <info@hachbe.be> updated by Grégory Lemmens
  344.      * @Version : 1.1
  345.      * @Description :
  346.      *      permet de générer un lien mailto en protégeant l'adresse email (Obfuscator)
  347.      *      ex : {{ email_obfuscator(+32 478 60 52 47)|raw }}
  348.      *      /!\ le filtre row permet de convertir le code en html
  349.      *          - https://www.jottings.com/obfuscator/
  350.      */
  351.     public function emailObfuscator($address)
  352.     {
  353.         $address strtolower($address);
  354.         $coded "";
  355.         $unmixedkey "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@";
  356.         $inprogresskey $unmixedkey;
  357.         $mixedkey "";
  358.         $unshuffled strlen($unmixedkey);
  359.         for ($i 0$i strlen($unmixedkey); $i++) {
  360.             $ranpos rand(0$unshuffled 1);
  361.             $nextchar $inprogresskey[$ranpos];
  362.             $mixedkey .= $nextchar;
  363.             $before substr($inprogresskey0$ranpos);
  364.             $after substr($inprogresskey$ranpos 1$unshuffled - ($ranpos 1));
  365.             $inprogresskey $before '' $after;
  366.             $unshuffled -= 1;
  367.         }
  368.         $cipher $mixedkey;
  369.         $shift strlen($address);
  370.         $txt "<script type=\"text/javascript\" language=\"javascript\">\n" .
  371.             "<!-" "-\n" .
  372.             "// Email obfuscator script 2.1 by Tim Williams, University of Arizona\n" .
  373.             "// Random encryption key feature by Andrew Moulden, Site Engineering Ltd\n" .
  374.             "// PHP version coded by Ross Killen, Celtic Productions Ltd\n" .
  375.             "// This code is freeware provided these six comment lines remain intact\n" .
  376.             "// A wizard to generate this code is at http://www.jottings.com/obfuscator/\n" .
  377.             "// The PHP code may be obtained from http://www.celticproductions.net/\n\n";
  378.         for ($j 0$j strlen($address); $j++) {
  379.             if (strpos($cipher$address[$j]) == -1) {
  380.                 $chr $address[$j];
  381.                 $coded .= $address[$j];
  382.             } else {
  383.                 $chr = (strpos($cipher$address[$j]) + $shift) % strlen($cipher);
  384.                 $coded .= $cipher[$chr];
  385.             }
  386.         }
  387.         $txt .= "\ncoded = \"" $coded "\"\n" .
  388.             " key = \"" $cipher "\"\n" .
  389.             " shift=coded.length\n" .
  390.             " link=\"\"\n" .
  391.             " for (i=0; i<coded.length; i++) {\n" .
  392.             " if (key.indexOf(coded.charAt(i))==-1) {\n" .
  393.             " ltr = coded.charAt(i)\n" .
  394.             " link += (ltr)\n" .
  395.             " }\n" .
  396.             " else { \n" .
  397.             " ltr = (key.indexOf(coded.charAt(i))-
  398. shift+key.length) % key.length\n" .
  399.             " link += (key.charAt(ltr))\n" .
  400.             " }\n" .
  401.             " }\n" .
  402.             "document.write(\"<a href='mailto:\"+link+\"'>\"+link+\"</a>\")\n" .
  403.             "\n" .
  404.             "//-" "->\n" .
  405.             "<" "/script><noscript>Sorry, you need Javascript on to email us." .
  406.             "<" "/noscript>";
  407.         return $txt;
  408.     }
  409.     /**
  410.      * Retourne un lien mailto en cryptant l'adresse email ( OBFUSCATOR )
  411.      * Basé sur le script 2.1 de Andrew Moulden ( https://www.jottings.com/obfuscator/ )
  412.      * @param $email
  413.      * @return string
  414.      *
  415.      * @Author : Bastien Heynderickx <info@hachbe.be> updated by Grégory Lemmens
  416.      * @Version : 1.1
  417.      * @Description :
  418.      *      permet de générer un lien mailto en protégeant l'adresse email (Obfuscator)
  419.      *      ex : {{ email_obfuscator(+32 478 60 52 47)|raw }}
  420.      *      /!\ le filtre row permet de convertir le code en html
  421.      *          - https://www.jottings.com/obfuscator/
  422.      */
  423.     public function emailObfuscatorSvg($address)
  424.     {
  425.         $address strtolower($address);
  426.         $coded "";
  427.         $unmixedkey "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@";
  428.         $inprogresskey $unmixedkey;
  429.         $mixedkey "";
  430.         $svg "<img uk-svg width='29' height='29' src='/static/img/icons/email.svg' alt='Tel' />";
  431.         $unshuffled strlen($unmixedkey);
  432.         for ($i 0$i strlen($unmixedkey); $i++) {
  433.             $ranpos rand(0$unshuffled 1);
  434.             $nextchar $inprogresskey[$ranpos];
  435.             $mixedkey .= $nextchar;
  436.             $before substr($inprogresskey0$ranpos);
  437.             $after substr($inprogresskey$ranpos 1$unshuffled - ($ranpos 1));
  438.             $inprogresskey $before '' $after;
  439.             $unshuffled -= 1;
  440.         }
  441.         $cipher $mixedkey;
  442.         $shift strlen($address);
  443.         $txt "<script type=\"text/javascript\" language=\"javascript\">\n" .
  444.             "<!-" "-\n" .
  445.             "// Email obfuscator script 2.1 by Tim Williams, University of Arizona\n" .
  446.             "// Random encryption key feature by Andrew Moulden, Site Engineering Ltd\n" .
  447.             "// PHP version coded by Ross Killen, Celtic Productions Ltd\n" .
  448.             "// This code is freeware provided these six comment lines remain intact\n" .
  449.             "// A wizard to generate this code is at http://www.jottings.com/obfuscator/\n" .
  450.             "// The PHP code may be obtained from http://www.celticproductions.net/\n\n";
  451.         for ($j 0$j strlen($address); $j++) {
  452.             if (strpos($cipher$address[$j]) == -1) {
  453.                 $chr $address[$j];
  454.                 $coded .= $address[$j];
  455.             } else {
  456.                 $chr = (strpos($cipher$address[$j]) + $shift) % strlen($cipher);
  457.                 $coded .= $cipher[$chr];
  458.             }
  459.         }
  460.         $txt .= "\ncoded = \"" $coded "\"\n" .
  461.             " key = \"" $cipher "\"\n" .
  462.             " svg = \"" $svg "\"\n" .
  463.             " shift=coded.length\n" .
  464.             " link=\"\"\n" .
  465.             " for (i=0; i<coded.length; i++) {\n" .
  466.             " if (key.indexOf(coded.charAt(i))==-1) {\n" .
  467.             " ltr = coded.charAt(i)\n" .
  468.             " link += (ltr)\n" .
  469.             " }\n" .
  470.             " else { \n" .
  471.             " ltr = (key.indexOf(coded.charAt(i))-
  472. shift+key.length) % key.length\n" .
  473.             " link += (key.charAt(ltr))\n" .
  474.             " }\n" .
  475.             " }\n" .
  476.             "document.write(\"<a href='mailto:\"+link+\"'>\"+svg+link+\"</a>\")\n" .
  477.             "\n" .
  478.             "//-" "->\n" .
  479.             "<" "/script><noscript>Sorry, you need Javascript on to email us." .
  480.             "<" "/noscript>";
  481.         return $txt;
  482.     }
  483.     /**
  484.      * Retourne un lien mailto en cryptant l'adresse email ( OBFUSCATOR )
  485.      * Basé sur le script 2.1 de Andrew Moulden ( https://www.jottings.com/obfuscator/ )
  486.      * @param $email
  487.      * @return string
  488.      *
  489.      * @Author : Bastien Heynderickx <info@hachbe.be> updated by Grégory Lemmens
  490.      * @Version : 1.1
  491.      * @Description :
  492.      *      permet de générer un lien mailto en protégeant l'adresse email (Obfuscator)
  493.      *      ex : {{ email_obfuscator(+32 478 60 52 47)|raw }}
  494.      *      /!\ le filtre row permet de convertir le code en html
  495.      *          - https://www.jottings.com/obfuscator/
  496.      */
  497.     public function emailObfuscatorSvgOnly($address)
  498.     {
  499.         $address strtolower($address);
  500.         $coded "";
  501.         $unmixedkey "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.@";
  502.         $inprogresskey $unmixedkey;
  503.         $mixedkey "";
  504.         $svg "<img uk-svg width='29' height='29' src='/static/img/icons/email.svg' alt='Tel' />";
  505.         $unshuffled strlen($unmixedkey);
  506.         for ($i 0$i strlen($unmixedkey); $i++) {
  507.             $ranpos rand(0$unshuffled 1);
  508.             $nextchar $inprogresskey[$ranpos];
  509.             $mixedkey .= $nextchar;
  510.             $before substr($inprogresskey0$ranpos);
  511.             $after substr($inprogresskey$ranpos 1$unshuffled - ($ranpos 1));
  512.             $inprogresskey $before '' $after;
  513.             $unshuffled -= 1;
  514.         }
  515.         $cipher $mixedkey;
  516.         $shift strlen($address);
  517.         $txt "<script type=\"text/javascript\" language=\"javascript\">\n" .
  518.             "<!-" "-\n" .
  519.             "// Email obfuscator script 2.1 by Tim Williams, University of Arizona\n" .
  520.             "// Random encryption key feature by Andrew Moulden, Site Engineering Ltd\n" .
  521.             "// PHP version coded by Ross Killen, Celtic Productions Ltd\n" .
  522.             "// This code is freeware provided these six comment lines remain intact\n" .
  523.             "// A wizard to generate this code is at http://www.jottings.com/obfuscator/\n" .
  524.             "// The PHP code may be obtained from http://www.celticproductions.net/\n\n";
  525.         for ($j 0$j strlen($address); $j++) {
  526.             if (strpos($cipher$address[$j]) == -1) {
  527.                 $chr $address[$j];
  528.                 $coded .= $address[$j];
  529.             } else {
  530.                 $chr = (strpos($cipher$address[$j]) + $shift) % strlen($cipher);
  531.                 $coded .= $cipher[$chr];
  532.             }
  533.         }
  534.         $txt .= "\ncoded = \"" $coded "\"\n" .
  535.             " key = \"" $cipher "\"\n" .
  536.             " svg = \"" $svg "\"\n" .
  537.             " shift=coded.length\n" .
  538.             " link=\"\"\n" .
  539.             " for (i=0; i<coded.length; i++) {\n" .
  540.             " if (key.indexOf(coded.charAt(i))==-1) {\n" .
  541.             " ltr = coded.charAt(i)\n" .
  542.             " link += (ltr)\n" .
  543.             " }\n" .
  544.             " else { \n" .
  545.             " ltr = (key.indexOf(coded.charAt(i))-
  546. shift+key.length) % key.length\n" .
  547.             " link += (key.charAt(ltr))\n" .
  548.             " }\n" .
  549.             " }\n" .
  550.             "document.write(\"<a href='mailto:\"+link+\"'>\"+svg+\"</a>\")\n" .
  551.             "\n" .
  552.             "//-" "->\n" .
  553.             "<" "/script><noscript>Sorry, you need Javascript on to email us." .
  554.             "<" "/noscript>";
  555.         return $txt;
  556.     }
  557.     /**
  558.      * Convertit un numéro de téléphone au format lien "tel:"
  559.      * Exemple: // +32 2 357 33 00 -> +3223573300
  560.      * @param $phone
  561.      * @return string
  562.      *
  563.      * @Author : Bastien Heynderickx <info@hachbe.be> basé sur la version WordPress de Jérôme De Boysère
  564.      * @Version : 1.0
  565.      * @Description :
  566.      *      permet de convertir un numéro de téléphone au format url | lien "tel:"
  567.      */
  568.     public static function convertPhoneToPhoneUrl($phone)
  569.     {
  570.         if (!empty($phone)) {
  571.             $phone trim($phone);
  572.             $phone preg_replace('/\s/'''$phone); // +32 2 357 33 00 -> +3223573300
  573.         }
  574.         return $phone;
  575.     }
  576.     /**
  577.      * Génère des classes CSS pour facilité l'intégration web (à utiliser pour le <body> depuis le layout).
  578.      * @param $objectThis L'objet $this appelé depuis layout
  579.      * @param $__FILE__ La variable __FILE__ appelée depuis le layout
  580.      * @return string
  581.      *
  582.      * Exemple:
  583.      * echo Apik::getBodyClass($this, __FILE__);
  584.      */
  585.      /* ToDO: To refactoring for twig */
  586.     public static function getBodyClass($objectThis$__FILE__)
  587.     {
  588.         // - Ajoute le CMS utilisé
  589.         // - Ajoute 'editmode' si on est en mode édition
  590.         $bodyClasses = array();
  591.         $bodyClasses[] = 'apk-cms-pimcore';
  592.         if ($objectThis->editmode) {
  593.             $bodyClasses[] = 'editmode';
  594.         }
  595.         // - CXréation d'une classe en fonction du controller + action + (template) + vue
  596.         $class pathinfo($__FILE__PATHINFO_BASENAME);
  597.         //$class = strtr($class, array('.html.php' => '-html', '.' => '-', '/' => '_'));
  598.         $class str_replace('.html.php'''strtolower($class));
  599.         $class strtolower($class);
  600.         $bodyClasses[] = 'pimcore-layout-' $class;
  601.         // Template : Default/home.html.php => gs-template_default_home-html
  602.         /*if ($objectThis->document->getTemplate()) {
  603.             $class = $objectThis->document->getTemplate();
  604.             $class = strtr($class, array('.html.php' => '-html', '.' => '-', '/' => '_'));
  605.             $class = strtolower($class);
  606.             $bodyClasses[] = 'gs-template_' . $class;
  607.             $hasTemplate = true;
  608.         } elseif ($objectThis->document->getController() == 'default' && $objectThis->document->getAction() == 'default') {
  609.             $bodyClasses[] = 'gs-template-by-default';
  610.         }*/
  611.         $controller '';
  612.         if ($objectThis->document->getController()) {
  613.             $class $objectThis->document->getController();
  614.             $class strtolower($class);
  615.             $class explode('\\'$class);
  616.             //$class = end($class);
  617.             $class str_replace('controller'''end($class));
  618.             $controller $class;
  619.             //$bodyClasses[] = 'gs-controller_' . $class;
  620.         }
  621.         $action '';
  622.         if ($objectThis->document->getAction()) {
  623.             $class $objectThis->document->getAction();
  624.             $class strtolower($class);
  625.             $action $class;
  626.             //$bodyClasses[] = 'gs-action_' . $class;
  627.         }
  628.         if ($controller && $action) {
  629.             $bodyClasses[] = 'pimcore-' $controller '-' $action;
  630.         }
  631.         return implode(' '$bodyClasses);
  632.     }
  633.     /**
  634.      * Retourne le tag concernant l'indexation pour les robots
  635.      * @return string
  636.      *
  637.      * Exemple:
  638.      * echo Apik::getRobotsIndex();
  639.      */
  640.     public static function getRobotsIndex()
  641.     {
  642.         $return '';
  643.         $return .= "\n" '<!-- Robots indexation -->' "\n";
  644.         //if (getenv('PIMCORE_ENVIRONMENT') == "prod") {
  645.         if (strpos($_SERVER['HTTP_HOST'], "apik-pp") === FALSE && strpos($_SERVER['HTTP_HOST'], "atypic-pp") === FALSE) {
  646.             $return .= '<meta name="robots" content="INDEX, FOLLOW" />';
  647.         } else {
  648.             $return .= '<meta name="robots" content="NOINDEX, NOFOLLOW" />';
  649.         }
  650.         return $return;
  651.     }
  652.        
  653.     /**
  654.      * Retourne tous les <link rel="alternate" href="..." hreflang="..." />
  655.      * @param $document
  656.      * @return string
  657.      *
  658.      * @Author : Cédric Moriot <cedric@atypic.be>, Jérôme De Boysère <jerome@atypic.be>
  659.      * @Version : 2.0
  660.      * @Description :
  661.      *      Permet d'ajouter les balises hreflang, conformément à la doc Google :
  662.      *          - https://support.google.com/webmasters/answer/189077?hl=fr
  663.      */
  664.     public static function getLinksAlternate($document)
  665.     {
  666.         $return '';
  667.         $links = [];
  668.         $languageSwitcher self::getLanguageSwitcher($document);
  669.         foreach ($languageSwitcher['all'] as $k => $lang) {
  670.             $links[$lang['code']] = '<link rel="alternate" hreflang="' str_replace('_''-'$lang['code']) . '" href="' $lang['url'] . '" />';
  671.         }
  672.         $return .= "\n" '<!-- Link alternate -->' "\n";
  673.         $return .= count($links) > implode("\n"$links) : '<!-- Nothing to do because there is only 1 language configured on this website. -->';
  674.         return $return;
  675.         /*$links = [];
  676.         $service = new PimcoreDocument\Service;
  677.         $validLanguages = \Pimcore\Tool::getValidLanguages();
  678.         $languageSwitcher = $objectThis->languageSwitcher();
  679.         $arrayUrlForHrefLang = $languageSwitcher->getLocalizedLinks($objectThis->document);
  680.         if (is_array($arrayUrlForHrefLang)) {
  681.             foreach ($arrayUrlForHrefLang as $link => $text) {
  682.                 if (in_array($text['code'], $validLanguages)) {
  683.                     $translations = $service->getTranslations($objectThis->document);
  684.                     $tempLink = \Pimcore\Model\Document::getById($translations[$text['code']]);
  685.                     $finalLink = '';
  686.                     if ($text['code'] == $objectThis->getLocale()) {
  687.                         //Active Page
  688.                         $finalLink = $objectThis->document->getFullPath();
  689.                     } else if (is_object($tempLink) && !empty($tempLink->getPrettyUrl())) {
  690.                         $finalLink = $tempLink->getPrettyUrl();
  691.                     } elseif (is_object($tempLink)) {
  692.                         //Alternate Page W/O Pretty URL
  693.                         $finalLink = $tempLink->getPath() . $tempLink->getKey();
  694.                     }
  695.                     if (!empty($finalLink)) {
  696.                         $links[$text['code']] = '<link rel="alternate" href="' . \Pimcore\Tool::getHostUrl() . $finalLink . '" hreflang="' . $text['code'] . '" />';
  697.                     } else {
  698.                         $links[$text['code']] = '<!-- Link alternate - No page found for the language : ' . $text['label'] . ' (' . $text['code'] . ') -->';
  699.                     }
  700.                 }
  701.             }
  702.         }
  703.         return count($validLanguages) > 1 ? implode("\n", $links) : '<!-- Link alternate - Nothing to do because there is only 1 language configured on this website. -->';
  704.     */
  705.     }
  706.     /**
  707.      * Retourne la valeur du website setting localisé
  708.      * @param $objectThis
  709.      * @return string
  710.      *
  711.      * @Author : Bastien Heynderickx <info@hachbe.be>
  712.      * @Version : 1.0
  713.      * @Description :
  714.      *      permet de récupérer la valeur d'un website setting sur base la localisation
  715.      *          - https://support.google.com/webmasters/answer/189077?hl=fr
  716.      */
  717.     public static function websiteConfigAdvanced($name$siteId null$language null$fallbackLanguage null)
  718.     {
  719.         return WebsiteSetting::getByName($name$siteId$language)->getData();
  720.     }
  721.     
  722.     /**
  723.      * Create a web friendly URL slug from a string.
  724.      *
  725.      * Although supported, transliteration is discouraged because
  726.      *     1) most web browsers support UTF-8 characters in URLs
  727.      *     2) transliteration causes a loss of information
  728.      *
  729.      * @author Sean Murphy <sean@iamseanmurphy.com>
  730.      * @copyright Copyright 2012 Sean Murphy. All rights reserved.
  731.      * @license http://creativecommons.org/publicdomain/zero/1.0/
  732.      *
  733.      * @param string $str
  734.      * @param array $options
  735.      * @return string
  736.      */
  737.     public static function toUrl($str$options = array())
  738.     {
  739.         // Make sure string is in UTF-8 and strip invalid UTF-8 characters
  740.         $str mb_convert_encoding((string)$str'UTF-8'mb_list_encodings());
  741.         $defaults = array(
  742.             'delimiter' => '-',
  743.             'limit' => null,
  744.             'lowercase' => true,
  745.             'replacements' => array(),
  746.             'transliterate' => true,
  747.         );
  748.         // Merge options
  749.         $options array_merge($defaults$options);
  750.         $char_map = array(
  751.             // Latin
  752.             'À' => 'A''Á' => 'A''Â' => 'A''Ã' => 'A''Ä' => 'A''Å' => 'A''Æ' => 'AE''Ç' => 'C',
  753.             'È' => 'E''É' => 'E''Ê' => 'E''Ë' => 'E''Ì' => 'I''Í' => 'I''Î' => 'I''Ï' => 'I',
  754.             'Ð' => 'D''Ñ' => 'N''Ò' => 'O''Ó' => 'O''Ô' => 'O''Õ' => 'O''Ö' => 'O''Ő' => 'O',
  755.             'Ø' => 'O''Ù' => 'U''Ú' => 'U''Û' => 'U''Ü' => 'U''Ű' => 'U''Ý' => 'Y''Þ' => 'TH',
  756.             'ß' => 'ss',
  757.             'à' => 'a''á' => 'a''â' => 'a''ã' => 'a''ä' => 'a''å' => 'a''æ' => 'ae''ç' => 'c',
  758.             'è' => 'e''é' => 'e''ê' => 'e''ë' => 'e''ì' => 'i''í' => 'i''î' => 'i''ï' => 'i',
  759.             'ð' => 'd''ñ' => 'n''ò' => 'o''ó' => 'o''ô' => 'o''õ' => 'o''ö' => 'o''ő' => 'o',
  760.             'ø' => 'o''ù' => 'u''ú' => 'u''û' => 'u''ü' => 'u''ű' => 'u''ý' => 'y''þ' => 'th',
  761.             'ÿ' => 'y',
  762.             // Latin symbols
  763.             '©' => '(c)',
  764.             // Greek
  765.             'Α' => 'A''Β' => 'B''Γ' => 'G''Δ' => 'D''Ε' => 'E''Ζ' => 'Z''Η' => 'H''Θ' => '8',
  766.             'Ι' => 'I''Κ' => 'K''Λ' => 'L''Μ' => 'M''Ν' => 'N''Ξ' => '3''Ο' => 'O''Π' => 'P',
  767.             'Ρ' => 'R''Σ' => 'S''Τ' => 'T''Υ' => 'Y''Φ' => 'F''Χ' => 'X''Ψ' => 'PS''Ω' => 'W',
  768.             'Ά' => 'A''Έ' => 'E''Ί' => 'I''Ό' => 'O''Ύ' => 'Y''Ή' => 'H''Ώ' => 'W''Ϊ' => 'I',
  769.             'Ϋ' => 'Y',
  770.             'α' => 'a''β' => 'b''γ' => 'g''δ' => 'd''ε' => 'e''ζ' => 'z''η' => 'h''θ' => '8',
  771.             'ι' => 'i''κ' => 'k''λ' => 'l''μ' => 'm''ν' => 'n''ξ' => '3''ο' => 'o''π' => 'p',
  772.             'ρ' => 'r''σ' => 's''τ' => 't''υ' => 'y''φ' => 'f''χ' => 'x''ψ' => 'ps''ω' => 'w',
  773.             'ά' => 'a''έ' => 'e''ί' => 'i''ό' => 'o''ύ' => 'y''ή' => 'h''ώ' => 'w''ς' => 's',
  774.             'ϊ' => 'i''ΰ' => 'y''ϋ' => 'y''ΐ' => 'i',
  775.             // Turkish
  776.             'Ş' => 'S''İ' => 'I''Ç' => 'C''Ü' => 'U''Ö' => 'O''Ğ' => 'G',
  777.             'ş' => 's''ı' => 'i''ç' => 'c''ü' => 'u''ö' => 'o''ğ' => 'g',
  778.             // Russian
  779.             'А' => 'A''Б' => 'B''В' => 'V''Г' => 'G''Д' => 'D''Е' => 'E''Ё' => 'Yo''Ж' => 'Zh',
  780.             'З' => 'Z''И' => 'I''Й' => 'J''К' => 'K''Л' => 'L''М' => 'M''Н' => 'N''О' => 'O',
  781.             'П' => 'P''Р' => 'R''С' => 'S''Т' => 'T''У' => 'U''Ф' => 'F''Х' => 'H''Ц' => 'C',
  782.             'Ч' => 'Ch''Ш' => 'Sh''Щ' => 'Sh''Ъ' => '''Ы' => 'Y''Ь' => '''Э' => 'E''Ю' => 'Yu',
  783.             'Я' => 'Ya',
  784.             'а' => 'a''б' => 'b''в' => 'v''г' => 'g''д' => 'd''е' => 'e''ё' => 'yo''ж' => 'zh',
  785.             'з' => 'z''и' => 'i''й' => 'j''к' => 'k''л' => 'l''м' => 'm''н' => 'n''о' => 'o',
  786.             'п' => 'p''р' => 'r''с' => 's''т' => 't''у' => 'u''ф' => 'f''х' => 'h''ц' => 'c',
  787.             'ч' => 'ch''ш' => 'sh''щ' => 'sh''ъ' => '''ы' => 'y''ь' => '''э' => 'e''ю' => 'yu',
  788.             'я' => 'ya',
  789.             // Ukrainian
  790.             'Є' => 'Ye''І' => 'I''Ї' => 'Yi''Ґ' => 'G',
  791.             'є' => 'ye''і' => 'i''ї' => 'yi''ґ' => 'g',
  792.             // Czech
  793.             'Č' => 'C''Ď' => 'D''Ě' => 'E''Ň' => 'N''Ř' => 'R''Š' => 'S''Ť' => 'T''Ů' => 'U',
  794.             'Ž' => 'Z',
  795.             'č' => 'c''ď' => 'd''ě' => 'e''ň' => 'n''ř' => 'r''š' => 's''ť' => 't''ů' => 'u',
  796.             'ž' => 'z',
  797.             // Polish
  798.             'Ą' => 'A''Ć' => 'C''Ę' => 'e''Ł' => 'L''Ń' => 'N''Ó' => 'o''Ś' => 'S''Ź' => 'Z',
  799.             'Ż' => 'Z',
  800.             'ą' => 'a''ć' => 'c''ę' => 'e''ł' => 'l''ń' => 'n''ó' => 'o''ś' => 's''ź' => 'z',
  801.             'ż' => 'z',
  802.             // Latvian
  803.             'Ā' => 'A''Č' => 'C''Ē' => 'E''Ģ' => 'G''Ī' => 'i''Ķ' => 'k''Ļ' => 'L''Ņ' => 'N',
  804.             'Š' => 'S''Ū' => 'u''Ž' => 'Z',
  805.             'ā' => 'a''č' => 'c''ē' => 'e''ģ' => 'g''ī' => 'i''ķ' => 'k''ļ' => 'l''ņ' => 'n',
  806.             'š' => 's''ū' => 'u''ž' => 'z'
  807.         );
  808.         // Make custom replacements
  809.         $str preg_replace(array_keys($options['replacements']), $options['replacements'], $str);
  810.         // Transliterate characters to ASCII
  811.         if ($options['transliterate']) {
  812.             $str str_replace(array_keys($char_map), $char_map$str);
  813.         }
  814.         // Replace non-alphanumeric characters with our delimiter
  815.         $str preg_replace('/[^\p{L}\p{Nd}]+/u'$options['delimiter'], $str);
  816.         // Remove duplicate delimiters
  817.         $str preg_replace('/(' preg_quote($options['delimiter'], '/') . '){2,}/''$1'$str);
  818.         // Truncate slug to max. characters
  819.         $str mb_substr($str0, ($options['limit'] ? $options['limit'] : mb_strlen($str'UTF-8')), 'UTF-8');
  820.         // Remove delimiter from ends
  821.         $str trim($str$options['delimiter']);
  822.         return $options['lowercase'] ? mb_strtolower($str'UTF-8') : $str;
  823.     }
  824.     /**
  825.      * Convertit la date YYYY/MM/DD dans un autre format
  826.      * @param $date La date au format YYYY/MM/DD
  827.      * @param $outputFormat (Facultatif) Le format de sortie (d/m/Y, \O\n j F, Y,...)
  828.      * @return string
  829.      *
  830.      * Exemple:
  831.      * echo Apik::convertDate('2019/12/24', 'd/m/Y');
  832.      */
  833.     public static function convertDate($yyyy_mm_dd$outputFormat 'd/m/Y'$lang null)
  834.     {
  835.         $date = new \DateTime($yyyy_mm_dd);
  836.         if($lang!=null && $lang!='en'):
  837.             $date $date->format($outputFormat);
  838.             $english_days = array('Monday''Tuesday''Wednesday''Thursday''Friday''Saturday''Sunday');
  839.             $french_days = array('Lundi''Mardi''Mercredi''Jeudi''Vendredi''Samedi''Dimanche');
  840.             $dutch_days = array('Maandag''Dinsdag''Woensdag''Donderdag''Vrijdag''Zaterdag''Zondag');
  841.             $english_months = array('January''February''March''April''May''June''July''August''September''October''November''December');
  842.             $french_months = array('Janvier''Février''Mars''Avril''Mai''Juin''Juillet''Août''Septembre''Octobre''Novembre''Décembre');
  843.             $dutch_months = array('Januari''Februari''Maart''April''Mei''Juni''Juli''Augustus''September''Oktober''November''December');
  844.             switch($lang):
  845.                 case 'fr'$date_localized =  str_replace($english_months$french_monthsstr_replace($english_days$french_days$date ));
  846.                     break;
  847.                 case 'nl'$date_localized =  str_replace($english_months$dutch_monthsstr_replace($english_days$dutch_days$date ));
  848.                     break;
  849.             endswitch;
  850.             return $date_localized;
  851.         else:
  852.             return $date->format($outputFormat);
  853.         endif;
  854.     }
  855.      /**
  856.      *
  857.      * @param string $image
  858.      * @param string $defaultAlt
  859.      * @param string $language
  860.      * 
  861.      * @return string
  862.      *
  863.      * @Author : Grégory Lemmens
  864.      * @Version : 1.0
  865.      * @Description :
  866.      *      permet de créer les attributs titres et alt et copyright pour les images
  867.      *           
  868.      */
  869.     public static function metadatasImage($image$defaultAlt$language){
  870.         if($image->getMetadata('alt')){
  871.             if($image->getMetadata('copyright')){
  872.                 $imageAlt ' alt="' $image->getMetadata('alt') . ' | © '$image->getMetadata('copyright') .'"';
  873.             }elseif($image->getMetadata('copyright'$language)){
  874.                 $imageAlt ' alt="' $image->getMetadata('alt') . ' | © '$image->getMetadata('copyright'$language) .'"';
  875.             }else{
  876.                 $imageAlt ' alt="' $image->getMetadata('alt') . '"';
  877.             }
  878.             
  879.         }elseif($image->getMetadata('alt'$language)){
  880.             
  881.             if($image->getMetadata('copyright')){
  882.                 $imageAlt ' alt="' $image->getMetadata('alt'$language) . ' | © '$image->getMetadata('copyright') .'"';
  883.             }elseif($image->getMetadata('copyright'$language)){
  884.                 $imageAlt ' alt="' $image->getMetadata('alt'$language) . ' | © '$image->getMetadata('copyright'$language) .'"';
  885.             }else{
  886.                 $imageAlt ' alt="' $image->getMetadata('alt'$language) . '"';
  887.             }
  888.             
  889.         }else{
  890.             if($image->getMetadata('copyright')){
  891.                 $imageAlt ' alt="' $defaultAlt ' | © '$image->getMetadata('copyright') .'"';
  892.             }elseif($image->getMetadata('copyright'$language)){
  893.                 $imageAlt ' alt="' $defaultAlt ' | © '$image->getMetadata('copyright'$language) .'"';
  894.             }else{
  895.                 $imageAlt ' alt="' $defaultAlt '"';
  896.             }
  897.         }
  898.         if($image->getMetadata('title')){
  899.             if($image->getMetadata('copyright')){
  900.                 $imageTitle ' title="' $image->getMetadata('title') . ' | © '$image->getMetadata('copyright') .'"';
  901.             }elseif($image->getMetadata('copyright'$language)){
  902.                 $imageTitle ' title="' $image->getMetadata('title') . ' | © '$image->getMetadata('copyright'$language) .'"';
  903.             }else{
  904.                 $imageTitle ' title="' $image->getMetadata('title') . '"';
  905.             }
  906.         }elseif($image->getMetadata('title'$language)){
  907.             if($image->getMetadata('copyright')){
  908.                 $imageTitle ' title="' $image->getMetadata('title'$language) . ' | © '$image->getMetadata('copyright') .'"';
  909.             }elseif($image->getMetadata('copyright'$language)){
  910.                 $imageTitle ' title="' $image->getMetadata('title'$language) . ' | © '$image->getMetadata('copyright'$language) .'"';
  911.             }else{
  912.                 $imageTitle ' title="' $image->getMetadata('title'$language) . '"';
  913.             }
  914.         }else{
  915.             $imageTitle '';
  916.         }
  917.         $metaDatas $imageAlt $imageTitle;
  918.         
  919.         return $metaDatas;
  920.     }
  921.     function setSeo($headTitle$headMeta ,$title$description$image$overwriteTitle null$overwriteDescription null){
  922.         
  923.         if($overwriteTitle !== null && !empty($overwriteTitle)){
  924.             $headTitle->set($overwriteTitle);
  925.         }else{
  926.             $headTitle->set($title);
  927.         }
  928.         if($overwriteDescription !== null && !empty($overwriteDescription)){
  929.             $headMeta->setDescription(strip_tags($overwriteDescription));
  930.         }else{
  931.             $headMeta->setDescription(strip_tags($description));
  932.         }
  933.         $headMeta->setProperty('og:type''website');
  934.         $headMeta->setProperty('og:url'HighlightStudio::getCurrentUrl());
  935.         if($overwriteTitle !== null && !empty($overwriteTitle)){
  936.             $headMeta->setProperty('og:title'$overwriteTitle);
  937.         }else{
  938.             $headMeta->setProperty('og:title'$title);
  939.         }
  940.         if($overwriteDescription !== null && !empty($overwriteDescription)){
  941.             $headMeta->setProperty('og:description'strip_tags($overwriteDescription));
  942.         }else{
  943.             $headMeta->setProperty('og:description'strip_tags($description));
  944.         };
  945.         if($image){
  946.             $headMeta->setProperty('og:image'\Pimcore\Tool::getHostUrl() . $image);
  947.         }
  948.         return $seo;
  949.     }
  950.     /**
  951.      *
  952.      * @param string $text
  953.      * 
  954.      * @return string
  955.      *
  956.      * @Author : Grégory Lemmens
  957.      * @Version : 1.0
  958.      * @Description :
  959.      *      permet d'appliquer la fonction addslashes de php
  960.      *           
  961.      */
  962.     function apk_addslashes($text) {
  963.         return addslashes($text);
  964.     }
  965.     /**
  966.      *
  967.      * @param string $image
  968.      * 
  969.      * @return string
  970.      *
  971.      * @Author : Grégory Lemmens
  972.      * @Version : 1.0
  973.      * @Description :
  974.      *      transformer une image en base64
  975.      *           
  976.      */
  977.     function base64($fullpath$image) {
  978.         //php file_get_contents disable ssl check
  979.         $arrContextOptions=array(
  980.             "ssl"=>array(
  981.                 "verify_peer"=>false,
  982.                 "verify_peer_name"=>false,
  983.             ),
  984.         );  
  985.         // Get the image and convert into string
  986.         $img file_get_contents($fullpath.$imagefalsestream_context_create($arrContextOptions) );
  987.         
  988.         
  989.         // Encode the image string data into base64
  990.         $data base64_encode($img);
  991.         
  992.         // Display the output
  993.         return $data;
  994.         
  995.     }
  996. }