Последние темы


SHK_Sitemap

  • Андрей, обновите, пожалуйста, shk_sitemap. Я выкладывал в старый форум последний код, там частота обновления добавлена, исключение ресурсов и т.п.

    <?php
    /**
     * snippet shk_sitemap
     *
     * @author slaad
     * 
     */
    
    /*
    
    http://modx-shopkeeper.ru/forum/viewtopic.php?pid=20545#p20545
    
    Examples
    
    1. Only resources (one or more contexts):
    
    [[shk_sitemap?
    &packageNames=`modResource`
    &classNames=`modResource`
    ]]
    
    2. Resources and shop package (Shopkeeper), two contexts:
    
    [[shk_sitemap?
    &packageNames=`modResource,shop`
    &classNames=`modResource,ShopContent`
    &contexts=`web,catalog`
    ]]
    3. Excluding resources 
      
     excluding resources with ids 17,23,31,16:
    
    [[shk_sitemap?
    &packageNames=`modResource,shop`
    &classNames=`modResource,ShopContent`
    &contexts=`web,catalog`
    &excludeModResIds=`17,23,31,16`    
    ]]
     and excluding resources with ids 17,23,31,16 and 1 level childs of resources with ids 17,11,23,14
    [[shk_sitemap?
    &packageNames=`modResource,shop`
    &classNames=`modResource,ShopContent`
    &contexts=`web,catalog`
    &excludeModResIds=`17,23,31,16`
    &excludeModContIds=`17,11,23,14`
    ]]
     
      
      
      
    */
    
    $config =  array( 
        'packageNames' => 'modResource,shop',
        'classNames' => 'modResource,ShopContent',
        'contexts' => 'web,catalog',
        'site_url'=> $modx->getOption('site_url'),
        'site_start'=> $modx->getOption('site_start', null, 1),
        'excludeModResIds'=>'17,23,31,16,19,20',
        'excludeModContIds'=>'17,11,23,14'
    );
    $contentType = $modx->getObject('modContentType',array('name'=>'HTML'));
    $config['urlSuffix']= $contentType->getExtension();
    $config['containerSuffix']=$modx->getOption('container_suffix');
    $config = array_merge( $config, $scriptProperties );
    
    
    $packageNames = explode(',',$config['packageNames']);
    $classNames = explode(',',$config['classNames']);
    $contexts = explode(',',$config['contexts']);
    
    $output = '<?xml version="1.0" encoding="UTF-8"?>
    <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . PHP_EOL;
    
    if(!function_exists('getMapQuery')){
    function getMapQuery($className,$select,$where){
        global $modx;
            $query = $modx->newQuery($className);
            $query->select($select);
            $query->where($where);
            $query->sortby('id','ASC');        
            if ( $query->prepare() && $query->stmt->execute() ){     
                $query_out= array();
                //$modx->log(modX::LOG_LEVEL_ERROR, $query->toSql());
                $query_out=$query->stmt->fetchAll(PDO::FETCH_ASSOC);
    
                foreach($query_out as $r){
                    if (!isset($resources[$r['id']])) $resources[$r['id']]=array();
                    foreach ($select as $s){
                        $resources[$r['id']][$s] = $r[$s];
                    }
                }         
            }
            return $resources;
        }
    }
    if (!function_exists('datediff')) {
        /**
         * @param string $interval Can be:
            yyyy - Number of full years
            q - Number of full quarters
            m - Number of full months
            y - Difference between day numbers
            (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The
            datediff is "-32".)
            d - Number of full days
            w - Number of full weekdays
            ww - Number of full weeks
            h - Number of full hours
            n - Number of full minutes
            s   - Number of full seconds (default)
         * @param $datefrom
         * @param $dateto
         * @param bool $using_timestamps
         * @return float|int|string
         * @package googlesitemap
         */
        function datediff($interval, $datefrom, $dateto, $using_timestamps = false) {
            if (!$using_timestamps) {
                $datefrom = strtotime($datefrom, 0);
                $dateto = strtotime($dateto, 0);
            }
            $difference = $dateto - $datefrom; /* Difference in seconds */
            switch($interval) {
                case 'yyyy': /* Number of full years */
                    $years_difference = floor($difference / 31536000);
                    if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
                        $years_difference--;
                    }
                    if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
                        $years_difference++;
                    }
                    $datediff = $years_difference;
                    break;
    
                case 'q': /* Number of full quarters */
                    $quarters_difference = floor($difference / 8035200);
                    while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
                        $quarters_difference++;
                    }
                    $quarters_difference--;
                    $datediff = $quarters_difference;
                    break;
    
                case 'm': /* Number of full months */
                    $months_difference = floor($difference / 2678400);
                    while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
                        $months_difference++;
                    }
                    $months_difference--;
                    $datediff = $months_difference;
                    break;
    
                case 'y': /* Difference between day numbers */
                    $datediff = date('z',$dateto) - date('z',$datefrom);
                    break;
    
                case 'd': /* Number of full days */
                    $datediff = floor($difference / 86400);
                    break;
    
                case 'w': /* Number of full weekdays */
                    $days_difference = floor($difference / 86400);
                    $weeks_difference = floor($days_difference / 7); /* Complete weeks */
                    $first_day = date('w', $datefrom);
                    $days_remainder = floor($days_difference % 7);
                    /* Do we have a Saturday or Sunday in the remainder? */
                    $odd_days = $first_day + $days_remainder;
                    if ($odd_days > 7) { /* Sunday */
                        $days_remainder--;
                    }
                    if ($odd_days > 6) { /* Saturday */
                        $days_remainder--;
                    }
                    $datediff = ($weeks_difference * 5) + $days_remainder;
                    break;
    
                case 'ww': /* Number of full weeks */
                    $datediff = floor($difference / 604800);
                    break;
    
                case 'h': /* Number of full hours */
                    $datediff = floor($difference / 3600);
                    break;
    
                case 'n': /* Number of full minutes */
                    $datediff = floor($difference / 60);
                    break;
    
                default: /* Number of full seconds (default) */
                    $datediff = $difference;
                    break;
            }
            return $datediff;
        }
    }
    
                   
    foreach ( $packageNames as $key => $packageName ){
        
        $parentName = $packageName == 'modResource' ? "parent" : "resource_id";
        $select = array('id','alias','editedon','createdon',$parentName);
        if( $packageName != 'modResource' ){
            $modelpath = $modx->getOption('core_path') . 'components/' . $packageName . '/model/';
            $modx->addPackage($packageName, $modelpath);
        }
        else{
            $select = array_merge( $select, array('context_key','isfolder') );
        }   
        
        $where=array( 'published' => 1 );    
        if($config['excludeModResIds'] && $packageName == 'modResource'){
            $ids=array('id:NOT IN' => explode(',',$config['excludeModResIds'] ));
            array_push($where,$ids);
        } 
            if($config['excludeModContIds']&& $packageName == 'modResource'){
            $ids=array('parent:NOT IN' => explode(',',$config['excludeModContIds'] ));
            array_push($where,$ids);
        } 
        $resources = getMapQuery($classNames[$key],$select,$where);
        if(!empty($resources)){
        foreach ( $resources as $resource ){
            if(!empty($resource['alias'])){
                if (!isset($resource['context_key'])) {
                    $resource['context_key'] = !empty( $contexts[$key] ) ? $contexts[$key] : $contexts[0];
                }     
                if ( $resource[$parentName] != 0 ){
                    $url = $modx->makeUrl($resource[$parentName],$resource['context_key'],'','full');
                }
                else{
                    $url = $config['site_url'];
                }
               
                $url .=substr($url, -1)=='/' ? $resource['alias'] : '/'.$resource['alias'];
                $url .= !empty( $resource['isfolder'] ) ? $config['containerSuffix'] : $config['urlSuffix'];
                
                if ($packageName == 'modResource'&& $resource['id']==$config['site_start']){
                    $url=$config['site_url'];
                }
                            
                $date = !empty( $resource['editedon'] ) ? $resource['editedon'] : $resource['createdon'];
                $date = strftime( '%Y-%m-%d', $date );
                $date = date("Y-m-d", strtotime($date));
    
                /* Get the date difference */
                $datediff = datediff("d", $date, date("Y-m-d"));
                if ($datediff <=1) {
                    $priority = '1.0';
                    $update = 'daily';
                } elseif (($datediff >1) && ($datediff<=7)) {
                    $priority = '0.75';
                    $update = 'weekly';
                } elseif (($datediff >7) && ($datediff<=30)) {
                    $priority = '0.50';
                    $update = 'weekly';
                } else {
                    $priority = '0.25';
                    $update = 'monthly';
                }        
    
                $output .= "
                <url>
                    <loc>{$url}</loc>
                    <lastmod>{$date}</lastmod>
                    <priority>{$priority}</priority>
                    <changefreq>{$update}</changefreq>
                </url>";
           }
        }
       }
    }
    unset($key);
    
    $output .= PHP_EOL . "</urlset>";
    
    return $output;```
  • в нем с параметрами все в порядке??
    поставил обновленную версию на скачанный демосайт - выдает пустую страницу, какие бы параметры не ставил туда

  • если вы без параметров вызываете, то в коде лучше заменить часть:

    $config =  array( 
        'packageNames' => 'modResource,shop',
        'classNames' => 'modResource,ShopContent',
        'contexts' => 'web,catalog',
        'site_url'=> $modx->getOption('site_url'),
        'site_start'=> $modx->getOption('site_start', null, 1),
        'excludeModResIds'=>'',
        'excludeModContIds'=>''
    );```
  • хз, не разобрался... вернул старую версию

  • "'contexts' => 'web,catalog',"
    Что за контексты web, catalog????

  • Пустую страницу выдаёт!!!

 

