Александр Иванов

Александр Иванов

С нами с 04 июня 2018; Место в рейтинге пользователей: #574
Александр Иванов
17 июня 2020, 23:40
0
1.
<strong> и </strong>
нужно везде убрать и заменить id на ваши
2. файлы и не будут создаваться никакие,
3.общий файл — это документ из пункта 1
(его ссылку нужно вставлять в вебмастер)
4.pdoTools должен быть установлен
Александр Иванов
01 мая 2020, 10:58
-1
Попробуйте добавить условие
Для вашего варианта с pdoResources
&where=`{ "class_key":"msProduct" }`
или
&where=`{ "isfolder":"0" }`
Александр Иванов
01 мая 2020, 10:43
-1
В чанке используете?
что в чанке «mat»?
Александр Иванов
01 мая 2020, 10:11
-1
Это называется
— Видишь дерево?
— Нет.
— И я не вижу, а оно — есть
Александр Иванов
01 мая 2020, 09:50
-1
[[pdoMenu?
&parents=`16`
&level=`2`
&sortdir=`ASC`
&sortby=`menuindex`
&tplOuter=`@INLINE [[+wrapper]]`
&tpl=`mat`
&includeTVs=`img`
&countChildren=`0`
]]
Александр Иванов
01 мая 2020, 09:28
-1
Нет, её не обязательно обновлять, оно и так работает, но вы можете прописать

<yml_catalog date="[[!+nowdate:default=`now`:strtotime:date=`%Y-%m-%d %R`]]">

про пункт, согласен, идеально.
Александр Иванов
01 мая 2020, 09:23
-1
Ну первое что пришло в голову, там дерево и не нужно, ты прав, что дерева не будет, будет обычный список
Но мне это решение быстрее всего пришло в голову, так как XML, дерево строится по parentid
Если есть решение получше, напишите его
Александр Иванов
01 мая 2020, 06:20
0
в кеш я не записываю, можете написать своё условие записи контента в кеш, сейчас работает на лету, но фотки кешируются, работает быстро
Александр Иванов
01 мая 2020, 06:15
+1
1. Скачиваем библиотеку phpQuery
Кидаем её куда-нибудь, я залил в /assets/phpQuery
Так же потребуется phpthumbon

