From 4a13232715a259ed30aa36d12ae26f315df12dcb Mon Sep 17 00:00:00 2001 From: skMikhail Date: Fri, 23 Dec 2016 00:02:35 +0400 Subject: [PATCH] Some small bugs fixed. The frequency update parameter was added. --- .../elements/snippets/snippet.sitemap.php | 241 +++++++++++++++--- 1 file changed, 202 insertions(+), 39 deletions(-) diff --git a/core/components/shopkeeper3/elements/snippets/snippet.sitemap.php b/core/components/shopkeeper3/elements/snippets/snippet.sitemap.php index 8395773..9194450 100755 --- a/core/components/shopkeeper3/elements/snippets/snippet.sitemap.php +++ b/core/components/shopkeeper3/elements/snippets/snippet.sitemap.php @@ -1,5 +1,4 @@ 'modResource,shop', 'classNames' => 'modResource,ShopContent', - 'contexts' => 'web,catalog' + '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' ); - -$config = array_merge( $config, $scriptProperties ); $contentType = $modx->getObject('modContentType',array('name'=>'HTML')); -$config['urlSuffix'] = $contentType->getExtension(); -$config['containerSuffix'] = $modx->getOption('container_suffix'); +$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 = " -" . PHP_EOL; +$output = ' +' . PHP_EOL; if(!function_exists('getMapQuery')){ -function getMapQuery($className,$select){ +function getMapQuery($className,$select,$where){ global $modx; $query = $modx->newQuery($className); $query->select($select); - $query->where( array( 'published' => 1, 'hidemenu' => 0 ) ); + $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){ @@ -65,49 +94,183 @@ function getMapQuery($className,$select){ 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; -$packageNames = explode(',',$config['packageNames']); -$classNames = explode(',',$config['classNames']); -$contexts = explode(',',$config['contexts']); + 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',$parentName); + $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') ); - } - - $resources = getMapQuery($classNames[$key],$select); + } + $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 (!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 = $modx->getOption('site_url'); - } - $url .= $resource['alias']; - $url .= !empty( $resource['isfolder'] ) ? $config['containerSuffix'] : $config['urlSuffix']; - $editedon = !empty( $resource['editedon'] ) ? $resource['editedon'] : $resource['createdon']; - $date = strftime( '%Y-%m-%d', $editedon ); - $output .= " - - {$url} - {$date} - 0.9 - monthly - "; - } + 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} + {$date} + {$priority} + {$update} + "; + } + } + } } +unset($key); $output .= PHP_EOL . ""; -return $output; +return $output; \ No newline at end of file