Последние комментарии

  • а редактируются они через CMP

    Покажите скриншот. Не понял что за CMP. Но если и не подвязаны, оставьте значение, которое было.
    Вот мой скриншот:
    0_1565682115311_screenshot_179.png

    Читать далее
  • D

    Участник @Andchir написал в Экспорт/импорт данных из таблиц пакетов MIGX db через плагин CatalogFill:

    MIGXDB

    какие родители в элементах migx db?
    это элементы, которые к ресурсам никак не подвязаны!
    а редактируются они через CMP

    Читать далее
  • //Название поля ID родителя $cf_config['parent_field'] = false;

    Почему так? В MIGXDB документы должны иметь родителя. Иначе как вы их добавляете/редактируете в админке?

    Читать далее
  • D

    отключил, очистил
    далее http://joxi.ru/12MEdEvtloelG2 -> http://joxi.ru/VrwXwXZt7RN7Mm
    в журнале ошибок - пусто
    код настройки

    <?php //Название класса таблицы товаров в БД $cf_config['className'] = 'delivery_flight'; //Название пакета таблицы товаров в БД $cf_config['packageName'] = 'delivery_schedule'; //Название поля ID родителя $cf_config['parent_field'] = false; //разбивка по столбцам при импорте и экспорте (content|tv|category) $cf_config['content_row'] = array( array('ID',array('id','content')), array('Наименование',array('name','content')), array('Время',array('time','content')), array('Откуда',array('from','content')), array('Время в пути',array('duration','content')), array('Куда',array('to','content')), array('Время прибытия',array('arrival_time','content')), array('Стоимость',array('price','content')), array('Тариф',array('delivery_rate_id','content')), array('Сортировка',array('sort','content')), ); //значения по умолчанию при импорте или проверка при экспорте $cf_config['imp_content_default'] = array( 'content' => array( 'deleted' => 0, 'published' => 1, //'template' => 9 'createdon' => strtotime("now") //'publishedon' => strtotime("now") //'pub_date' => strtotime("now") //'editedby' => 1 //'editedon' => strtotime("now") ), 'tv' => array( //7 => 0 ) ); //первая строка - названия полей $cf_config['include_captions'] = true; //число товаров импортируемых за один раз (загрузка по группам). 0 - не ограничивать. $cf_config['batch_import'] = 300; //разбивать по категориям $cf_config['include_categories'] = false; //удалять дочерние категории при очистке и обновлении каталога $cf_config['delete_subcategories'] = true; //по какому полю проверять соответствие товара при обновлении. false - не проверять (очистка категории при обновлении). $cf_config['imp_chk_field'] = false; //проверять соответствие товара при обновлении по значению TV. Указать ID TV. false - не проверять (очистка категории при обновлении). $cf_config['imp_chk_tvid_val'] = false; //Добавлять товары, которые не найдены при обновлении по TV (imp_chk_tvid_val) или полю (imp_chk_field) $cf_config['imp_if_not_exist'] = true; //удалять HTML-теги при экспорте $cf_config['exp_strip_tags'] = false; //автоматически генерировать псевдоним (alias) при импорте //false - выключено; true - генерировать с переводом в транслит; 'notranslit' - генерировать без перевода в транслит. $cf_config['imp_autoalias'] = false; //Изменить значения поля для всех вложенных товаров до начала импорта. //Например можно отменить публикацию для всех товаров и публиковать только те, которые есть в новом прайс-листе. //первый массив - какие поля и на какие значения менять, второй массив - условия которые нужно проверять (можно сделать пустым) $cf_config['imp_before_change'] = false;//'[{"tv.inventory":0},{}]';//'[{"published":0},{"tv.pricename":"Поставщик1"}]';//false - для отмены //удалить файл после экспорта (скачивания) $cf_config['exp_delete_file'] = false; //кодировка CSV-файла при экспорте $cf_config['exp_csv_charset'] = 'UTF-8'; //'windows-1251' //Импортировать (обновлять) пустые значения $cf_config['imp_empty'] = true; //Имя файла процессора, который использовать для импорта. Если пусто, используется стандартный процессор "import". $cf_config['imp_custom_processor'] = ''; //путь (xpath) в XML структуре до товаров $cf_config['imp_xml_itemsparent_path'] = '';//'/catalog/shop/offers'; //Структура XML файла для импорта $cf_config['imp_xml_structure'] = ''; //тестирование конфигурации (без записи в БД). Отчёты -> Журнал ошибок. $cf_config['imp_testmode'] = true; //функция для фильтрации значений при ИМПОРТЕ function filter_import($value_arr){ $output_arr = $value_arr; /* if(isset($output_arr['content']['pagetitle'])) $output_arr['content']['pagetitle'] = mb_strtoupper($output_arr['content']['pagetitle'], 'UTF-8'); */ return $output_arr; } //функция для фильтрации значений при ЭКСПОРТЕ function filter_export($value_arr,$doc_id=0){ $output_arr = $value_arr; //var_dump($value_arr,$output_arr); //exit; /* if(isset($output_arr['price'])) $output_arr[1] = floatval($output_arr[1]) - 200; */ return $output_arr; } ?>

    shema пакета, для которого написана настройка

    <model package="delivery_schedule" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1"> <object class="delivery_rate" table="delivery_rates" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="color" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="desc" dbtype="text" phptype="string" null="false" default="" /> <field key="sort" dbtype="int" precision="10" phptype="integer" null="false" default="500"/> <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" /> <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="1" /> <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/> </object> <object class="delivery_flight" table="delivery_flights" extends="xPDOSimpleObject"> <field key="name" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="from" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="time" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="duration" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="to" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="arrival_time" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="price" dbtype="varchar" precision="255" phptype="string" null="false" default=""/> <field key="sort" dbtype="int" precision="10" phptype="integer" null="false" default="500"/> <field key="delivery_rate_id" dbtype="int" precision="10" phptype="integer" null="false" default="0"/> <field key="deleted" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="0" /> <field key="published" dbtype="tinyint" precision="1" attributes="unsigned" phptype="integer" null="false" default="1" /> <field key="createdon" dbtype="datetime" phptype="datetime" null="true"/> <aggregate alias="Delivery_rate" class="delivery_rate" local="delivery_rate_id" foreign="id" cardinality="one" owner="foreign" /> </object> </model>

    Читать далее