Подсветка кода в TV

Подскажите пожалуйста возможно ли вывести редактор кода Ace в TV параметре?
Константин
19 мая 2014, 09:32
modx.pro
3
4 734
0

Комментарии: 14

Василий Наумкин
19 мая 2014, 14:09
0
По идее, нужно указать тип ТВ «Область редактора», но Ace это, похоже, просто игнорирует.
    Константин
    19 мая 2014, 14:15
    0
    Ну да, в TV есть «Текстовая область» и «Текстовый редактор», текстовая область выводит простой textarea а текстовый редактор выводит установленный у меня CKEditor. Может можно как то сделать свой тип TV с выводом Ace, просто гугл мне не помог в данном вопросе, может кто уже делал такое.
      Ivan Shvindin
      19 мая 2014, 14:23
      0
      если сделать в системных настройках use_editor нет, то будет ace, правда везде, а не только в этом поле
        Константин
        19 мая 2014, 14:27
        0
        Уже неплохо, теперь надо подумать как бы это выводить для определенного поля (TV параметра). Получается там где тип «текстовые редактор» выводится Ace. Видимо надо копнуть сам Ace )
        Евгений Дурягин
        19 мая 2014, 14:43
        0
        Этот PR добавляет свой тип TV github.com/danyaPostfactum/modx-ace/pull/9
        Но насколько совместим с текущей версией Ace не знаю
          Константин
          19 мая 2014, 15:37
          0
          Не совсем понятно, данный пакет поверх имеющегося Ace не поставить, а если поставить чисто один этот пакет, то редактор вовсе отсутствует.
            Евгений Дурягин
            19 мая 2014, 15:51
            0
            Не совсем понял что и куда вы ставите.
            Из PR можно посмотреть какие файлы меняются и перенести изменения в текущую версию Ace.
            Там всего добавляются 2 новых файла и пара строк в плагин Ace.
              Константин
              19 мая 2014, 15:54
              0
              Ага, понял, сейчас еще разок попробую, я просто думал накатить ваш пакет поверх )
      Константин
      19 мая 2014, 16:08
      0
      1. Заменил код в файле plugin.ace.php только в последней версии Ace он называется уже ace.plugin.php
      2. Добавил файлы
      core/components/ace/elements/tv/input/codetext.class.php
      core/components/ace/elements/tv/input/tpl/codetext.tpl

      Все что изменилось так это только то что Ace перестал подсвечивать вызов сниппетов.
      Либо чего то я опять не понял, либо как говорилось выше версия не совместима.
        Alexey Medvedev
        11 августа 2017, 16:56
        6
        0
        Знаю, что прошло три года, но может кому пригодится. Это кусок моего плагина. (там ещё RTE подключается для определенные категорий ресуров)

        создаем плагин, событие на «OnDocFormRender» с кодом:
        $script = '';
        $resource = ($resource instanceof modResource) 
                    ? 
                    $modx->getObject('modResource',$resource->get('id')) 
                    : $modx->getObject('modResource',(int)$resource);
        
        // ACE
        // Настройка под определенный тв-параметр в шаблоне
        $templates_enable = array( // [id-шаблона] => array('tv[id-тв]')
            '3' => array('tv14'),
            '4' =>  array('tv14')
        );
        
        if ( $resource instanceof modResource && array_key_exists($resource->get('template'), $templates_enable) ) {
            $script .= 'if (MODx.ux.Ace.replaceTextAreas) {';
            foreach ($templates_enable[$resource->get('template')] as $tv) {
                $script .= 'MODx.ux.Ace.replaceTextAreas(Ext.query("textarea#' . $tv . '"));';
            }
            $script .= '}';
        }
        $modx->regClientStartupHTMLBlock('<script>Ext.onReady(function(){' . $script . '})</script>');
        id шаблонов и тв-параметров находятся в скобках в дереве элементов.

        Короткий вариант для всех блоков «Текстовая область»:
        $resource = ($resource instanceof modResource) 
                    ? 
                    $modx->getObject('modResource',$resource->get('id')) 
                    : $modx->getObject('modResource',(int)$resource);
        if ( $resource instanceof modResource ) {
        	$modx->regClientStartupHTMLBlock('
        		<script>Ext.onReady(function(){
        			if (MODx.ux.Ace.replaceTextAreas) {
        				MODx.ux.Ace.replaceTextAreas(Ext.query(".x-form-textarea"));
        			}
        	');
        }
          Константин
          11 августа 2017, 16:59
          0
          Очень круто! На днях потестирую. СПАСИБО!
            Alexey Medvedev
            11 августа 2017, 17:01
            1
            0
            Не за что. Короткий вариант (не закончил js-код).
            $resource = ($resource instanceof modResource) 
                        ? 
                        $modx->getObject('modResource',$resource->get('id')) 
                        : $modx->getObject('modResource',(int)$resource);
            if ( $resource instanceof modResource ) {
            	$modx->regClientStartupHTMLBlock('
            		<script>
            			Ext.onReady(function(){
            				if (MODx.ux.Ace.replaceTextAreas) {
            					MODx.ux.Ace.replaceTextAreas(Ext.query(".x-form-textarea"));
            				}
            			})
            		</script>
            	');
            }
              Александр Янк
              22 ноября 2018, 08:12
              0
              Алексей, искренне благодарю, очень помог ваш вариант!
            UDAV
            18 апреля 2019, 13:40
            0
            Супер. А подскажи пожалуйста как заставить его подсвечивать fenom? (с определенными tv)
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            14