2. Создаем плагин с названием imageSrc
вешаем событие OnWebPagePrerender
Содержимое
<?php
switch ($modx->event->name) {
    case 'OnWebPagePrerender':
        if ( $modx->context->get( 'key' ) == 'mgr') return;
        
        // Условия для каких шаблонов мы будем это делать, у меня ID 3 - это статейные шаблоны
        $templates_allow = array(3);
        // класс обертки контента, где нужно искать фотки
        $wrapper_class = 'about-content';
        // Ваша ширина контента
        $wrapper_width = 866;
        
        $img_wrapper_min_width = 100; // минимальная ширина фотки для обертки
        
        $img_wrapper_min_width_fancybox = 1000; // минимальная ширина фотки для обертки в fancybox
        $img_wrapper_min_height_fancybox = 300; // минимальная высота фотки для обертки в fancybox
        $template = $modx->resource->get('template');
        $resource_id = $modx->resource->get('id');
        $cache_key = md5($resource_id);
        $file = MODX_BASE_PATH . 'resourcecache/u/prep_' . $cache_key . '.txt';
        if(!in_array($template,$templates_allow)) return;
        $output = &$modx->resource->_output;
             
        if(is_file($file)){
            if(!empty($cache)){
                // здесь у меня дополнительная обертка кеша
                $string = preg_replace('|<div class="'.$wrapper_class.'">(.*)</div>|isU', '<div class="'.$wrapper_class.' about-cache">'.$cache.'</div>',$output);
                $output = $string;
                return;
                break;
            }
        }
        
        include_once MODX_ASSETS_PATH . 'phpQuery/phpQuery.php';
        // здесь я удаляю пустые теги
        $output = str_replace(array('<h2> </h2>','<h3> </h3>','<h1> </h1>'),'<p> </p>',$output);
        $html = phpQuery::newDocument($output);
        // получаю картинки с условием
        $img = $html->find('.'.$wrapper_class." img:not(.aggregate__img):not(.gallery__img)");
        $i = 0;
      
        foreach($img as $value){
            $src = $value->getAttribute('src');
            $img_path = MODX_BASE_PATH.ltrim($src, "/");
            if(file_exists($img_path)){
                $img_size = getimagesize($img_path);
                $width = $img_size[0];
                $height = $img_size[1];
                $attr_width = $value->getAttribute('width');
                $attr_height = $value->getAttribute('height');
                // пропускаю фотки которые больше  px
                if($width >$img_wrapper_min_width && (isset($attr_width) && $attr_width > $img_wrapper_min_width)){
                    if($width >$wrapper_width){
                        $i++;
                        $w = 'w='.((isset($attr_width) && $attr_width < $wrapper_width) ? $attr_width :$wrapper_width);
                        $new_src = $modx->runSnippet('phpthumbon',array('input'=>$src,'options'=>$w.'&q=60&bg=ffffff'));
                        $img_mew_path = MODX_BASE_PATH.ltrim($new_src, "/");
                        $new_img_size = getimagesize($img_mew_path);
                        $new_width = $new_img_size[0];
                        $new_height = $new_img_size[1];
                        $src = $modx->runSnippet('phpthumbon',array('input'=>$src,'options'=>'q=100&f=png&bg=ffffff'));
                        $value->setAttribute('src',$new_src);
                        $value->setAttribute('data-src',$src);
                        
                        if((isset($attr_width) && $attr_width > $wrapper_width)){
                             $value->setAttribute('width',$wrapper_width);
                             $value->setAttribute('height',$new_height);
                        }else{
                            $value->setAttribute('width',$new_width);
                            $value->setAttribute('height',$new_height);
                        }
       
                        $name = $value->getAttribute('alt');
                        if(!$name){
                            $value->setAttribute('alt',($name ? $name : $modx->resource->get('pagetitle')));
                        }
                        $value = pq($value);
                      
                        $new_html = $value;
                        
                        if($new_height > $img_wrapper_min_height_fancybox && $width > $img_wrapper_min_width_fancybox || (isset($attr_width) && $attr_width!=$width) && ((isset($new_height) && $new_height!=$height && $height >$img_wrapper_min_height_fancybox))){
                            // здесь я оборачиваю большие фотки, что бы их можно было показать при помощи fancybox
                          $new_html = '<a href="'.$src.'" class="article__image" data-fancybox="article-'.$i.'">'.$new_html.'</a>';
                        }
                        
                        $new_html .='<meta itemprop="name" content="'.($name ? $name : $modx->resource->get('pagetitle')).'">';
                        $new_html .='<meta itemprop="width" content="'.$width.'">';
                        $new_html .='<meta itemprop="height" content="'.$height.'">';
                        $new_html .='<meta itemprop="contentUrl" content="'.$src.'">';
                      
                        $new_html = $value->wrap('<span itemscope="" itemtype="http://schema.org/ImageObject">'.$new_html.'</span>');
                        $value->replaceWith($new_html);
     
                    }else{
                        
                        $i++;
                        $new_src = $src;
                        $value->setAttribute('itemprop','contentUrl');
                        $name =  $value->getAttribute('alt');
                        
                        if(!$name){
                            $value->setAttribute('alt',($name ? $name : $modx->resource->get('pagetitle')));
                        }
                        
                        $value = pq($value);
                        $new_html = $value;
                        $new_html .='<meta itemprop="name" content="'.($name ? $name : $modx->resource->get('pagetitle')).'">';
                        $new_html .='<meta itemprop="width" content="'.$width.'">';
                        $new_html .='<meta itemprop="height" content="'.$height.'">';
                        $new_html = $value->wrap('<p itemscope="" itemtype="http://schema.org/ImageObject">'.$new_html.'</p>');
                        $value->replaceWith($new_html);
                        
                    }
                }
            }
        }
        
        $html = $html->html();
        $output = $html;
        return;
        break;
}
Внимание! Требует доработок под ваши настройки с шириной контента, ещё я добавил туда обёртку для fancybox, так же можете изменить на другую
Александр Иванов
30 апреля 2020, 16:05
0
3.4
ID Главной категории

