Source for file jResponseSitemap.class.php

Documentation is available at jResponseSitemap.class.php

  1. <?php
  2. /**
  3. @package     jelix
  4. @subpackage  core_response
  5. @author      Baptiste Toinot
  6. @contributor Laurent Jouanneau
  7. @copyright   2008 Baptiste Toinot, 2011 Laurent Jouanneau
  8. @link        http://www.jelix.org
  9. @licence     GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  10. */
  11.  
  12. /**
  13. *
  14. */
  15. require_once(JELIX_LIB_PATH.'tpl/jTpl.class.php');
  16.  
  17. /**
  18. * Sitemap 0.9 response
  19. *
  20. @package jelix
  21. @subpackage core_response
  22. @link http://www.sitemaps.org/
  23. @since 1.2
  24. */
  25. class jResponseSitemap extends jResponse {
  26.  
  27.     /**
  28.     * Ident of the response type
  29.     * @var string 
  30.     */
  31.     protected $_type = 'sitemap';
  32.  
  33.     /**
  34.     * Frequency change url
  35.     * @var array 
  36.     */
  37.     protected $allowedChangefreq = array('always''hourly''daily''weekly',
  38.                                          'monthly''yearly''never');
  39.     /**
  40.     * Maximum number of URLs for a sitemap index file
  41.     * @var int 
  42.     */
  43.     protected $maxSitemap = 1000;
  44.  
  45.     /**
  46.     * Maximum number of URLs for a sitemap file
  47.     * @var int 
  48.     */
  49.     protected $maxUrl = 50000;
  50.  
  51.     /**
  52.     * List of URLs for a sitemap index file
  53.     * @var array() 
  54.     */
  55.     protected $urlSitemap = array();
  56.  
  57.     /**
  58.     * List of URLs for a sitemap file
  59.     * @var array() 
  60.     */
  61.     protected $urlList = array();
  62.  
  63.     /**
  64.      * The template container
  65.      * @var jTpl 
  66.      */
  67.     public $content;
  68.  
  69.     /**
  70.      * Selector of the template file
  71.      * @var string 
  72.      */
  73.     public $contentTpl;
  74.  
  75.     /**
  76.      * Class constructor
  77.      *
  78.      * @return void 
  79.      */
  80.     public function __construct({
  81.         $this->content  = new jTpl();
  82.         $this->contentTpl = 'jelix~sitemap';
  83.         parent::__construct();
  84.     }
  85.  
  86.     /**
  87.      * Generate the content and send it
  88.      * Errors are managed
  89.      * @return boolean true if generation is ok, else false
  90.      */
  91.     final public function output({
  92.         $this->_httpHeaders['Content-Type''application/xml;charset=UTF-8';
  93.  
  94.         if (count($this->urlSitemap)) {
  95.             $head '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' "\n";
  96.             $foot '</sitemapindex>';
  97.             $this->contentTpl = 'jelix~sitemapindex';
  98.             $this->content->assign('sitemaps'$this->urlSitemap);
  99.         else {
  100.             $head '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' "\n";
  101.             $foot '</urlset>';
  102.             $this->content->assign('urls'$this->urlList);
  103.         }
  104.         $content $this->content->fetch($this->contentTpl);
  105.  
  106.         // content is generated, no errors, we can send it
  107.         $this->sendHttpHeaders();
  108.         echo '<?xml version="1.0" encoding="UTF-8"?>'"\n";
  109.         echo $head$content$foot;
  110.         return true;
  111.     }
  112.  
  113.     /**
  114.      * add a URL in a sitemap file
  115.      * @param string $loc URL of the page
  116.      * @param string $lastmod The date of last modification of the file
  117.      * @param string $changefreq How frequently the page is likely to change
  118.      * @param string $priority The priority of this URL relative to other URLs
  119.      * @return boolean true if addition is ok, else false
  120.      */
  121.     public function addUrl($loc$lastmod null$changefreq null$priority null{
  122.  
  123.         if (isset($loc[2048]|| count($this->urlList>= $this->maxUrl{
  124.             return false;
  125.         }
  126.         global $gJCoord;
  127.         $url new jSitemapUrl();
  128.         $url->loc $gJCoord->request->getServerURI($loc;
  129.  
  130.         if (($timestamp strtotime($lastmod))) {
  131.             $url->lastmod date('c'$timestamp);
  132.         }
  133.  
  134.         if ($changefreq && in_array($changefreq$this->allowedChangefreq)) {
  135.             $url->changefreq $changefreq;
  136.         }
  137.  
  138.         if ($priority && is_numeric($priority&& $priority >= && $priority <= 1{
  139.             $url->priority sprintf('%0.1f'$priority);
  140.         }
  141.  
  142.         $this->urlList[$url;
  143.         return true;
  144.     }
  145.  
  146.     /**
  147.      * add a URL in a sitemap file
  148.      * @param string $loc URL of sitemap file
  149.      * @param string $lastmod The date of last modification of the sitemap file
  150.      * @return boolean true if addition is ok, else false
  151.      */
  152.     public function addSitemap($loc$lastmod null{
  153.  
  154.         if (isset($loc[2048]|| count($this->urlSitemap>= $this->maxSitemap{
  155.             return false;
  156.         }
  157.         global $gJCoord;
  158.         $sitemap new jSitemapIndex();
  159.         $sitemap->loc $gJCoord->request->getServerURI($loc;
  160.  
  161.         if (($timestamp strtotime($lastmod))) {
  162.             $sitemap->lastmod date('c'$timestamp);
  163.         }
  164.  
  165.         $this->urlSitemap[$sitemap;
  166.         return true;
  167.     }
  168.  
  169.     /**
  170.      * Add URLs automatically from urls.xml
  171.      * @return void 
  172.      */
  173.     public function importFromUrlsXml({
  174.         $urls $this->_parseUrlsXml();
  175.         foreach ($urls as $url{
  176.             $this->addUrl($url);
  177.         }
  178.     }
  179.  
  180.     /**
  181.      * Return pathinfo URLs automatically from urls.xml
  182.      * @return array 
  183.      */
  184.     public function getUrlsFromUrlsXml({
  185.         return $this->_parseUrlsXml();
  186.     }
  187.  
  188.     /**
  189.      * Submitting a sitemap by sending an HTTP request
  190.      * @return boolean 
  191.      */
  192.     public function ping($uri{
  193.         $parsed_url parse_url($uri);
  194.         if (!$parsed_url || !is_array($parsed_url)) {
  195.             return false;
  196.         }
  197.         $http new jHttp($parsed_url['host']);
  198.         $http->get($parsed_url['path''?' $parsed_url['query']);
  199.         if ($http->getStatus(!= 200{
  200.             return false;
  201.         }
  202.         return true;
  203.     }
  204.  
  205.     /**
  206.      * Parse urls.xml and return pathinfo URLs
  207.      * @return array 
  208.      */
  209.     protected function _parseUrlsXml({
  210.         global $gJConfig;
  211.  
  212.         $urls array();
  213.         $significantFile $gJConfig->urlengine['significantFile'];
  214.         $basePath $gJConfig->urlengine['basePath'];
  215.         $epExt ($gJConfig->urlengine['multiview']?$gJConfig->urlengine['entrypointExtension']:'');
  216.  
  217.         $file jApp::tempPath('compiled/urlsig/' $significantFile '.creationinfos.php');
  218.  
  219.         if (file_exists($file)) {
  220.             require $file;
  221.             foreach ($GLOBALS['SIGNIFICANT_CREATEURL'as $selector => $createinfo{
  222.                 if ($createinfo[0!= && $createinfo[0!= 4{
  223.                     continue;
  224.                 }
  225.                 if ($createinfo[0== 4{
  226.                     foreach ($createinfo as $k => $createinfo2{
  227.                         if ($k == 0continue;
  228.  
  229.                         if ($createinfo2[2== true // https needed -> we don't take this url. FIXME
  230.                          ||count($createinfo2[3]) ) // there are some dynamique parameters, we don't take it this we cannot guesse dynamic parameters
  231.                             continue;
  232.                         }
  233.                         $urls[$basePath.($createinfo2[1]?$createinfo2[1].$epExt:'').$createinfo2[5];
  234.                     }
  235.                 }
  236.                 else if ($createinfo[2== true // https needed -> we don't take this url. FIXME
  237.                          ||  count($createinfo[3]) ) // there are some dynamique parameters, we don't take it this we cannot guesse dynamic parameters
  238.                     continue;
  239.                 }
  240.                 else {
  241.                     $urls[$basePath.($createinfo[1]?$createinfo[1].$epExt:'').$createinfo[5];
  242.                 }
  243.             }
  244.         }
  245.         return $urls;
  246.     }
  247. }
  248.  
  249. /**
  250.  * Content of a URL
  251.  * @package jelix
  252.  * @subpackage core_response
  253.  * @since 1.2
  254.  */
  255. class jSitemapUrl {
  256.  
  257.     /**
  258.      * URL of the page
  259.      * @var string 
  260.      */
  261.     public $loc;
  262.  
  263.     /**
  264.      * The date of last modification of the page
  265.      * @var string 
  266.      */
  267.     public $lastmod;
  268.  
  269.     /**
  270.      * How frequently the page is likely to change
  271.      * @var string 
  272.      */
  273.     public $changefreq;
  274.  
  275.     /**
  276.      * The priority of this URL relative to other URLs
  277.      * @var string 
  278.      */
  279.     public $priority;
  280. }
  281.  
  282. /**
  283.  * Content of a sitemap file
  284.  * @package    jelix
  285.  * @subpackage core_response
  286.  * @since 1.2
  287.  */
  288. class jSitemapIndex {
  289.  
  290.     /**
  291.      * URL of the sitemap file
  292.      * @var string 
  293.      */
  294.     public $loc;
  295.  
  296.     /**
  297.      * The date of last modification of the sitemap file
  298.      * @var string 
  299.      */
  300.     public $lastmod;
  301. }

Documentation generated on Wed, 24 Sep 2014 22:01:40 +0200 by phpDocumentor 1.4.3