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-2.diff

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

     
    7575  jResponseTcpdf.class.php
    7676  jResponseSoap.class.php
    7777  jResponseHtmlFragment.class.php
     78  jResponseSitemap.class.php
    7879
    7980cd lib/jelix/core-modules/jelix
    8081  module.xml
     
    178179  cruddfk_edit.tpl
    179180  cruddfk_view.tpl
    180181  defaultmain.tpl
     182  sitemap.tpl
     183  sitemapindex.tpl
     184
    181185cd lib/jelix/core-modules/jelix/templates/en_EN
    182186  check_install.tpl
    183187cd 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     * @param  array
     78     * @return void
     79     */
     80    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->_headSent = false;
     93        $this->_httpHeaders['Content-Type'] = 'application/xml;charset=UTF-8';
     94        $this->sendHttpHeaders();
     95        echo '<?xml version="1.0" encoding="UTF-8"?>', "\n";
     96
     97        if(!is_null($this->urlSitemap)) {
     98            echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
     99            $this->_headSent = true;
     100            $this->contentTpl = 'jelix~sitemapindex';
     101            $this->content->assign('sitemaps', $this->urlSitemap);
     102        }
     103        else {
     104            echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
     105            $this->_headSent = true;
     106            $this->content->assign('urls', $this->urlList);
     107        }
     108
     109        $this->content->display($this->contentTpl);
     110
     111        if ($this->hasErrors()) {
     112            echo $this->getFormatedErrorMsg();
     113        }
     114
     115        if(!is_null($this->urlSitemap)) {
     116            echo '</sitemapindex>';
     117        }
     118        else {
     119            echo '</urlset>';
     120        }
     121        return true;
     122    }
     123
     124    final public function outputErrors() {
     125        if (!$this->_headSent) {
     126            if (!$this->_httpHeadersSent) {
     127                header("HTTP/1.0 500 Internal Server Error");
     128                header('Content-Type: text/xml;charset=UTF-8');
     129            }
     130            echo '<?xml version="1.0" encoding="UTF-8"?>';
     131        }
     132
     133        echo '<errors xmlns="http://jelix.org/ns/xmlerror/1.0">';
     134        if ($this->hasErrors()) {
     135            echo $this->getFormatedErrorMsg();
     136        } else {
     137            echo '<error>Unknow Error</error>';
     138        }
     139        echo '</errors>';
     140    }
     141
     142    /**
     143     * Format error messages
     144     * @return string formated errors
     145     */
     146    protected function getFormatedErrorMsg() {
     147        $errors = '';
     148        foreach ($GLOBALS['gJCoord']->errorMessages  as $e) {
     149           $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";
     150        }
     151        return $errors;
     152    }
     153
     154    /**
     155     * add an URL in a sitemap file
     156     * @param string $loc URL of the page
     157     * @param string $lastmod The date of last modification of the file
     158     * @param string $changefreq How frequently the page is likely to change
     159     * @param string $priority The priority of this URL relative to other URLs
     160     * @return void
     161     */
     162    public function addUrl($loc, $lastmod = null, $changefreq = null, $priority = null) {
     163
     164        if(isset($loc[2048]) || count($this->urlList) >= $this->maxUrl) {
     165            return false;
     166        }
     167
     168        $url = new jSitemapUrl();
     169        $url->loc = 'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . $loc;
     170
     171        if(($timestamp = strtotime($lastmod))) {
     172            $url->lastmod = date('c', $timestamp);
     173        }
     174
     175        if($changefreq && in_array($changefreq, $this->allowedChangefreq)) {
     176            $url->changefreq = $changefreq;
     177        }
     178
     179        if($priority && (!is_numeric($priority) || $priority < 0 || $priority > 1)) {
     180            unset($priority);
     181        } elseif($priority) {
     182            $url->priority = sprintf('%0.1f', $priority);
     183        }
     184
     185        $this->urlList[] = $url;
     186    }
     187
     188    /**
     189     * add an URL in a sitemap file
     190     * @param string $loc URL of sitemap file
     191     * @param string $lastmod The date of last modification of the sitemap file
     192     * @return void
     193     */
     194    public function addSitemap($loc, $lastmod = null) {
     195
     196        if(isset($loc[2048]) || count($this->urlSitemap) >= $this->maxSitemap) {
     197            return false;
     198        }
     199
     200        $sitemap = new jSitemapIndex();
     201        $sitemap->loc = 'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . $loc;
     202
     203        if(($timestamp = strtotime($lastmod))) {
     204            $sitemap->lastmod = date('c', $timestamp);
     205        }
     206
     207        $this->urlSitemap[] = $sitemap;
     208    }
     209
     210    /**
     211     *
     212     */
     213    public function importFromUrlsXml()
     214    {
     215
     216    }
     217}
     218
     219/**
     220 * Content of an URL
     221 * @package    jelix
     222 * @subpackage core_response
     223 * @since 1.1RC1
     224 */
     225class jSitemapUrl {
     226
     227    /**
     228     * URL of the page
     229     * @var string
     230     */
     231    public $loc;
     232
     233    /**
     234     * The date of last modification of the page
     235     * @var string
     236     */
     237    public $lastmod;
     238
     239    /**
     240     * How frequently the page is likely to change
     241     * @var string
     242     */
     243    public $changefreq;
     244
     245    /**
     246     * The priority of this URL relative to other URLs
     247     * @var string
     248     */
     249    public $priority;
     250}
     251
     252/**
     253 * Content of a sitemap file
     254 * @package    jelix
     255 * @subpackage core_response
     256 * @since 1.2
     257 */
     258class jSitemapIndex {
     259
     260    /**
     261     * URL of the sitemap file
     262     * @var string
     263     */
     264    public $loc;
     265
     266    /**
     267     * The date of last modification of the sitemap file
     268     * @var string
     269     */
     270    public $lastmod;
     271}
     272 No newline at end of file
  • lib/jelix/core/defaultconfig.ini.php

     
    5555soap = jResponseSoap
    5656htmlfragment = jResponseHtmlFragment
    5757htmlauth = jResponseHtml
     58sitemap = jResponseSitemap
    5859
    5960[_coreResponses]
    6061html = jResponseHtml
     
    8182soap = jResponseSoap
    8283htmlfragment = jResponseHtmlFragment
    8384htmlauth = jResponseHtml
     85sitemap = jResponseSitemap
    8486
    8587[error_handling]
    8688messageLogFormat = "%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