Seditio Source
Root |
./othercms/b2evolution_7.2.3/inc/widgets/widgets/_subcontainer_row.widget.php
<?php
/**
 * This file implements the subcontainer Widget class, and it is used to embed a widget container into a widget
 *
 * This file is part of the evoCore framework - {@link http://evocore.net/}
 * See also {@link http://sourceforge.net/projects/evocms/}.
 *
 * @copyright (c)2003-2016 by Francois Planque - {@link http://fplanque.com/}
 *
 * {@internal License choice
 * - If you have received this file as part of a package, please find the license.txt file in
 *   the same folder or the closest folder above for complete license terms.
 * - If you have received this file individually (e-g: from http://evocms.cvs.sourceforge.net/)
 *   then you must choose one of the following licenses before using the file:
 *   - GNU General Public License 2 (GPL) - http://www.opensource.org/licenses/gpl-license.php
 *   - Mozilla Public License 1.1 (MPL) - http://www.opensource.org/licenses/mozilla1.1.php
 * }}
 *
 * @package evocore
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );

load_class( 'widgets/model/_widget.class.php', 'ComponentWidget' );

/**
 * ComponentWidget Class
 *
 * A ComponentWidget is a displayable entity that can be placed into a Container on a web page.
 *
 * @package evocore
 */