3.5
Свойства записывайте в параметр
<param name="Вес">[[+weight]]</param>
например
как это делаете в карточке товара
и тег strong поубирайте, где вставлять айдишники нужно
Александр Иванов
30 апреля 2020, 08:59
+1
1. Создаём новый документ с типом содержимого XML

2. В поле «Содержимое» вставляем
[[!msProducts?
&parents=`<strong>ЗДЕСЬ ID КАТЕГОРИЙ ЧЕРЕЗ ЗАПЯТУЮ</strong>`
&limit=`0`
&tplWrapper=`tpl.xml.msProduct.wrapper`
&tpl=`tpl.xml.msProduct.row`
&includeContent=`1`
]]

3. Создаем 5 чанков

3.1 tpl.xml.msProduct.wrapper
<?xml version="1.0" encoding="UTF-8"?>
<yml_catalog date="2019-11-01 17:22">
    <shop>
        <name>[[++site_name]]</name>
        <company>[[++site_name]]</company>
        <url>[[++site_url]]</url>
        <email>[[++emailsender]]</email>
        <currencies>
            <currency id="RUR" rate="1"/>
            <currency id="USD" rate="80"/>
        </currencies>
        <categories>
            [[!pdoMenu?
            &parents=`<strong>ЗДЕСЬ ID ГЛАВНОЙ КАТЕГОРИИ</strong>`
            &displayStart=`1`
            &tplStart=`tpl.xml.category`
            &level=`0`
            &templates=`<strong>ЗДЕСЬ ID ШАБЛОНА КАТЕГОРИЙ</strong>`
            &showUnpublished=`1`
            &tplWrapper=`tpl.xml.categoryWrapper`
            &tplOuter=`@INLINE [[+wrapper]]`
            &tpl=`tpl.xml.category`
            ]]
        </categories>
        <offers>
            [[+output]]
        </offers>           
    </shop>
</yml_catalog>

3.2 tpl.xml.categoryWrapper
[[+output]]

3.3 tpl.msGalleryListMini
medium — это размер фотки, от минишопа
{if $files}
{foreach $files as $key => $file}
<picture>{$file['medium']}</picture>
{/foreach}
{/if}

3.4 tpl.xml.category потребуется fenom, ну можете условия написать на modx
<category id="[[+id]]"{if $parent && $parent!=<strong>ЗДЕСЬ ID ШАБЛОНА КАТЕГОРИЙ</strong>} parentId="[[+parent]]"{/if}>[[+menutitle:default=`[[+pagetitle]]`]]</category>[[+wrapper]]

3.5 tpl.xml.msProduct.row
самое главное, это оффер товара, сюда можете вписывать условия из документации турбо страниц
напишу в комментах, если нужно будет, либо сами попробуйте, ну как в карточке выводите, так и сюда, через foreach наверно
<offer id="[[+id]]">
<price>[[+price:replace=` ==`]]</price>
<currencyId>RUR</currencyId>
<categoryId>[[+parent]]</categoryId>
{$_modx->runSnippet('msGallery', ['tpl' => 'tpl.msGalleryListMini','product' => $id])}
<store>false</store>
<pickup>true</pickup>
<delivery>true</delivery>
<name>[[+pagetitle]]</name>
<!-- можно написать условие для очистки контента, или вставить description-->
<description><![CDATA[ [[+content]] ]]>
</description>
<url>[[++site_url]][[+uri]]</url>
<delivery-options>
<!-- общие условия курьерской доставки -->
</delivery-options>
</offer>

ну и всё, ссылка на xml это тот документ, который мы создавали вначале
Александр Иванов
10 июня 2018, 23:52
0
Там мультиселект не работает, есть решение?
Александр Иванов
10 июня 2018, 19:06
0
Актуально!