We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23829
    • 57 Posts
    Друзья!
    Может уже и было, но я не могу найти ответа
    Иногда приходится на сайте выкладывать куски кода в качестве примера или демонстрации решений.
    Если в таком примере присутствует чанк или сниппет в соответствующих скобках - он выполняется.
    Я знаю что люди экранируют скобки различными невидимыми комбинациями, но возник вопрос - если куски кода всегда показываются в теге <code>, то можно ли как-то сделать чтобы то, что внутри этого тега - не выполнялось?
      • 785
      • 2,113 Posts
      Только если написать плагин, который находит такие фрагменты и экранирует скобки.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 23829
        • 57 Posts
        Написал плагин, который перед сохранением документа экранирует тегом <!----> все спецСкобки MODX внутри тега <code>...</code>. В этом случае код MODX внутри тега <code> выполняться не будет. При выводе страницы, перед отдачей страницы в браузер удаляет тег <!----> внутри тега <code>...</code>. Таким образом, на странице с примером показанный код MODX будет отображаться без комментариев и остается рабочим его копипасте.

        Исправленные баги плагина тут
        http://zaswerd.ru/modx/plugins/157.html

        Вешаю на два события: OnBeforeDocFormSave (перед сохранением) и OnWebPagePrerender (перед отдачей браузеру)

        $e = &$modx->Event;
        if (($e->name=='OnBeforeDocFormSave')||($e->name=='OnWebPagePrerender')){
        	
        	//если одно из событий - то начинаем работу
        	$replace= array ();
        	$matches= array ();
        	$code = array('{{','{!','[[','[!','!]',']]','!}','}}','[+','+]','[(',')]');
        	$alias = array('{<!---->{','{<!---->!','[<!---->[','[<!---->!','!<!---->]',']<!---->]','!<!---->}','}<!---->}','[<!---->+','+<!---->]','[<!---->(',')<!---->]');
        
        	//если страница сохраняется - вставляем экранирование комментариями
        	if ($e->name=='OnBeforeDocFormSave')	{
        		$content = $GLOBALS['content'];
        		if (preg_match_all('~<code(.*?)</code>~', $content, $matches)) {
        			$count= count($matches[1]);
        			for ($i= 0; $i < $count; $i++) 
        				$replace[$i] = "<code".str_replace($code, $alias,$matches[1][$i])."</code>";
        			$content = str_replace($matches[0], $replace, $content);
        		}
        		$GLOBALS['content'] = $content;
        	}
        
        	//иначе - удаляем экранирование комментариями
        	else{
        		$content = $modx->documentOutput;
        		if (preg_match_all('~<code(.*?)</code>~', $content, $matches)) {
        			$count= count($matches[1]);
        			for ($i= 0; $i < $count; $i++) 
        				$replace[$i] = "<code".str_replace($alias, $code, $matches[1][$i])."</code>";
        			$content = str_replace($matches[0], $replace, $content);
        		}
        		$modx->documentOutput = $content ;
        	}
        }