developer.jelix.org is not used any more and exists only for history. Post new tickets on the Github account.
developer.jelix.org n'est plus utilisée, et existe uniquement pour son historique. Postez les nouveaux tickets sur le compte github.

Ticket #12: 12-sitemap.3.diff

File 12-sitemap.3.diff, 10.8 KB (added by Surfoo, 11 years ago)
  • build/manifests/jelix-lib.mn

     
    7676  jResponseTcpdf.class.php
    7777  jResponseSoap.class.php
    7878  jResponseHtmlFragment.class.php
     79  jResponseSitemap.class.php
    7980
    8081cd lib/jelix/core-modules/jelix
    8182  module.xml
     
    183184  cruddfk_edit.tpl
    184185  cruddfk_view.tpl
    185186  defaultmain.tpl
     187  sitemap.tpl
     188  sitemapindex.tpl
    186189cd lib/jelix/core-modules/jelix/templates/en_EN
    187190  check_install.tpl
    188191cd lib/jelix/core-modules/jelix/templates/en_US
  • lib/jelix/core/response/jResponseSitemap.class.php

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

     
    6161soap = jResponseSoap
    6262htmlfragment = jResponseHtmlFragment
    6363htmlauth = jResponseHtml
     64sitemap = jResponseSitemap
    6465
    6566[_coreResponses]
    6667html = jResponseHtml
     
    8788soap = jResponseSoap
    8889htmlfragment = jResponseHtmlFragment
    8990htmlauth = jResponseHtml
     91sitemap = jResponseSitemap
    9092
    9193[error_handling]
    9294messageLogFormat = "%date%\t[%code%]\t%msg%\t%file%\t%line%\n"
  • lib/jelix/core-modules/jelix/templates/sitemapindex.tpl

     
     1{foreach $sitemaps as $sitemap}
     2    <sitemap>
     3        <loc>{$sitemap->loc|escxml}</loc>
     4        {if $sitemap->lastmod}<lastmod>{$sitemap->lastmod|escxml}</lastmod>{/if}
     5
     6    </sitemap>
     7{/foreach}
     8{* endtag is generated by the response *}
     9 No newline at end of file
  • lib/jelix/core-modules/jelix/templates/sitemap.tpl

     
     1{foreach $urls as $url}
     2    <url>
     3        <loc>{$url->loc|escxml}</loc>
     4        {if $url->lastmod}<lastmod>{$url->lastmod|escxml}</lastmod>{/if}
     5
     6        {if $url->changefreq}<changefreq>{$url->changefreq|escxml}</changefreq>{/if}
     7
     8        {if $url->priority}<priority>{$url->priority|escxml}</priority>{/if}
     9
     10    </url>
     11{/foreach}
     12{* endtag is generated by the response *}
     13 No newline at end of file