b2evolution

Multilingual multiuser multiblog engine

b2evolution Technical Documentation (Version 2.4) [ class tree: main ] [ index: main ] [ all elements ]

Source for file _blog_main.inc.php

Documentation is available at _blog_main.inc.php

  1. <?php
  2. /**
  3.  * This file loads and initializes the blog to be displayed.
  4.  *
  5.  * This file is part of the b2evolution/evocms project - {@link http://b2evolution.net/}.
  6.  * See also {@link http://sourceforge.net/projects/evocms/}.
  7.  *
  8.  * @copyright (c)2003-2008 by Francois PLANQUE - {@link http://fplanque.net/}.
  9.  *  Parts of this file are copyright (c)2004-2005 by Daniel HAHLER - {@link http://thequod.de/contact}.
  10.  *
  11.  * @license http://b2evolution.net/about/license.html GNU General Public License (GPL)
  12.  *
  13.  *  {@internal Open Source relicensing agreement:
  14.  *  Daniel HAHLER grants Francois PLANQUE the right to license
  15.  *  Daniel HAHLER's contributions to this file and the b2evolution project
  16.  *  under any OSI approved OSS license (http://www.opensource.org/licenses/).
  17.  *  }}}
  18.  *
  19.  * @package main
  20.  *
  21.  *  {@internal Below is a list of authors who have contributed to design/coding of this file: }}
  22.  * @author blueyed: Daniel HAHLER
  23.  * @author fplanque: Francois PLANQUE
  24.  *
  25.  * @version $Id: _blog_main.inc.php,v 1.93.2.6 2009/03/23 12:26:09 tblue246 Exp $
  26.  */
  27.  
  28. if!defined('EVO_CONFIG_LOADED') ) die'Please, do not access this page directly.' );
  29.  
  30. /**
  31.  * Initialize everything:
  32.  */
  33. require_once dirname(__FILE__).'/_main.inc.php';
  34.  
  35. load_funcs('skins/_skin.funcs.php');
  36. load_class('items/model/_itemlist.class.php');
  37.  
  38. $Timer->start'_blog_main.inc' );
  39.  
  40. // Getting GET or POST parameters:
  41.  
  42. /*
  43.  * blog ID. This is a little bit special.
  44.  * If it has been explicitely memorized already, we don't touch it.
  45.  * Note: explicitely != auto_register_globals != stub file just setting it with $blog=x
  46.  * Note: stub files should probably memorize the param explicitely!
  47.  */
  48. ifparam_ismemorized('blog') )
  49. {    // Not explicitely memorized yet, get param from GET or auto_register_globals OR a stub $blog = x:
  50.     $Debuglog->add'blog param not memorized before _blog_main.inc''params' );
  51.     // We default to 0 here because the param should always be included in regenerate_url() when present.
  52.     // This will prevent weird indexing/search results in case the default changes after indexing.
  53.   // On some occasions, we'll manually filter it out of regenerate_url() because we know we go through a stub for example.
  54.     param'blog''integer'0true );
  55. }
  56.  
  57. // Getting current blog info:
  58. $BlogCache get_Cache'BlogCache' );
  59. /**
  60.  * @var Blog 
  61.  */
  62. $Blog $BlogCache->get_by_ID$blogfalse );
  63. ifempty$Blog ) )
  64. {
  65.     require $skins_path.'_404_blog_not_found.main.php'// error & exit
  66.     // EXIT.
  67. }
  68.  
  69. /*
  70.  * _______________________________ Locale / Charset for the Blog _________________________________
  71.  *
  72.     TODO: blueyed>> This should get moved as default to the locale detection in _main.inc.php,
  73.             as we only want to activate the I/O charset, which is probably the user's..
  74.             It prevents using a locale/charset in the front office, apart from the one given as default for the blog!!
  75. fp>there is no blog defined in _main and there should not be any
  76. blueyed> Sure, but that means we should either split it, or use the locale here only, if there's no-one given with higher priority.
  77. */
  78. // Activate matching locale:
  79. $Debuglog->add'Activating blog locale: '.$Blog->get('locale')'locale' );
  80. locale_activate$Blog->get('locale') );
  81.  
  82.  
  83. // Re-Init charset handling, in case current_charset has changed:
  84. ifinit_charsets$current_charset ) )
  85. {
  86.   // Reload Blog(s) (for encoding of name, tagline etc):
  87.   $BlogCache->clear();
  88.  
  89.   $Blog $BlogCache->get_by_ID$blog );
  90. }
  91.  
  92.  
  93. /*
  94.  * _____________________________ Extra path info decoding ________________________________
  95.  *
  96.  * This will translate extra path into 'regular' params.
  97.  *
  98.  * Decoding should try to work like this:
  99.  *
  100.  * baseurl/blog-urlname/junk/.../junk/post-title    -> points to a single post (no ending slash)
  101.  * baseurl/blog-urlname/junk/.../junk/p142          -> points to a single post
  102.  * baseurl/blog-urlname/2006/                       -> points to a yearly archive because of ending slash + 4 digits
  103.  * baseurl/blog-urlname/2006/12/                    -> points to a monthly archive
  104.  * baseurl/blog-urlname/2006/12/31/                 -> points to a daily archive
  105.  * baseurl/blog-urlname/2006/w53/                   -> points to a weekly archive
  106.  * baseurl/blog-urlname/junk/.../junk/chap-urlname/ -> points to a single chapter/category (because of ending slash)
  107.  * Note: category names cannot be named like this [a-z][0-9]+
  108.  */
  109. ifisset$resolve_extra_path ) ) $resolve_extra_path true}
  110. if$resolve_extra_path )
  111. {
  112.     // Check and Remove blog base URI from ReqPath:
  113.     $blog_baseuri substr$Blog->gen_baseurl()strlen$Blog->get('baseurlroot') ) );
  114.     $Debuglog->add'blog_baseuri: "'.$blog_baseuri.'"''params' );
  115.  
  116.     if( ($pos strpos$ReqPath$blog_baseuri )) !== false )
  117.     // note: $pos will typically be 0
  118.         $path_string substr$ReqPath$pos+strlen$blog_baseuri ) );
  119.  
  120.         $Debuglog->add'Extra path info found! path_string=' $path_string 'params' );
  121.         //echo "path=[$path_string]<br />";
  122.  
  123.         // Replace encoded ; and : with regular ; and : (used for tags)
  124.         $path_string str_replacearray'%3b''%3B''%3a''%3A' ),
  125.                                     array';'';'':'':' )$path_string );
  126.  
  127.         // Slice the path:
  128.         $path_split explode'/'$path_string20 );
  129.  
  130.         // Remove empty slots:
  131.         $path_elements array();
  132.         foreach$path_split as $path_element )
  133.         {
  134.             if!empty$path_element ) )
  135.             {
  136.                 $path_elements[$path_element;
  137.             }
  138.         }
  139.         // pre_dump( $path_elements );
  140.  
  141.         ifisset$path_elements[0&& preg_match'#.*\.php[0-9]?$#'$path_elements[0) )
  142.         // Ignore element ending with .php (fp: note: may be just '.php')
  143.             array_shift$path_elements );
  144.             $Debuglog->add'Ignoring *.php in extra path info' 'params' );
  145.         }
  146.  
  147.         ifisset$path_elements[0)
  148.                 && $path_elements[0== $Blog->stub
  149.                         || $path_elements[0== $Blog->urlname ) )
  150.         // Ignore stub file (if it ends with .php it should already have been filtered out above)
  151.             array_shift$path_elements );
  152.             $Debuglog->add'Ignoring stub filename OR blog urlname in extra path info' 'params' );
  153.         }
  154.         // pre_dump( $path_elements );
  155.  
  156.         $path_error 0;
  157.  
  158.         // Do we still have extra path info to decode?
  159.         ifcount($path_elements) )
  160.         {
  161.             // Does the pathinfo end with a / or a ; ?
  162.             $last_char substr$path_string-);
  163.             if$last_char == '-' || $last_char == ':'|| $last_char == ';' )
  164.             {    // - : or ; -> We'll consider this to be a tag page
  165.                 $last_part $path_elements[count($path_elements)-1];
  166.                 $tag substr$last_part0strlen($last_part)-);
  167.                 $tag urldecode($tag);
  168.                 $tag strip_tags($tag);    // security
  169.                 // pre_dump( $tag );
  170.  
  171.                 // # of posts per page:
  172.                  if$posts $Blog->get_setting'tag_posts_per_page' ) )
  173.                 // use blog default
  174.                     $posts $Blog->get_setting'posts_per_page' );
  175.                 }
  176.             }
  177.             elseif$last_char != '/' )
  178.             // NO ENDING SLASH -> We'll consider this to be a ref to a post:
  179.                 // Set a lot of defaults as if we had received a complex URL:
  180.                 $m '';
  181.                 $more 1// Display the extended entries' text
  182.                 $c 1;    // Display comments
  183.                 $tb 1;   // Display trackbacks
  184.                 $pb 1;   // Display pingbacks
  185.  
  186.                 $path_element $path_elements[count($path_elements)-1];
  187.                 ifpreg_match'#^p([0-9]+)$#'$path_element$req_post ) )
  188.                 // The last param is of the form p000
  189.                     // echo 'post number';
  190.                     $p $req_post[1];        // Post to display
  191.                 }
  192.                 else
  193.                 // Last param is a string, we'll consider this to be a post urltitle
  194.                     $title $path_element;
  195.                     // echo 'post title : ', $title;
  196.                 }
  197.             }
  198.             else
  199.             {    // ENDING SLASH -> we are looking for a daterange OR a chapter:
  200.  
  201.                 $last_part $path_elements[count($path_elements)-1];
  202.                 // echo $last_part;
  203.                 ifpreg_match'|^w?[0-9]+$|'$last_part ) )
  204.                 // Last part is a number or a "week" number:
  205.                     $i=0;
  206.                     // echo $path_elements[$i];
  207.                     ifisset$path_elements[$i) )
  208.                     {
  209.                         ifis_numeric$path_elements[$i) )
  210.                         // We'll consider this to be the year
  211.                             $m $path_elements[$i++];
  212.                             $Debuglog->add'Setting year from extra path info. $m=' $m 'params' );
  213.  
  214.                             // Also use the prefered posts per page for archives (may be NULL, in which case the blog default will be used later on)
  215.                             if$posts $Blog->get_setting'archive_posts_per_page' ) )
  216.                             // use blog default
  217.                                 $posts $Blog->get_setting'posts_per_page' );
  218.                             }
  219.  
  220.                             ifisset$path_elements[$i&& is_numeric$path_elements[$i) )
  221.                             // We'll consider this to be the month
  222.                                 $m .= $path_elements[$i++];
  223.                                 $Debuglog->add'Setting month from extra path info. $m=' $m 'params' );
  224.  
  225.                                 ifisset$path_elements[$i&& is_numeric$path_elements[$i) )
  226.                                 // We'll consider this to be the day
  227.                                     $m .= $path_elements[$i++];
  228.                                     $Debuglog->add'Setting day from extra path info. $m=' $m 'params' );
  229.                                 }
  230.                             }
  231.                             elseifisset$path_elements[$i&& substr$path_elements[$i]0== 'w' )
  232.                             // We consider this a week number
  233.                                 $w substr$path_elements[$i]1);
  234.                             }
  235.                         }
  236.                         else
  237.                         {    // We did not get a number/year...
  238.                             $path_error 404;
  239.                         }
  240.                     }
  241.                 }
  242.                 elseifpreg_match'|^[A-Za-z0-9\-_]+$|'$last_part ) )    // UNDERSCORES for catching OLD URLS!!!
  243.                 {    // We are pointing to a chapter/category:
  244.                     $ChapterCache get_Cache'ChapterCache' );
  245.                     /**
  246.                      * @var Chapter 
  247.                      */
  248.                     $Chapter $ChapterCache->get_by_urlname$last_partfalse );
  249.                     ifempty$Chapter ) )
  250.                     {    // We could not match a chapter...
  251.                         // We are going to consider this to be a post title with a misplaced trailing slash.
  252.                         // That happens when upgrading from WP for example.
  253.                         $title $last_part// Will be sought later
  254.                         $already_looked_into_chapters true;
  255.                     }
  256.                     else
  257.                     {    // We could match a chapter from the extra path:
  258.                         $cat $Chapter->ID;
  259.                         // Also use the prefered posts per page for a cat
  260.                         if$posts $Blog->get_setting'chapter_posts_per_page' ) )
  261.                         // use blog default
  262.                             $posts $Blog->get_setting'posts_per_page' );
  263.                         }
  264.                 }
  265.                 }
  266.                 else
  267.                 {    // We did not get anything we can decode...
  268.                     // echo 'neither number nor cat';
  269.                     $path_error 404;
  270.                 }
  271.             }
  272.         }
  273.  
  274.         if$path_error == 404 )
  275.         {    // The request points to something we won't be able to resolve:
  276.             require $skins_path.'_404_not_found.main.php'// error & exit
  277.         }
  278.     }
  279. }
  280.  
  281.  
  282. /*
  283.  * ____________________________ Query params ____________________________
  284.  *
  285.  * Note: if the params have been set by the extra-path-info above, param() will not touch them.
  286.  */
  287. param'p''integer'''true );              // Specific post number to display
  288. param'title''string'''true );                        // urtitle of post to display
  289. param'redir''string''yes'false );                // Do we allow redirection to canonical URL? (allows to force a 'single post' URL for commenting)
  290.  
  291. param'preview''integer'0true );         // Is this preview ?
  292. if$preview )
  293. // Ignore this hit
  294.     $Hit->ignore true;
  295. }
  296.  
  297. param'stats''integer');                                    // Deprecated but might still be used by spambots
  298. param'disp''string''posts'true );
  299.  
  300. // In case these were not set by the stub:
  301. if!isset($timestamp_min) ) $timestamp_min '';
  302. if!isset($timestamp_max) ) $timestamp_max '';
  303.  
  304.  
  305. /*
  306.  * ____________________________ Get specific Item if requested ____________________________
  307.  */
  308. if!empty($p|| !empty($title) )
  309. // We are going to display a single post
  310.     // Make sure the single post we're requesting (still) exists:
  311.     $ItemCache get_Cache'ItemCache' );
  312.     if!empty($p) )
  313.     {    // Get from post ID:
  314.         $Item $ItemCache->get_by_ID$pfalse );
  315.     }
  316.     else
  317.     {    // Get from post title:
  318.         $title preg_replace'/[^A-Za-z0-9_]/''-'$title );
  319.         $Item $ItemCache->get_by_urltitle$titlefalse );
  320.     }
  321.     ifempty$Item ) )
  322.     {    // Post doesn't exist!
  323.  
  324.         // fp> TODO: ->viewing_allowed() for draft, private, protected and deprecated...
  325.  
  326.         $title_fallback false;
  327.  
  328.         if!empty($title&& empty($already_looked_into_chapters) )
  329.         {    // Let's try to fall back to a category/chapter...
  330.             $ChapterCache get_Cache'ChapterCache' );
  331.             /**
  332.              * @var Chapter 
  333.              */
  334.             $Chapter $ChapterCache->get_by_urlname$titlefalse );
  335.             if!empty$Chapter ) )
  336.             {    // We could match a chapter from the extra path:
  337.                 $cat $Chapter->ID;
  338.                 $title_fallback true;
  339.                 $title NULL;
  340.                 // Also use the prefered posts per page for a cat
  341.                 if$posts $Blog->get_setting'chapter_posts_per_page' ) )
  342.                 // use blog default
  343.                     $posts $Blog->get_setting'posts_per_page' );
  344.                 }
  345.             }
  346.         }
  347.  
  348.         if!empty($title) )
  349.         {    // Let's try to fall back to a tag...
  350.             if$Blog->get_tag_post_count$title ) )
  351.             // We could match a tag from the extra path:
  352.                 $tag $title;
  353.                 $title_fallback true;
  354.                 $title NULL;
  355.             }
  356.         }
  357.  
  358.         if$title_fallback )
  359.         {    // We were not able to fallback to anythign meaningful:
  360.             require $skins_path.'_404_not_found.main.php'// error & exit
  361.         }
  362.     }
  363. }
  364.  
  365.  
  366. /*
  367.  * ____________________________ "Clean up" the request ____________________________
  368.  *
  369.  * Make sure that:
  370.  * 1) disp is set to "single" if single post requested
  371.  * 2) URL is canonical if:
  372.  *    - some content was requested in a weird/deprecated way
  373.  *    - or if content identifiers have changed
  374.  */
  375. if$stats || $disp == 'stats' )
  376. {    // This used to be a spamfest...
  377.     require $skins_path.'_410_stats_gone.main.php'// error & exit
  378.     // EXIT.
  379. }
  380. elseif!empty($preview) )
  381. {    // Preview
  382.     $disp 'single';
  383. }
  384. elseif$disp == 'posts' && !empty($Item) )
  385. // We are going to display a single post
  386.     if$Item->ptyp_ID == 1000 )
  387.     {
  388.         $disp 'page';
  389.     }
  390.     else
  391.     {
  392.         $disp 'single';
  393.     }
  394.  
  395.     if$redir == 'yes' )
  396.     // $redir=no here allows to force a 'single post' URL for commenting
  397.  
  398.         // Check if the post has 'redirected' status:
  399.         if$Item->status == 'redirected' )
  400.         {    // Redirect to the URL specified in the post:
  401.             $Debuglog->add'Redirecting to post URL ['.$Item->url.'].' );
  402.             header_redirect$Item->urltrue );
  403.         }
  404.  
  405.         // Check if we want to redirect to a canonical URL for the post
  406.         // Please document encountered problems.
  407.         if$Blog->get_setting'canonical_item_urls' && $redir == 'yes' )
  408.         {    // We want to redirect to the Item's canonical URL:
  409.  
  410.             $canonical_url $Item->get_permanent_url'''''&' );
  411.  
  412.             $requested_crop preg_replace'¤\?.*$¤'''$ReqHost.$ReqURI );
  413.             $canonical_crop preg_replace'¤\?.*$¤'''$canonical_url );
  414.             // pre_dump( $requested_crop, $canonical_crop );
  415.  
  416.             if$requested_crop != $canonical_crop )
  417.             {    // The requested URL does not look like the canonical URL for this post,
  418.                 // REDIRECT TO THE CANONICAL URL:
  419.                 // fp> TODO: we might be losing additional params, it would be better to keep them... (but we have redir=no for that)
  420.                 $Debuglog->add'Redirecting to canonical URL ['.$canonical_url.'].' );
  421.                 header_redirect$canonical_urltrue );
  422.                 // EXITED.
  423.             }
  424.         }
  425.     }
  426. }
  427.  
  428.  
  429. /*
  430.  * ______________________ DETERMINE WHICH SKIN TO USE FOR DISPLAY _______________________
  431.  */
  432.  
  433. // Check if a temporary skin has been requested (used for RSS syndication for example):
  434. param'tempskin''string'''true );
  435. if!empty$tempskin ) )
  436. // This will be handled like any other skin:
  437.     $skin $tempskin;
  438. }
  439.  
  440. ifisset$skin ) )
  441. {    // A skin has been requested by folder_name (url or stub):
  442.  
  443.     // Check validity of requested skin name:
  444.     ifpreg_match'~([^-A-Za-z0-9._]|\.\.)~'$skin ) )
  445.     {
  446.         debug_die'The requested skin name is invalid.' );
  447.     }
  448.     else if substr$skin0!= '_' /* not a feed skin */ && skin_exists$skin )
  449.               && skin_installed$skin ) )
  450.     {    // The requested skin is not a feed skin and exists in the file system, but isn't installed:
  451.         debug_diesprintfT_'The skin [%s] is not installed on this system.' ),
  452.                                 htmlspecialchars$skin ) ) );
  453.     }
  454.  
  455.     // EXPERIMENTAL:
  456.     load_class'skins/model/_skin.class.php' );
  457.     $Skin new Skin();
  458. }
  459. else
  460. // Use default skin from the database
  461.     $SkinCache get_cache'SkinCache' );
  462.     $Skin $SkinCache->get_by_ID$Blog->skin_ID );
  463.     $skin $Skin->folder;
  464. }
  465.  
  466. // Because a lot of bloggers will delete skins, we have to make this fool proof with extra checking:
  467. if!empty$skin && !skin_exists$skin ) )
  468. // We want to use a skin, but it doesn't exist!
  469.     $err_msg sprintfT_('The skin [%s] set for blog [%s] does not exist. It must be properly set in the <a %s>blog properties</a> or properly overriden in a stub file.'),
  470.         htmlspecialchars($skin),
  471.         $Blog->dget('shortname'),
  472.         'href="'.$admin_url.'?ctrl=coll_settings&amp;tab=skin&amp;blog='.$Blog->ID.'"' );
  473.     debug_die$err_msg );
  474. }
  475.  
  476.  
  477. $Timer->pause'_blog_main.inc');
  478.  
  479.  
  480. /*
  481.  * _______________________________ READY TO DISPLAY _______________________________
  482.  *
  483.  * At this point $skin holds the name of the skin we want to use, or '' for no skin!
  484.  */
  485.  
  486.  
  487. // Trigger plugin event:
  488. // fp> TODO: please doc with example of what this can be used for
  489. $Plugins->trigger_event'BeforeBlogDisplay'array('skin'=>$skin) );
  490.  
  491.  
  492. if!empty$skin ) )
  493. // We want to display with a skin now:
  494.  
  495.     if$skin_provided_by_plugin skin_provided_by_plugin($skin) )
  496.     {
  497.         $Plugins->call_method$skin_provided_by_plugin'DisplaySkin'$tmp_params array('skin'=>$skin) );
  498.     }
  499.     else
  500.     {
  501.         // Path for the current skin:
  502.         $ads_current_skin_path $skins_path.$skin.'/';
  503.  
  504.         $disp_handlers array(
  505.                 'arcdir'         => 'arcdir.main.php',
  506.                 'catdir'         => 'catdir.main.php',
  507.                 'comments'       => 'comments.main.php',
  508.                 'feedback-popup' => 'feedback_popup.main.php',
  509.                 'mediaidx'       => 'mediaidx.main.php',
  510.                 'msgform'        => 'msgform.main.php',
  511.                 'page'           => 'page.main.php',
  512.                 'posts'          => 'posts.main.php',
  513.                 'profile'        => 'profile.main.php',
  514.                 'single'         => 'single.main.php',
  515.                 'subs'           => 'subs.main.php',
  516.                 // All others will default to index.main.php
  517.             );
  518.  
  519.         if!empty($disp_handlers[$disp]) )
  520.         {
  521.             iffile_exists$disp_handler $ads_current_skin_path.$disp_handlers[$disp) )
  522.             {    // The skin has a customized page handler for this display:
  523.                 require $disp_handler;
  524.             }
  525.             elseif$disp_handlers[$disp== 'posts.main.php' && file_exists$disp_handler $ads_current_skin_path.'items.main.php' ) )
  526.             {    // Compatibility with skins < 2.2.0
  527.                 require $disp_handler;
  528.             }
  529.             elseif$disp_handlers[$disp== 'comments.main.php' && file_exists$disp_handler $ads_current_skin_path.'latestcom.tpl.php' ) )
  530.             {    // Compatibility with skins < 2.2.0
  531.                 require $disp_handler;
  532.             }
  533.             elseif$disp_handlers[$disp== 'feedback_popup.main.php' && file_exists$disp_handler $ads_current_skin_path.'feedback_popup.tpl.php' ) )
  534.             {    // Compatibility with skins < 2.2.0
  535.                 require $disp_handler;
  536.             }
  537.             else
  538.             {    // Use the default handler from the skins dir:
  539.                 require $ads_current_skin_path.'index.main.php';
  540.             }
  541.         }
  542.         else
  543.         {    // Use the default handler from the skins dir:
  544.             require $ads_current_skin_path.'index.main.php';
  545.         }
  546.     }
  547.  
  548.     // log the hit on this page (in case the skin hasn't already done so)
  549.     $Hit->log();
  550. }
  551. else
  552. {    // We don't use a skin. Hopefully the caller will do some displaying.
  553.     // Set a few vars with default values, just in case...
  554.     $ads_current_skin_path $htsrv_path;
  555.  
  556.     // We'll just return to the caller now... (if we have not used a skin, the caller should do the display after this)
  557. }
  558.  
  559.  
  560. /*
  561.  * $Log: _blog_main.inc.php,v $
  562.  * Revision 1.93.2.6  2009/03/23 12:26:09  tblue246
  563.  * (temp)skin param: Allow plugin-provided skins
  564.  *
  565.  * Revision 1.93.2.5  2009/03/18 19:10:12  tblue246
  566.  * Replace encoded : with regular : (tags).
  567.  *
  568.  * Revision 1.93.2.4  2009/03/14 18:38:00  tblue246
  569.  * (temp)skin param: Do not allow the use of not installed skins
  570.  *
  571.  * Revision 1.93.2.3  2009/01/12 23:37:28  fplanque
  572.  * bugfix
  573.  *
  574.  * Revision 1.93.2.2  2008/09/09 05:44:29  fplanque
  575.  * More tag URL options
  576.  * Enhanced URL resolution for categories and tags
  577.  *
  578.  * Revision 1.93.2.1  2008/02/11 23:51:58  fplanque
  579.  * MFH
  580.  *
  581.  * Revision 1.94  2008/02/11 23:48:14  fplanque
  582.  * tag URL decoding fux
  583.  *
  584.  * Revision 1.93  2008/01/21 09:35:23  fplanque
  585.  * (c) 2008
  586.  *
  587.  * Revision 1.92  2008/01/07 02:53:26  fplanque
  588.  * cleaner tag urls
  589.  *
  590.  * Revision 1.91  2008/01/04 23:18:11  blueyed
  591.  * Use preg_match instead of ereg; Move skin-does-not-exist debug_die further down
  592.  *
  593.  * Revision 1.90  2007/11/29 19:29:22  fplanque
  594.  * normalized skin filenames
  595.  *
  596.  * Revision 1.89  2007/11/25 14:28:17  fplanque
  597.  * additional SEO settings
  598.  *
  599.  * Revision 1.88  2007/10/06 21:26:16  fplanque
  600.  * WP url decoding compatibility + cleanup
  601.  *
  602.  * Revision 1.87  2007/09/28 09:28:36  fplanque
  603.  * per blog advanced SEO settings
  604.  *
  605.  * Revision 1.86  2007/09/10 15:35:23  fplanque
  606.  * .php in blog url fix
  607.  *
  608.  * Revision 1.85  2007/07/13 23:47:36  fplanque
  609.  * New start pages!
  610.  *
  611.  * Revision 1.84  2007/06/27 02:23:24  fplanque
  612.  * new default template for skins named index.main.php
  613.  *
  614.  * Revision 1.83  2007/06/26 02:40:53  fplanque
  615.  * security checks
  616.  *
  617.  * Revision 1.82  2007/06/25 10:58:50  fplanque
  618.  * MODULES (refactored MVC)
  619.  *
  620.  * Revision 1.81  2007/06/25 01:21:28  fplanque
  621.  * minor / interim
  622.  *
  623.  * Revision 1.80  2007/06/24 01:05:31  fplanque
  624.  * skin_include() now does all the template magic for skins 2.0.
  625.  * .disp.php templates still need to be cleaned up.
  626.  *
  627.  * Revision 1.79  2007/05/28 15:18:30  fplanque
  628.  * cleanup
  629.  *
  630.  * Revision 1.78  2007/05/13 22:02:06  fplanque
  631.  * removed bloated $object_def
  632.  *
  633.  * Revision 1.77  2007/05/08 00:54:31  fplanque
  634.  * public blog list as a widget
  635.  *
  636.  * Revision 1.76  2007/05/07 18:59:45  fplanque
  637.  * renamed skin .page.php files to .tpl.php
  638.  *
  639.  * Revision 1.75  2007/05/02 20:39:27  fplanque
  640.  * meta robots handling
  641.  *
  642.  * Revision 1.74  2007/04/26 00:11:04  fplanque
  643.  * (c) 2007
  644.  *
  645.  * Revision 1.73  2007/03/26 12:59:18  fplanque
  646.  * basic pages support
  647.  *
  648.  * Revision 1.72  2007/03/24 20:41:16  fplanque
  649.  * Refactored a lot of the link junk.
  650.  * Made options blog specific.
  651.  * Some junk still needs to be cleaned out. Will do asap.
  652.  *
  653.  * Revision 1.71  2007/03/18 01:39:54  fplanque
  654.  * renamed _main.php to main.page.php to comply with 2.0 naming scheme.
  655.  * (more to come)
  656.  *
  657.  * Revision 1.70  2007/03/18 00:31:18  fplanque
  658.  * Delegated MainList init to skin *pages* which need it.
  659.  *
  660.  * Revision 1.69  2007/03/12 00:03:47  fplanque
  661.  * And finally: the redirect action :)
  662.  *
  663.  * Revision 1.68  2007/01/28 17:50:54  fplanque
  664.  * started moving towards 2.0 skin structure
  665.  *
  666.  * Revision 1.67  2007/01/26 04:52:53  fplanque
  667.  * clean comment popups (skins 2.0)
  668.  *
  669.  * Revision 1.66  2007/01/23 08:17:49  fplanque
  670.  * another simplification...
  671.  *
  672.  * Revision 1.65  2007/01/23 08:07:16  fplanque
  673.  * Fixed blog URLs including urlnames
  674.  *
  675.  * Revision 1.64  2007/01/09 00:55:16  blueyed
  676.  * fixed typo(s)
  677.  *
  678.  * Revision 1.63  2007/01/08 02:11:55  fplanque
  679.  * Blogs now make use of installed skins
  680.  * next step: make use of widgets inside of skins
  681.  *
  682.  * Revision 1.62  2007/01/07 05:32:11  fplanque
  683.  * added some more DB skin handling (install+uninstall+edit properties ok)
  684.  * still useless though :P
  685.  * next step: discover containers in installed skins
  686.  *
  687.  * Revision 1.61  2006/12/28 18:31:30  fplanque
  688.  * prevent impersonating of blog in multiblog situation
  689.  *
  690.  * Revision 1.60  2006/12/26 00:55:58  fplanque
  691.  * wording
  692.  *
  693.  * Revision 1.59  2006/12/24 00:45:51  fplanque
  694.  * bugfix
  695.  *
  696.  * Revision 1.58  2006/12/18 00:56:16  fplanque
  697.  * non existent blog error handling
  698.  *
  699.  * Revision 1.57  2006/12/14 22:05:18  fplanque
  700.  * doc
  701.  *
  702.  * Revision 1.56  2006/12/14 21:54:52  blueyed
  703.  * todo
  704.  *
  705.  * Revision 1.55  2006/12/14 21:41:15  fplanque
  706.  * Allow different number of items in feeds than on site
  707.  *
  708.  * Revision 1.54  2006/12/14 21:35:05  fplanque
  709.  * block reordering tentative
  710.  *
  711.  * Revision 1.53  2006/12/14 20:57:55  fplanque
  712.  * Hum... this really needed some cleaning up!
  713.  *
  714.  * Revision 1.52  2006/12/05 00:39:56  fplanque
  715.  * fixed some more permalinks/archive links
  716.  *
  717.  * Revision 1.51  2006/12/04 21:25:18  fplanque
  718.  * removed user skin switching
  719.  *
  720.  * Revision 1.50  2006/12/04 18:16:50  fplanque
  721.  * Each blog can now have its own "number of page/days to display" settings
  722.  *
  723.  * Revision 1.49  2006/11/30 22:34:15  fplanque
  724.  * bleh
  725.  *
  726.  * Revision 1.48  2006/11/14 21:56:11  blueyed
  727.  * Debuglog-entry, when redirecting to $canonical_url
  728.  *
  729.  * Revision 1.47  2006/11/11 20:33:14  blueyed
  730.  * Moved BeforeBlogDisplay hook to after $skin has been determined
  731.  *
  732.  * Revision 1.46  2006/10/24 14:03:52  blueyed
  733.  * Type $c param ("Display comments?") to integer
  734.  *
  735.  * Revision 1.45  2006/10/08 22:59:30  blueyed
  736.  * Added GetProvidedSkins and DisplaySkin hooks. Allow for optimization in Plugins::trigger_event_first_return()
  737.  *
  738.  * Revision 1.44  2006/10/04 12:55:24  blueyed
  739.  * - Reload $Blog, if charset has changed for Blog locale
  740.  * - only update DB connection charset, if not forced with $db_config['connection_charset']
  741.  */
  742. ?>

Documentation generated on Sat, 06 Mar 2010 03:28:17 +0100 by phpDocumentor 1.4.2. This site is hosted and maintained by Daniel HAHLER (Contact).