On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • Коллеги, давно мечтаю о такой вещи: есть чанк , который содержит код для подключения какой нибудь компоненты сайта, например галереи. Назовем его [[$gallery]]. Чанк содержит подключения сторонних CSS и JS, также свой код CSS и JS. И какую то HTML разметку. Если с JS в чанке проблем нет, то CSS теги нужно вставлять в голову.
    Можно ли распарсить чанк и отправлять части кода с помощью $modx->regClient...() в соответствующие части страницы. Например, ниже код чанка:
    <!-- CSS -->
    <link rel="stylesheet" href="css/blueimp-gallery.min.css">
    <style>
    	.blueimp-gallery {
    	/* кастомизируем */		
    	}
    
    </style>
    
    <!-- JS -->
    <script src="js/blueimp-gallery.min.js"></script>
    <script>
    blueimp.Gallery(
        document.getElementById('links').getElementsByTagName('a'),
        {
            container: '#blueimp-gallery-carousel',
            carousel: true
    
        }
    );
    </script>
    
    
    <!-- HTML -->
    <div id="blueimp-gallery" class="blueimp-gallery">
        <div class="slides"></div>
        <h3 class="title"></h3>
        <a class="prev">‹</a>
        <a class="next">›</a>
        <a class="close">×</a>
        <a class="play-pause"></a>
        <ol class="indicator"></ol>
    </div>
    

    В идеале, при вызове чанка, отправить код между <!-- CSS --> и <!-- JS --> в голову $modx->regClientStartupHTMLBlock()

    отправить код между <!-- JS --> и <!-- HTML --> вниз страницы $modx->regClientHTMLBlock();
    Но не могу понять, как распарсить чанк...
    • Добрый день!

      А если вам захочется несколько таких чанков, подозреваю, что при увеличении их числа может возникнуть нагромождение, ведь в идеале(если мы говорим и об оптимизации), стилям хорошо бы жить в шапке в одном файле(немногих нескольких), а скриптам - в подвале в другом(немногих нескольких).
      Посему я бы сделал так: сниппет, параметром в который передавать перечислением список таких вот чанков.
      Каждый чанк парсится по регулярным выражениям, вырезается CSS/JS часть, а дальше уже ваша логика - либо собираете стили отдельно, скрипты отдельно и отправляете либо в подвал,либо в шапку...или же создаете какое-то количество js/css файлов(опираясь,например, на название чанка,проверяете на предварительное существование), складываете туда найденное и подключаете уже файлом/файлами.

      Варианты есть, главное, как оно вам интереснее)
        Anton Tarasov
        MODX Developer

        Email: contact@antontarasov.com
        Web: antontarasov.com
      • В общем, получился у меня такой плугин. Есть один недостаток - не парсятся теги modx вида [[]] в тексте, который отправляется через regClientStartupHTMLBlock и regClientHTMLBlock. Ссылка на песочницу с регулярным выражением
        <?php
        switch ($modx->event->name) {
            case 'OnParseDocument':
                $re = '/\A\s*<!--.*?(CSS|JS|HTML).*?-->/i';
                if(!preg_match_all($re, $content, $matches, PREG_SET_ORDER, 0)) break;
                
                $re = '/<!--.*?(CSS|JS|HTML).*?-->(.*?)(?=<!--.*?(CSS|JS|HTML).*?--\>|\z)/mis';
                if(!preg_match_all($re, $content, $matches, PREG_SET_ORDER, 0)) break;
                
                foreach($matches as $match) {
                    switch(strtoupper($match[1])) {
                        case 'CSS':
                            $modx->regClientStartupHTMLBlock(trim($match[2]));
                        break;
                        case 'JS':
                            $modx->regClientHTMLBlock(trim($match[2]));
                        break;
                        case 'HTML':
                                @$output .= trim($match[2]);
                        break;
                    }
                }
        
                $modx->documentOutput = @$output;
            break;
        }