b2evolution

Multilingual multiuser multiblog engine

b2evolution Technical Documentation (CVS HEAD) [ class tree: evocore ] [ index: evocore ] [ all elements ]

Source for file _widget.class.php

Documentation is available at _widget.class.php

  1. <?php
  2. /**
  3.  * This file implements the Widget class.
  4.  *
  5.  * This file is part of the evoCore framework - {@link http://evocore.net/}
  6.  * See also {@link http://sourceforge.net/projects/evocms/}.
  7.  *
  8.  * @copyright (c)2003-2010 by Francois PLANQUE - {@link http://fplanque.net/}
  9.  *
  10.  *  {@internal License choice
  11.  *  - If you have received this file as part of a package, please find the license.txt file in
  12.  *    the same folder or the closest folder above for complete license terms.
  13.  *  - If you have received this file individually (e-g: from http://evocms.cvs.sourceforge.net/)
  14.  *    then you must choose one of the following licenses before using the file:
  15.  *    - GNU General Public License 2 (GPL) - http://www.opensource.org/licenses/gpl-license.php
  16.  *    - Mozilla Public License 1.1 (MPL) - http://www.opensource.org/licenses/mozilla1.1.php
  17.  *  }}}
  18.  *
  19.  * @package evocore
  20.  *
  21.  *  {@internal Below is a list of authors who have contributed to design/coding of this file: }}
  22.  * @author fplanque: Francois PLANQUE.
  23.  *
  24.  * @version $Id: _widget.class.php,v 1.75 2010/02/08 17:54:47 efy-yury Exp $
  25.  */
  26. if!defined('EVO_MAIN_INIT') ) die'Please, do not access this page directly.' );
  27.  
  28. load_class'_core/model/dataobjects/_dataobject.class.php''DataObject' );
  29.  
  30. /**
  31.  * ComponentWidget Class
  32.  *
  33.  * A ComponentWidget is a displayable entity that can be placed into a Container on a web page.
  34.  *
  35.  * @package evocore
  36.  */
  37. class ComponentWidget extends DataObject
  38. {
  39.     var $coll_ID;
  40.     /**
  41.      * Container name
  42.      */
  43.     var $sco_name;
  44.     var $order;
  45.     /**
  46.      * @var string Type of the plugin ("core" or "plugin")
  47.      */
  48.     var $type;
  49.     var $code;
  50.     var $params;
  51.  
  52.     /**
  53.      * Indicates whether the widget is enabled.
  54.      *
  55.      * @var boolean 
  56.      */
  57.     var $enabled;
  58.  
  59.     /**
  60.      * Array of params which have been customized for this widget instance
  61.      *
  62.      * This is saved to the DB as a serialized string ($params)
  63.      */
  64.     var $param_array = NULL;
  65.  
  66.     /**
  67.      * Array of params used during display()
  68.      */
  69.     var $disp_params = NULL;
  70.  
  71.     /**
  72.      * Lazy instantiated
  73.      * (false if this Widget is not handled by a Plugin)
  74.      * @see get_Plugin()
  75.      * @var Plugin 
  76.      */
  77.     var $Plugin;
  78.  
  79.  
  80.     /**
  81.      * Constructor
  82.      *
  83.      * @param object data row from db
  84.      */
  85.     function ComponentWidget$db_row NULL$type 'core'$code NULL )
  86.     {
  87.         // Call parent constructor:
  88.         parent::DataObject'T_widget''wi_''wi_ID' );
  89.  
  90.         ifis_null($db_row) )
  91.         {    // We are creating an object here:
  92.             // Using parent:: instead of $this-> in order to fix http://forums.b2evolution.net//viewtopic.php?p=94778
  93.             parent::set'type'$type );
  94.             parent::set'code'$code );
  95.         }
  96.         else
  97.         {    // We are loading an object:
  98.             $this->ID       = $db_row->wi_ID;
  99.             $this->coll_ID  = $db_row->wi_coll_ID;
  100.             $this->sco_name = $db_row->wi_sco_name;
  101.             $this->type     = $db_row->wi_type;
  102.             $this->code     = $db_row->wi_code;
  103.             $this->params   = $db_row->wi_params;
  104.             $this->order    = $db_row->wi_order;
  105.             $this->enabled  = $db_row->wi_enabled;
  106.         }
  107.     }
  108.  
  109.  
  110.     /**
  111.      * Get ref to Plugin handling this Widget
  112.      *
  113.      * @return Plugin 
  114.      */
  115.     function get_Plugin()
  116.     {
  117.         global $Plugins;
  118.  
  119.         ifis_null$this->Plugin ) )
  120.         {
  121.             if$this->type != 'plugin' )
  122.             {
  123.                 $this->Plugin = false;
  124.             }
  125.             else
  126.             {
  127.                 $this->Plugin = $Plugins->get_by_code$this->code );
  128.             }
  129.         }
  130.  
  131.         return $this->Plugin;
  132.     }
  133.  
  134.  
  135.     /**
  136.      * Load params
  137.      */
  138.     function load_from_Request()
  139.     {
  140.         load_funcs('plugins/_plugin.funcs.php');
  141.  
  142.         // Loop through all widget params:
  143.         foreach$this->get_param_definitionsarray('for_editing'=>true) ) as $parname => $parmeta )
  144.         {
  145.             autoform_set_param_from_request$parname$parmeta$this'Widget' );
  146.         }
  147.     }
  148.  
  149.  
  150.     /**
  151.      * Get name of widget
  152.      *
  153.      * Should be overriden by core widgets
  154.      */
  155.     function get_name()
  156.     {
  157.         if$this->type == 'plugin' )
  158.         {
  159.             // Make sure Plugin is loaded:
  160.             if$this->get_Plugin() )
  161.             {
  162.                 return $this->Plugin->name;
  163.             }
  164.             return T_('Inactive / Uninstalled plugin');
  165.         }
  166.  
  167.         return T_('Unknown');
  168.     }
  169.  
  170.  
  171.     /**
  172.      * Get a very short desc. Used in the widget list.
  173.      *
  174.      * MAY be overriden by core widgets. Example: menu link widget.
  175.      */
  176.     function get_short_desc()
  177.     {
  178.         return $this->get_name();
  179.     }
  180.  
  181.  
  182.     /**
  183.      * Get a clean description to display in the widget list
  184.      */
  185.     function get_desc_for_list()
  186.     {
  187.         $name $this->get_name();
  188.  
  189.         if$this->type == 'plugin' )
  190.         {
  191.             return '<strong>'.$name.'</strong> ('.T_('Plugin').')';
  192.         }
  193.  
  194.         $short_desc $this->get_short_desc();
  195.  
  196.         if$name == $short_desc || empty($short_desc) )
  197.         {
  198.             return '<strong>'.$name.'</strong>';
  199.         }
  200.  
  201.         return '<strong>'.$short_desc.'</strong> ('.$name.')';
  202.     }
  203.  
  204.  
  205.     /**
  206.      * Get desc of widget
  207.      *
  208.      * Should be overriden by core widgets
  209.      */
  210.     function get_desc()
  211.     {
  212.         if$this->type == 'plugin' )
  213.         {
  214.             // Make sure Plugin is loaded:
  215.             if$this->get_Plugin() )
  216.             {
  217.                 return $this->Plugin->short_desc;
  218.             }
  219.             return T_('Inactive / Uninstalled plugin');
  220.         }
  221.  
  222.         return T_('Unknown');
  223.     }
  224.  
  225.  
  226.     /**
  227.      * Get definitions for editable params
  228.      *
  229.      * @see Plugin::GetDefaultSettings()
  230.      * @param local params like 'for_editing' => true
  231.      */
  232.     function get_param_definitions$params )
  233.     {
  234.         $r array(
  235.                 'widget_css_class' => array(
  236.                     'label' => '<span class="dimmed">'.T_'CSS Class' ).'</span>',
  237.                     'size' => 20,
  238.                     'note' => T_'Replaces $wi_class$ in your skins containers.'),
  239.                 ),
  240.                 'widget_ID' => array(
  241.                     'label' => '<span class="dimmed">'.T_'DOM ID' ).'</span>',
  242.                     'size' => 20,
  243.                     'note' => T_'Replaces $wi_ID$ in your skins containers.'),
  244.                 ),
  245.             );
  246.  
  247.         if$this->type == 'plugin' )
  248.         {
  249.             // Make sure Plugin is loaded:
  250.             if$this->get_Plugin() )
  251.             {
  252.                 $r array_merge$r$this->Plugin->get_widget_param_definitions$params ) );
  253.             }
  254.         }
  255.         return $r;
  256.     }
  257.  
  258.  
  259.     /**
  260.      * Load param array
  261.      */
  262.     function load_param_array()
  263.     {
  264.         ifis_null$this->param_array ) )
  265.         {    // Param array has not been loaded yet
  266.             $this->param_array = @unserialize$this->params );
  267.  
  268.             ifempty$this->param_array ) )
  269.             {    // No saved param values were found:
  270.                 $this->param_array = array();
  271.             }
  272.         }
  273.     }
  274.  
  275.  
  276.     /**
  277.       * param value
  278.       *
  279.      */
  280.     function get_param$parname )
  281.     {
  282.         $this->load_param_array();
  283.         ifisset$this->param_array[$parname) )
  284.         {    // We have a value for this param:
  285.             return $this->param_array[$parname];
  286.         }
  287.  
  288.         // Try default values:
  289.         $params $this->get_param_definitionsNULL );
  290.         ifisset$params[$parname]['defaultvalue') )
  291.         {    // We ahve a default value:
  292.             return $params[$parname]['defaultvalue';
  293.         }
  294.  
  295.         return NULL;
  296.     }
  297.  
  298.  
  299.     /**
  300.      * Set param value
  301.      *
  302.      * @param string parameter name
  303.      * @param mixed parameter value
  304.      * @param boolean true to set to NULL if empty value
  305.      * @return boolean true, if a value has been set; false if it has not changed
  306.      */
  307.     function set$parname$parvalue$make_null false )
  308.     {
  309.         $params $this->get_param_definitionsNULL );
  310.  
  311.         ifisset$params[$parname) )
  312.         {    // This is a widget specific param:
  313.             $this->param_array[$parname$parvalue;
  314.             // This is what'll be saved to the DB:
  315.             return $this->set_param'params''string'serialize($this->param_array)$make_null );
  316.         }
  317.  
  318.         switch$parname )
  319.         {
  320.             default:
  321.                 return $this->set_param$parname'string'$parvalue$make_null );
  322.         }
  323.     }
  324.  
  325.  
  326.     /**
  327.      * Prepare display params
  328.      *
  329.      * @todo Document default params and default values.
  330.      *        This might link to a wiki page, too.
  331.      *
  332.      * @param array MUST contain at least the basic display params
  333.      */
  334.     function init_display$params )
  335.     {
  336.         global $admin_url;
  337.  
  338.         if!is_null($this->disp_params) )
  339.         // Params have been initialized before...
  340.             return;
  341.         }
  342.  
  343.         // Generate widget defaults array:
  344.         $widget_defaults array();
  345.         $defs $this->get_param_definitionsarray() );
  346.         foreach$defs as $parname => $parmeta )
  347.         {
  348.             ifisset$parmeta['defaultvalue') )
  349.             {
  350.                 $widget_defaults$parname $parmeta['defaultvalue'];
  351.             }
  352.             else
  353.             {
  354.                 $widget_defaults$parname NULL;
  355.             }
  356.         }
  357.  
  358.         // Load DB configuration:
  359.         $this->load_param_array();
  360.  
  361.         // Merge basic defaults < widget defaults < container params < DB params
  362.         // note: when called with skin_widget it falls back to basic defaults < widget defaults < calltime params < array()
  363.         $params array_mergearray(
  364.                     'block_start' => '<div class="$wi_class$">',
  365.                     'block_end' => '</div>',
  366.                     'block_display_title' => true,
  367.                     'block_title_start' => '<h3>',
  368.                     'block_title_end' => '</h3>',
  369.                     'collist_start' => '',
  370.                     'collist_end' => '',
  371.                     'coll_start' => '<h4>',
  372.                     'coll_end' => '</h4>',
  373.                     'list_start' => '<ul>',
  374.                     'list_end' => '</ul>',
  375.                     'item_start' => '<li>',
  376.                     'item_end' => '</li>',
  377.                     'link_default_class' => 'default',
  378.                     'item_text_start' => '',
  379.                     'item_text_end' => '',
  380.                     'item_text' => '%s',
  381.                     'item_selected_start' => '<li class="selected">',
  382.                     'item_selected_end' => '</li>',
  383.                     'item_selected_text' => '%s',
  384.                     'grid_start' => '<table cellspacing="1" class="widget_grid">',
  385.                     'grid_end' => '</table>',
  386.                     'grid_nb_cols' => 2,
  387.                     'grid_colstart' => '<tr>',
  388.                     'grid_colend' => '</tr>',
  389.                     'grid_cellstart' => '<td>',
  390.                     'grid_cellend' => '</td>',
  391.                     'thumb_size' => 'crop-80x80',
  392.                     // 'thumb_size' => 'fit-160x120',
  393.                     'link_selected_class' => 'selected',
  394.                     'link_type' => 'canonic',        // 'canonic' | 'context' (context will regenrate URL injecting/replacing a single filter)
  395.                     'item_selected_text_start' => '',
  396.                     'item_selected_text_end' => '',
  397.                     'group_start' => '<ul>',
  398.                     'group_end' => '</ul>',
  399.                     'notes_start' => '<div class="notes">',
  400.                     'notes_end' => '</div>',
  401.                     'tag_cloud_start' => '<p class="tag_cloud">',
  402.                     'tag_cloud_end' => '</p>',
  403.                     'limit' => 100,
  404.                 )$widget_defaults$params$this->param_array );
  405.  
  406.         iffalse )
  407.         {    // DEBUG:
  408.             $params['block_start''<div class="debug_widget"><div class="debug_widget_name"><span class="debug_container_action"><a href="'
  409.                         .$admin_url.'?ctrl=widgets&amp;action=edit&amp;wi_ID='.$this->ID.'">Edit</a></span>'.$this->get_name().'</div><div class="$wi_class$">';
  410.             $params['block_end''</div></div>';
  411.         }
  412.  
  413.         // Customize params to the current widget:
  414.         // add additional css classes if required
  415.         $widget_css_class 'widget_'.$this->type.'_'.$this->code.empty$params'widget_css_class' '' ' '.$params'widget_css_class' );
  416.         // add custom id if required, default to generic id for validation purposes
  417.         $widget_ID !empty($params'widget_ID' ]$params'widget_ID' 'widget_'.$this->type.'_'.$this->code.'_'.$this->ID );
  418.         // replace the values
  419.         $this->disp_params = str_replacearray'$wi_ID$''$wi_class$' )array$widget_ID$widget_css_class )$params );
  420.     }
  421.  
  422.  
  423.     /**
  424.      * Display the widget!
  425.      *
  426.      * Should be overriden by core widgets
  427.      *
  428.      * @todo fp> handle custom params for each widget
  429.      *
  430.      * @param array MUST contain at least the basic display params
  431.      */
  432.     function display$params )
  433.     {
  434.         global $Blog;
  435.         global $Plugins;
  436.         global $rsc_url;
  437.  
  438.         $this->init_display$params )// just in case it hasn't been done before
  439.  
  440.         switch$this->type )
  441.         {
  442.             case 'plugin':
  443.                 // Call plugin (will return false if Plugin is not enabled):
  444.                 if$Plugins->call_by_code$this->code$this->disp_params ) )
  445.                 {
  446.                     return true;
  447.                 }
  448.                 // Plugin failed (happens when a plugin has been disabled for example):
  449.                 return false;
  450.         }
  451.  
  452.         echo "Widget $this->type : $this->code did not provide a display() method! ";
  453.  
  454.         return false;
  455.     }
  456.  
  457.  
  458.     /**
  459.      * Wraps display in a cacheable block.
  460.      *
  461.      * @todo dh> I think Widgets need to provide caching, e.g.
  462.      *            by returning something in cache_keys (so
  463.      *            ComponentWidget::get_cache_keys() should return
  464.      *            an empty list or false by default).
  465.      *  fp> I don't understand what you mean.
  466.      *
  467.      * @param array MUST contain at least the basic display params
  468.      * @param array of extra keys to be used for cache keying
  469.      */
  470.     function display_with_cache$params$keys array() )
  471.     {
  472.         global $Blog$Timer;
  473.  
  474.         $this->init_display$params );
  475.  
  476.         if$Blog->get_setting('cache_enabled_widgets') )
  477.         {    // We do NOT want caching for this collection
  478.             $this->display$params );
  479.         }
  480.         else
  481.         {    // Instantiate BlockCache:
  482.             $Timer->resume'BlockCache' );
  483.             // Extend cache keys:
  484.             $keys += $this->get_cache_keys();
  485.  
  486.             // TODO: dh> I think disp_params (after being processed in init_display) should get considered for the cache key, too.
  487.  
  488.             $this->BlockCache new BlockCache'widget'$keys );
  489.  
  490.             if$this->BlockCache->check() )
  491.             {    // Cache miss, we have to generate:
  492.                 $Timer->pause'BlockCache' );
  493.  
  494.                 $this->display$params );
  495.  
  496.                 // Save collected cached data if needed:
  497.                 $this->BlockCache->end_collect();
  498.             }
  499.  
  500.             $Timer->pause'BlockCache' );
  501.         }
  502.     }
  503.  
  504.  
  505.     /**
  506.      * Maybe be overriden by some widgets, depending on what THEY depend on..
  507.      *
  508.      * @return array of keys this widget depends on
  509.      */
  510.     function get_cache_keys()
  511.     {
  512.         global $Blog;
  513.  
  514.         return array(
  515.                 'wi_ID'   => $this->ID,                // Have the widget settings changed ?
  516.                 'set_coll_ID' => $Blog->ID,        // Have the settings of the blog changed ? (ex: new skin)
  517.             );
  518.     }
  519.  
  520.  
  521.     /**
  522.      * Note: a container can prevent display of titles with 'block_display_title'
  523.      * This is useful for the lists in the headers
  524.      * fp> I'm not sur if this param should be overridable by widgets themselves (priority problem)
  525.      * Maybe an "auto" setting.
  526.      *
  527.      * @protected
  528.      */
  529.     function disp_title$title NULL )
  530.     {
  531.         ifis_null($title) )
  532.         {
  533.             $title $this->disp_params['title'];
  534.         }
  535.  
  536.         if$this->disp_params['block_display_title'&& !empty$title ) )
  537.         {
  538.             echo $this->disp_params['block_title_start'];
  539.             echo format_to_output$title );
  540.             echo $this->disp_params['block_title_end'];
  541.         }
  542.     }
  543.  
  544.  
  545.     /**
  546.      * List of collections/blogs
  547.      *
  548.      * @param array MUST contain at least the basic display params
  549.      */
  550.     function disp_coll_list$filter 'public' )
  551.     {
  552.         /**
  553.          * @var Blog
  554.          */
  555.         global $Blog$baseurl;
  556.  
  557.         echo $this->disp_params['block_start'];
  558.  
  559.         $this->disp_title();
  560.  
  561.         /**
  562.          * @var BlogCache
  563.          */
  564.         $BlogCache get_BlogCache();
  565.  
  566.         if$filter == 'owner' )
  567.         {    // Load blogs of same owner
  568.             $blog_array $BlogCache->load_owner_blogs$Blog->owner_user_ID'ID' );
  569.         }
  570.         else
  571.         {    // Load all public blogs
  572.             $blog_array $BlogCache->load_public'ID' );
  573.         }
  574.  
  575.         // 3.3? if( $this->disp_params['list_type'] == 'list' )
  576.         // fp> TODO: init default value for $this->disp_params['list_type'] to avoid error
  577.         {
  578.             echo $this->disp_params['list_start'];
  579.  
  580.             foreach$blog_array as $l_blog_ID )
  581.             {    // Loop through all public blogs:
  582.  
  583.                 $l_Blog $BlogCache->get_by_ID$l_blog_ID );
  584.  
  585.                 if$Blog && $l_blog_ID == $Blog->ID )
  586.                 // This is the blog being displayed on this page:
  587.                 echo $this->disp_params['item_selected_start'];
  588.                     $link_class $this->disp_params['link_selected_class'];
  589.                 }
  590.                 else
  591.                 {
  592.                     echo $this->disp_params['item_start'];
  593.                     $link_class $this->disp_params['link_default_class'];;
  594.                 }
  595.  
  596.                 echo '<a href="'.$l_Blog->gen_blogurl().'" class="'.$link_class.'" title="'
  597.                                             .$l_Blog->dget'name''htmlattr' ).'">';
  598.  
  599.                 if$Blog && $l_blog_ID == $Blog->ID )
  600.                 // This is the blog being displayed on this page:
  601.                     echo $this->disp_params['item_selected_text_start'];
  602.                     printf$this->disp_params['item_selected_text']$l_Blog->dget'shortname''htmlbody' ) );
  603.                     echo $this->disp_params['item_selected_text_end'];
  604.                     echo '</a>';
  605.                     echo $this->disp_params['item_selected_end'];
  606.                 }
  607.                 else
  608.                 {
  609.                     echo $this->disp_params['item_text_start'];
  610.                     printf$this->disp_params['item_text']$l_Blog->dget'shortname''htmlbody' ) );
  611.                     echo $this->disp_params['item_text_end'];
  612.                     echo '</a>';
  613.                     echo $this->disp_params['item_end'];
  614.                 }
  615.             }
  616.  
  617.             echo $this->disp_params['list_end'];
  618.         }
  619.         /* 3.3?
  620.             Problems:
  621.             -In FF3/XP with skin evoCamp, I click to drop down and it already reloads the page on the same blog.
  622.             -Missing appropriate CSS so it displays at least half nicely in most of teh default skins
  623.         {
  624.             $select_options = '';
  625.             foreach( $blog_array as $l_blog_ID )
  626.             {    // Loop through all public blogs:
  627.                 $l_Blog = & $BlogCache->get_by_ID( $l_blog_ID );
  628.  
  629.                 // Add item select list:
  630.                 $select_options .= '<option value="'.$l_blog_ID.'"';
  631.                 if( $Blog && $l_blog_ID == $Blog->ID )
  632.                 {
  633.                     $select_options .= ' selected="selected"';
  634.                 }
  635.                 $select_options .= '>'.$l_Blog->dget( 'shortname', 'formvalue' ).'</option>'."\n";
  636.             }
  637.  
  638.             if( !empty($select_options) )
  639.             {
  640.                 echo '<form action="'.$baseurl.'" method="get">';
  641.                 echo '<select name="blog" onchange="this.form.submit();">'.$select_options.'</select>';
  642.                 echo '<noscript><input type="submit" value="'.T_('Go').'" /></noscript></form>';
  643.             }
  644.         }
  645.         */
  646.         echo $this->disp_params['block_end'];
  647.     }
  648.  
  649.  
  650.     /**
  651.      * Insert object into DB based on previously recorded changes.
  652.      *
  653.      * @return boolean true on success
  654.      */
  655.     function dbinsert()
  656.     {
  657.         global $DB;
  658.  
  659.         if$this->ID != )
  660.         {
  661.             debug_die'Existing object cannot be inserted!' );
  662.         }
  663.  
  664.         $DB->begin();
  665.  
  666.         $order_max $DB->get_var(
  667.             'SELECT MAX(wi_order)
  668.                  FROM T_widget
  669.                 WHERE wi_coll_ID = '.$this->coll_ID.'
  670.                     AND wi_sco_name = '.$DB->quote($this->sco_name)00'Get current max order' );
  671.  
  672.         $this->set'order'$order_max+);
  673.  
  674.         $res parent::dbinsert();
  675.  
  676.         $DB->commit();
  677.  
  678.         return $res;
  679.     }
  680.  
  681.  
  682.     /**
  683.      * Update the DB based on previously recorded changes
  684.      */
  685.     function dbupdate()
  686.     {
  687.         global $DB;
  688.  
  689.         parent::dbupdate();
  690.  
  691.         // This widget has been modified, cached content depending on it should be invalidated:
  692.         BlockCache::invalidate_key'wi_ID'$this->ID );
  693.     }
  694.  
  695. }
  696.  
  697.  
  698. /*
  699.  * $Log: _widget.class.php,v $
  700.  * Revision 1.75  2010/02/08 17:54:47  efy-yury
  701.  * copyright 2009 -> 2010
  702.  *
  703.  * Revision 1.74  2009/12/22 08:02:11  fplanque
  704.  * doc
  705.  *
  706.  * Revision 1.73  2009/12/22 03:31:10  blueyed
  707.  * todo about cachable block handling
  708.  *
  709.  * Revision 1.72  2009/12/06 18:07:43  fplanque
  710.  * Fix simplified list widgets.
  711.  *
  712.  * Revision 1.71  2009/12/01 04:19:25  fplanque
  713.  * even more invalidation dimensions
  714.  *
  715.  * Revision 1.70  2009/12/01 03:45:37  fplanque
  716.  * multi dimensional invalidation
  717.  *
  718.  * Revision 1.69  2009/11/30 23:27:13  fplanque
  719.  * added a dimension to cache invalidation
  720.  *
  721.  * Revision 1.68  2009/11/30 23:16:24  fplanque
  722.  * basic cache invalidation is working now
  723.  *
  724.  * Revision 1.67  2009/11/30 04:31:38  fplanque
  725.  * BlockCache Proof Of Concept
  726.  *
  727.  * Revision 1.66  2009/10/03 21:00:50  tblue246
  728.  * Bugfixes
  729.  *
  730.  * Revision 1.65  2009/09/26 12:00:44  tblue246
  731.  * Minor/coding style
  732.  *
  733.  * Revision 1.64  2009/09/25 07:33:15  efy-cantor
  734.  * replace get_cache to get_*cache
  735.  *
  736.  * Revision 1.63  2009/08/30 17:27:03  fplanque
  737.  * better NULL param handling all over the app
  738.  *
  739.  * Revision 1.62  2009/08/06 14:55:45  fplanque
  740.  * doc
  741.  *
  742.  * Revision 1.61  2009/08/03 13:19:11  tblue246
  743.  * Fixed http://forums.b2evolution.net//viewtopic.php?p=94778
  744.  *
  745.  * Revision 1.60  2009/07/02 21:50:13  fplanque
  746.  * commented out unfinished code
  747.  *
  748.  * Revision 1.59  2009/06/18 07:36:06  yabs
  749.  * bugfix : $type is already a param ;)
  750.  *
  751.  * Revision 1.58  2009/05/28 06:49:05  sam2kb
  752.  * Blog list widget can be either a "regular list" or a "select menu"
  753.  * See http://forums.b2evolution.net/viewtopic.php?t=18794
  754.  *
  755.  * Revision 1.57  2009/04/02 22:55:50  blueyed
  756.  * ComponentWidget::disp_coll_list: add 'item_text' and 'item_selected_text' params, where %s gets replaced by theshort name. ('%s' being the default)
  757.  *
  758.  * Revision 1.56  2009/03/15 22:48:16  fplanque
  759.  * refactoring... final step :)
  760.  *
  761.  * Revision 1.55  2009/03/15 20:35:18  fplanque
  762.  * Universal Item List proof of concept
  763.  *
  764.  * Revision 1.54  2009/03/14 03:28:00  fplanque
  765.  * tiny cleanup
  766.  *
  767.  * Revision 1.53  2009/03/14 03:02:56  fplanque
  768.  * Moving towards an universal item list widget, step 1
  769.  *
  770.  * Revision 1.52  2009/03/13 02:32:07  fplanque
  771.  * Cleaned up widgets.
  772.  * Removed stupid widget_name param.
  773.  *
  774.  * Revision 1.51  2009/03/13 00:54:38  fplanque
  775.  * calling it "sidebar links"
  776.  *
  777.  * Revision 1.50  2009/03/08 23:57:46  fplanque
  778.  * 2009
  779.  *
  780.  * Revision 1.49  2009/03/04 01:19:41  fplanque
  781.  * doc
  782.  *
  783.  * Revision 1.48  2009/02/25 17:18:03  waltercruz
  784.  * Linkroll stuff, take #2
  785.  *
  786.  * Revision 1.47  2009/02/23 08:14:16  yabs
  787.  * Added check for excerpts
  788.  *
  789.  * Revision 1.46  2009/02/22 23:40:09  fplanque
  790.  * dirty links widget :/
  791.  *
  792.  * Revision 1.45  2009/02/22 14:42:03  waltercruz
  793.  * A basic implementation that merges disp_cat_item_list2(links) and disp_cat_item_list(linkblog). Will delete disp_cat_item_list2 as soon fplanque says that the merge it's ok
  794.  *
  795.  * Revision 1.44  2009/02/22 14:15:48  waltercruz
  796.  * updating docs
  797.  *
  798.  * Revision 1.43  2009/02/21 22:22:23  fplanque
  799.  * eeeeeeek!
  800.  *
  801.  * Revision 1.42  2009/02/07 11:09:00  yabs
  802.  * extra settings for linkblog
  803.  *
  804.  * Revision 1.41  2009/02/05 21:33:34  tblue246
  805.  * Allow the user to enable/disable widgets.
  806.  * Todo:
  807.  *     * Fix CSS for the widget state bullet @ JS widget UI.
  808.  *     * Maybe find a better solution than modifying get_Cache() to get only enabled widgets... :/
  809.  *     * Buffer JS requests when toggling the state of a widget??
  810.  *
  811.  * Revision 1.40  2009/01/24 00:43:25  waltercruz
  812.  * bugfix
  813.  *
  814.  * Revision 1.39  2009/01/24 00:29:27  waltercruz
  815.  * Implementing links in the blog itself, not in a linkblog, first attempt
  816.  *
  817.  * Revision 1.38  2008/09/24 08:44:12  fplanque
  818.  * Fixed and normalized order params for widgets (Comments not done yet)
  819.  *
  820.  * Revision 1.37  2008/09/23 09:04:33  fplanque
  821.  * moved media index to a widget
  822.  *
  823.  * Revision 1.36  2008/06/30 20:46:05  blueyed
  824.  * Fix indent
  825.  *
  826.  * Revision 1.35  2008/04/24 02:01:04  fplanque
  827.  * experimental
  828.  *
  829.  * Revision 1.34  2008/02/08 22:24:46  fplanque
  830.  * bugfixes
  831.  *
  832.  * Revision 1.33  2008/01/21 09:35:36  fplanque
  833.  * (c) 2008
  834.  *
  835.  * Revision 1.32  2008/01/19 14:17:27  yabs
  836.  * bugfix : http://forums.b2evolution.net/viewtopic.php?t=13868
  837.  *
  838.  * Revision 1.31  2008/01/12 18:21:50  blueyed
  839.  *  - use $timestamp_min, $timestamp_max for ItemListLight instances (fixes displaying of posts from the future in coll_post_list widget
  840.  * - typo, todo, fix indent
  841.  */
  842. ?>

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