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

File 12-sitemap.4.diff, 12.7 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     * @param  array
     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->_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        } else {
     103            echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n";
     104            $this->_headSent = true;
     105            $this->content->assign('urls', $this->urlList);
     106        }
     107
     108        $this->content->display($this->contentTpl);
     109
     110        if ($this->hasErrors()) {
     111            echo $this->getFormatedErrorMsg();
     112        }
     113
     114        if (!is_null($this->urlSitemap)) {
     115            echo '</sitemapindex>';
     116        } else {
     117            echo '</urlset>';
     118        }
     119        return true;
     120    }
     121
     122    /**
     123     * output errors
     124     */
     125    final public function outputErrors() {
     126        if (!$this->_headSent) {
     127            if (!$this->_httpHeadersSent) {
     128                header("HTTP/1.0 500 Internal Server Error");
     129                header('Content-Type: text/xml;charset=UTF-8');
     130            }
     131            echo '<?xml version="1.0" encoding="UTF-8"?>';
     132        }
     133
     134        echo '<errors xmlns="http://jelix.org/ns/xmlerror/1.0">';
     135        if ($this->hasErrors()) {
     136            echo $this->getFormatedErrorMsg();
     137        } else {
     138            echo '<error>Unknow Error</error>';
     139        }
     140        echo '</errors>';
     141    }
     142
     143    /**
     144     * Format error messages
     145     * @return string formated errors
     146     */
     147    protected function getFormatedErrorMsg() {
     148        $errors = '';
     149        foreach ($GLOBALS['gJCoord']->errorMessages as $e) {
     150           $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";
     151        }
     152        return $errors;
     153    }
     154
     155    /**
     156     * add a URL in a sitemap file
     157     * @param string $loc URL of the page
     158     * @param string $lastmod The date of last modification of the file
     159     * @param string $changefreq How frequently the page is likely to change
     160     * @param string $priority The priority of this URL relative to other URLs
     161     * @return void
     162     */
     163    public function addUrl($loc, $lastmod = null, $changefreq = null, $priority = null) {
     164
     165        if (isset($loc[2048]) || count($this->urlList) >= $this->maxUrl) {
     166            return false;
     167        }
     168
     169        $url = new jSitemapUrl();
     170        $url->loc = 'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . $loc;
     171
     172        if (($timestamp = strtotime($lastmod))) {
     173            $url->lastmod = date('c', $timestamp);
     174        }
     175
     176        if ($changefreq && in_array($changefreq, $this->allowedChangefreq)) {
     177            $url->changefreq = $changefreq;
     178        }
     179
     180        if ($priority && is_numeric($priority) && $priority >= 0 && $priority <= 1) {
     181            $url->priority = sprintf('%0.1f', $priority);
     182        }
     183
     184        $this->urlList[] = $url;
     185    }
     186
     187    /**
     188     * add a URL in a sitemap file
     189     * @param string $loc URL of sitemap file
     190     * @param string $lastmod The date of last modification of the sitemap file
     191     * @return void
     192     */
     193    public function addSitemap($loc, $lastmod = null) {
     194
     195        if (isset($loc[2048]) || count($this->urlSitemap) >= $this->maxSitemap) {
     196            return false;
     197        }
     198
     199        $sitemap = new jSitemapIndex();
     200        $sitemap->loc = 'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . $loc;
     201
     202        if (($timestamp = strtotime($lastmod))) {
     203            $sitemap->lastmod = date('c', $timestamp);
     204        }
     205
     206        $this->urlSitemap[] = $sitemap;
     207    }
     208
     209    /**
     210     * Add URLs automatically from urls.xml
     211     * @return void
     212     */
     213    public function importFromUrlsXml() {
     214        $urls = $this->_parseUrlsXml();
     215        foreach ($urls as $url) {
     216            $this->addUrl($url);
     217        }
     218    }
     219
     220    /**
     221     * Return pathinfo URLs automatically from urls.xml
     222     * @return array
     223     */
     224    public function getUrlsFromUrlsXml() {
     225        return $this->_parseUrlsXml();
     226    }
     227
     228    /**
     229     * Set URL to ping for Google
     230     * @return boolean
     231     */
     232    public function pingGoogle($module) {
     233        return self::_ping('http://www.google.com/webmasters/tools/ping?sitemap=' .
     234                           'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . urlencode($module));
     235    }
     236
     237    /**
     238     * Set URL to ping for Yahoo
     239     * @return boolean
     240     */
     241    public function pingYahoo($module) {
     242        return self::_ping('http://search.yahooapis.com/SiteExplorerService/V1/updateNotification?appid=YahooDemo&url=' .
     243                           'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . urlencode($module));
     244    }
     245
     246    /**
     247     * Set URL to ping for Live Search
     248     * @return boolean
     249     */
     250    public function pingLive($module) {
     251        return self::_ping('http://webmaster.live.com/ping.aspx?siteMap=' .
     252                           'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . urlencode($module));
     253    }
     254
     255    /**
     256     * Set URL to ping for Ask
     257     * @return boolean
     258     */
     259    public function pingAsk($module) {
     260        return self::_ping('http://submissions.ask.com/ping?sitemap=' .
     261                           'http'. (empty($_SERVER['HTTPS']) ? '' : 's') .'://'. $_SERVER['HTTP_HOST'] . urlencode($module));
     262    }
     263
     264    /**
     265     * Submitting a sitemap by sending an HTTP request
     266     * @return boolean
     267     */
     268    protected function _ping($uri) {
     269        $parsed_url = parse_url($uri);
     270        if (!$parsed_url || !is_array($parsed_url)) {
     271            return false;
     272        }
     273        $http = new jHttp($parsed_url['host']);
     274        $http->get($parsed_url['path'] . '?' . $parsed_url['query']);
     275        if ($http->getStatus() != 200) {
     276            return false;
     277        }
     278        return true;
     279    }
     280
     281    /**
     282     * Parse urls.xml and return pathinfo URLs
     283     * @return array
     284     */
     285    protected function _parseUrlsXml() {
     286        global $gJConfig;
     287
     288        $urls = array();
     289        $significantFile = $gJConfig->urlengine['significantFile'];
     290        $entryPoint = $gJConfig->urlengine['defaultEntrypoint'];
     291        $snp = $gJConfig->urlengine['urlScriptIdenc'];
     292
     293        $file = JELIX_APP_TEMP_PATH.'compiled/urlsig/' . $significantFile .
     294                '.' . rawurlencode($entryPoint) . '.entrypoint.php';
     295
     296        if (file_exists($file)) {
     297            require $file;
     298            $dataParseUrl = $GLOBALS['SIGNIFICANT_PARSEURL'][$snp];
     299            foreach ($dataParseUrl as $k => $infoparsing) {
     300                if ($k == 0) {
     301                    continue;
     302                }
     303                if (preg_match('/^\!\^(.*)\$\!$/', $infoparsing[2], $matches)) {
     304                    $urls[] = $matches[1];
     305                }
     306            }
     307        }
     308        return $urls;
     309    }
     310}
     311
     312/**
     313 * Content of a URL
     314 * @package jelix
     315 * @subpackage core_response
     316 * @since 1.2
     317 */
     318class jSitemapUrl {
     319
     320    /**
     321     * URL of the page
     322     * @var string
     323     */
     324    public $loc;
     325
     326    /**
     327     * The date of last modification of the page
     328     * @var string
     329     */
     330    public $lastmod;
     331
     332    /**
     333     * How frequently the page is likely to change
     334     * @var string
     335     */
     336    public $changefreq;
     337
     338    /**
     339     * The priority of this URL relative to other URLs
     340     * @var string
     341     */
     342    public $priority;
     343}
     344
     345/**
     346 * Content of a sitemap file
     347 * @package    jelix
     348 * @subpackage core_response
     349 * @since 1.2
     350 */
     351class jSitemapIndex {
     352
     353    /**
     354     * URL of the sitemap file
     355     * @var string
     356     */
     357    public $loc;
     358
     359    /**
     360     * The date of last modification of the sitemap file
     361     * @var string
     362     */
     363    public $lastmod;
     364}
  • 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