class subcontainer_row_Widget extends ComponentWidget
{
    var
$icon = 'cubes';

   
/**
     * Constructor
     */
   
function __construct( $db_row = NULL )
    {
       
// Call parent constructor:
       
parent::__construct( $db_row, 'core', 'subcontainer_row' );
    }


   
/**
     * Get help URL
     *
     * @return string URL
     */
   
function get_help_url()
    {
        return
get_manual_url( 'columns-subcontainers-widget' );
    }


   
/**
     * Get name of widget
     */
   
function get_name()
    {
        return
T_('Columns (Sub-Containers)');
    }


   
/**
     * Get a very short desc. Used in the widget list.
     */
   
function get_short_desc()
    {
        return
format_to_output( $this->disp_params['title'] );
    }


   
/**
     * Get short description
     */
   
function get_desc()
    {
        return
T_('Arrange several Sub-Containers into columns.');
    }


   
/**
     * Get definitions for editable params
     *
     * @param $params
     */
   
function get_param_definitions( $params )
    {
       
// Get options array with groups for collection and shared sub-containers:
       
$WidgetContainerCache = & get_WidgetContainerCache();
       
$subcontainers_options = $WidgetContainerCache->get_subcontainers_option_array( $this->get_container_param( 'skin_type' ) );

       
$widget_params =  array(
           
'title' => array(
               
'label' => T_('Block title'),
               
'size' => 60,
            ) );
        for(
$i = 1; $i <= 6; $i++ )
        {    
// 6 columns for widget containers:
           
$widget_params['column'.$i.'_container'] = array(
               
'label' => sprintf( T_('Sub-Container for Column %d'), $i ),
               
'note' => T_('This Sub-Container will hold the widgets/contents for this column.'),
               
'type' => 'select',
               
'options' => $subcontainers_options,
               
'defaultvalue' => ''
           
);
           
$widget_params['column'.$i.'_class'] = array(
               
'label' => sprintf( T_('CSS Classes for Column %d'), $i ),
               
'note' => T_('Use to determine column arrangement.'),
               
'size' => 60,
               
'defaultvalue' => 'col-lg-4 col-md-6 col-sm-6 col-xs-12'
           
);
        }

       
$r = array_merge( $widget_params, parent::get_param_definitions( $params ) );

        if( isset(
$r['allow_blockcache'] ) )
        {    
// Disable "allow blockcache":
           
$r['allow_blockcache']['defaultvalue'] = false;
           
$r['allow_blockcache']['disabled'] = 'disabled';
           
$r['allow_blockcache']['note'] = T_('This widget cannot be cached in the block cache.');
        }

        return
$r;
    }


   
/**
     * Update the DB based on previously recorded changes
     */
   
function dbupdate()
    {
        global
$DB;

       
$DB->begin();

       
$result = true;

        for(
$i = 1; $i <= 6; $i++ )
        {
            if(
$this->get_param( 'column'.$i.'_container' ) == '!create_new' )
            {    
// This is a request to create new sub-container:
               
$new_container_code = $this->create_auto_subcontainer( ' Column '.$i );
                if(
$new_container_code === false )
                {    
// Stop updating if some new container cannot be created:
                   
$result = false;
                    break;
                }
               
// Use new created sub-container for this updating widget:
               
$this->set( 'column'.$i.'_container', $new_container_code );
            }
        }

       
// Do update only if all requested sub-containers have been created successfully:
       
$result = $result && parent::dbupdate();

        if(
$result )
        {
           
$DB->commit();
        }
        else
        {
           
$DB->rollback();
        }

        return
$result;
    }


   
/**
     * Display the widget!
     *
     * @param array MUST contain at least the basic display params
     */
   
function display( $params )
    {
       
$this->init_display( $params );

       
// START DISPLAY:
       
echo $this->disp_params['block_start'];

       
// Display title if requested
       
$this->disp_title();

        echo
$this->disp_params['block_body_start'];

        echo
$this->disp_params['rwd_start'];

        if( isset(
$params['override_params_for_'.$this->code] ) )
        {    
// Use specific widget params if they are defined for this widget by code:
           
$params = array_merge( $params, $params['override_params_for_'.$this->code] );
        }

        for(
$i = 1; $i <= 6; $i++ )
        {
            if( empty(
$this->disp_params['column'.$i.'_container'] ) )
            {    
// Skip column without selected container:
               
continue;
            }

            echo
str_replace( '$wi_rwd_block_class$', $this->disp_params['column'.$i.'_class'], $this->disp_params['rwd_block_start'] );

           
// Display widget container of the column:
           
$this->display_column_container( $this->disp_params['column'.$i.'_container'], $params );

            echo
$this->disp_params['rwd_block_end'];
        }

        echo
$this->disp_params['rwd_end'];

        echo
$this->disp_params['block_body_end'];

        echo
$this->disp_params['block_end'];

        return
true;
    }


   
/**
     * Display widget container of one column
     *
     * @param string Sub-container code
     * @param array Params
     */
   
function display_column_container( $subcontainer_code, $params )
    {
        global
$Blog, $Timer, $displayed_subcontainers, $Session;

       
// Get container type "coll"/"shared" and real container code from stored value:
       
$code_data = explode( ':', $subcontainer_code, 2 );
        if(
count( $code_data ) != 2 || ! in_array( $code_data[0], array( 'coll', 'shared' ) ) )
        {    
// Invalid container code:
           
echo '<div class="alert alert-danger">'.'Widget "'.$this->get_name().'" has a wrong container code "'.$subcontainer_code.'".'.'</div>';
            return
false;
        }

       
$subcontainer_coll_ID = ( $code_data[0] == 'coll' ? $this->get_coll_ID() : NULL );
       
$subcontainer_code = $code_data[1];

       
// Get subcontainer name:
       
$WidgetContainerCache = & get_WidgetContainerCache();
       
$WidgetContainer = & $WidgetContainerCache->get_by_coll_skintype_code( $subcontainer_coll_ID, $this->get_container_param( 'skin_type' ), $subcontainer_code );
       
$subcontainer_name = $WidgetContainer ? $WidgetContainer->get( 'name' ) : $subcontainer_code;

        if( ! isset(
$displayed_subcontainers ) )
        {    
// Initialize the dispalyed subcontainers array at first usage:
            // Use this array to avoid embedded containers display in infinite loop
           
$displayed_subcontainers = array();
        }
        elseif(
in_array( $subcontainer_code, $displayed_subcontainers ) )
        {    
// Do not try do display the same subcontainer which were already displayed to avoid infinite display:
           
echo '<div class="alert alert-danger">'.sprintf( T_('Cannot include container "%s" because it would create an infinite loop.'), $subcontainer_name ).'</div>';
            return;
        }

       
// Add this subcontainer to the displayed_containers array:
       
$displayed_subcontainers[] = $subcontainer_code;

       
// Initialize params for current subcontainer:
       
$subcontainer_params = widget_container_customize_params( $params, $subcontainer_code, $subcontainer_name );

        echo
$subcontainer_params['container_start'];

       
// Get enabled widgets of the container:
       
$EnabledWidgetCache = & get_EnabledWidgetCache();
       
$container_widgets = & $EnabledWidgetCache->get_by_coll_container( $subcontainer_coll_ID, $subcontainer_code, true );

        if( ! empty(
$container_widgets ) )
        {
            foreach(
$container_widgets as $ComponentWidget )
            {    
// Let the Widget display itself (with contextual params):
               
$widget_timer_name = 'Widget->display('.$ComponentWidget->code.')';
               
$Timer->start( $widget_timer_name );
               
// Clear the display params in order to use new custom if they are defined for this widget from skin side by param "override_params_for_subcontainer_row":
                // (otherwise the params will be used from first initialized widget container by $subcontainer_code)
               
$ComponentWidget->disp_params = NULL;
               
$ComponentWidget->display_with_cache( $params );
               
$Timer->pause( $widget_timer_name );
            }
        }
        elseif(
is_logged_in() && $Session->get( 'designer_mode_'.$Blog->ID ) )
        {    
// Display text for empty container on designer mode:
           
echo '<div class="red">'.T_('Empty Sub-Container').'</div>';
        }

        echo
$subcontainer_params['container_end'];

       
// Remove the last item which must be this container from the end of the displayed containers:
       
array_pop( $displayed_subcontainers );
    }
}

?>