Seditio Source
Root |
./othercms/b2evolution_7.2.3/plugins/polls_plugin/_polls.plugin.php
<?php
/**
 * This file implements the Poll plugin for b2evolution
 *
 * b2evolution - {@link http://b2evolution.net/}
 * Released under GNU GPL License - {@link http://b2evolution.net/about/gnu-gpl-license}
 * @copyright (c)2003-2020 by Francois Planque - {@link http://fplanque.com/}
 *
 * @package plugins
 */
if( !defined('EVO_MAIN_INIT') ) die( 'Please, do not access this page directly.' );

/**
 * Renderer plugin that replaces [poll:nnn] with the same thing as the poll widget displays
 *
 * @package plugins
 */
class polls_plugin extends Plugin
{
    var
$code = 'evo_poll';
    var
$name = 'Polls';
    var
$priority = 65;
    var
$group = 'rendering';
    var
$short_desc;
    var
$long_desc;
    var
$version = '7.2.3';
    var
$number_of_installs = 1;


   
/**
     * Init
     */
   
function PluginInit( & $params )
    {
       
$this->short_desc = T_('Polls plugin');
       
$this->long_desc = T_('This is a basic poll plugin. Use it by entering [poll:nnn] into your post, where nnn is the ID of the poll.');
    }


   
/**
     * Define here default collection/blog settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::get_coll_setting_definitions()}.
     */
   
function get_coll_setting_definitions( & $params )
    {
       
$default_params = array_merge( $params, array(
               
'default_comment_rendering' => 'never',
               
'default_post_rendering' => 'opt-out'
           
) );

        return
parent::get_coll_setting_definitions( $default_params );
    }


   
/**
     * Define here default message settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_msg_setting_definitions( & $params )
    {
       
// set params to allow rendering for messages by default
       
$default_params = array_merge( $params, array( 'default_msg_rendering' => 'opt-out' ) );
        return
parent::get_msg_setting_definitions( $default_params );
    }


   
/**
     * Define here default email settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_email_setting_definitions( & $params )
    {
       
// set params to allow rendering for messages by default
       
$default_params = array_merge( $params, array( 'default_email_rendering' => 'opt-out' ) );
        return
parent::get_email_setting_definitions( $default_params );
    }


   
/**
     * Define here default shared settings that are to be made available in the backoffice.
     *
     * @param array Associative array of parameters.
     * @return array See {@link Plugin::GetDefaultSettings()}.
     */
   
function get_shared_setting_definitions( & $params )
    {
       
// set params to allow rendering for shared container widgets by default:
       
$default_params = array_merge( $params, array( 'default_shared_rendering' => 'never' ) );
        return
parent::get_shared_setting_definitions( $default_params );
    }


   
/**
     * Dummy placeholder. Without it the plugin would ne be considered to be a renderer...
     *
     * @see Plugin::RenderItemAsHtml
     */
   
function RenderItemAsHtml( & $params )
    {
        return
false;
    }


   
/**
     * Perform rendering of email
     *
     * @see Plugin::RenderEmailAsHtml()
     */
   
function RenderEmailAsHtml( & $params )
    {
       
$content = & $params['data'];

       
$params['check_code_block'] = true; // TRUE to find inline tags only outside of codeblocks

       
$content = $this->render_polls_data( $content, $params, 'email' );

        return
true;
    }


   
/**
     * Perform rendering
     *
     * @see Plugin::DisplayrItemAsHtml()
     */
   
function DisplayItemAsHtml( & $params )
    {
       
$content = & $params['data'];

       
$params['check_code_block'] = true; // TRUE to find inline tags only outside of codeblocks

       
$content = $this->render_polls_data( $content, $params );

        return
true;
    }


   
/**
     * Convert inline poll tags into HTML tags like:
     *    [poll:123] - Display a widget "Poll" with poll ID #123
     *    [poll:123:Panel Title] - Use custom panel title instead of default T_('Poll')
     *    [poll:123:-] - No title and panel are displayed at all
     *    [poll:123:Panel Title:Question message?] - Custom title + Replace poll question from DB with custom question text
     *    [poll:123:Panel Title:-] - Custom title + Hide question
     *    [poll:123:-:-] - Hide title + Hide question
     *
     * @param string Source content
     * @param array Params
     * @return string Content
     */
   
function render_polls_data( $content, $params = array(), $format = 'html' )
    {
        if( isset(
$params['check_code_block'] ) && $params['check_code_block'] && ( ( stristr( $content, '<code' ) !== false ) || ( stristr( $content, '<pre' ) !== false ) ) )
        {    
// Call $this->render_polls_data() on everything outside code/pre:
           
$params['check_code_block'] = false;
           
$content = callback_on_non_matching_blocks( $content,
               
'~<(code|pre)[^>]*>.*?</\1>~is',
                array(
$this, 'render_polls_data' ), array( $params ) );
            return
$content;
        }

       
// Find all matches with tags of poll data:
       
preg_match_all( '#\[poll:(\d+):?([^:\]]*):?([^:\]]*):?(.*?)\]#', $content, $tags );

        if(
count( $tags[0] ) > 0 )
        {    
// If at least one poll inline tag is found in content:

            // Initialize widget "Poll" in order to render poll blocks:
           
load_class( 'widgets/widgets/_poll.widget.php', 'poll_Widget' );
           
$poll_Widget = new poll_Widget();

            foreach(
$tags[0] as $t => $source_tag )
            {    
// Render poll inline tag as html with widget "Poll":
               
$poll_ID = $tags[1][$t];
               
$poll_title = ( empty( $tags[2][ $t ] ) ? T_('Poll') : $tags[2][ $t ] );
               
$poll_question = ( empty( $tags[3][ $t ] ) ? NULL : $tags[3][ $t ] );
               
$redirect_to = ( empty( $tags[4][ $t ] ) ? NULL : $tags[4][ $t ] );

               
// Display title only when it doesn't equal "-":
               
$display_title = ( $poll_title !== '-' );

               
ob_start();
                switch(
$format )
                {
                    case
'email':
                       
$this->render_email( array(
                               
'poll_ID'             => $poll_ID,
                               
'title'               => $poll_title,
                               
'poll_question'       => $poll_question,
                               
'redirect_to'         => $redirect_to,
                               
'block_display_title' => $display_title,
                               
'block_start'         => $display_title ? '<div>' : '',
                               
'block_end'           => $display_title ? '</div>' : '',
                               
'block_title_start'   => $display_title ? '<h3>' : '',
                               
'block_title_end'     => $display_title ? '</h3>' : '',
                               
'block_body_start'    => $display_title ? '<div>' : '',
                               
'block_body_end'      => $display_title ? '</div>' : '',
                            ) );
                        break;

                    case
'html':
                    default:
                       
$poll_Widget->display( array(
                               
'poll_ID'             => $poll_ID,
                               
'title'               => $poll_title,
                               
'poll_question'       => $poll_question,
                               
'block_display_title' => $display_title,
                               
'block_start'         => $display_title ? '<div class="panel panel-default">' : '',
                               
'block_end'           => $display_title ? '</div>' : '',
                               
'block_title_start'   => $display_title ? '<div class="panel-heading">' : '',
                               
'block_title_end'     => $display_title ? '</div>' : '',
                               
'block_body_start'    => $display_title ? '<div class="panel-body">' : '',
                               
'block_body_end'      => $display_title ? '</div>' : '',
                            ) );
                }
               
$poll_Widget->disp_params = NULL;

               
// Replace poll inline tag with the rendered poll html block:
               
$content = substr_replace( $content, ob_get_clean(), strpos( $content, $source_tag ), strlen( $source_tag ) );
            }
        }

        return
$content;
    }


   
/**
     * Event handler: Called when displaying editor toolbars on a post/item form.
     * This is for post/item edit forms only. Comments, PMs and emails use different events.
     *
     * @param array Associative array of parameters
     * @return boolean did we display a toolbar?
     */
   
function AdminDisplayToolbar( & $params )
    {
        if( ! empty(
$params['Item'] ) )
        {    
// Item is set, get Blog from post:
           
$edited_Item = & $params['Item'];
           
$Collection = $Blog = & $edited_Item->get_Blog();
        }

        if( empty(
$Blog ) )
        {    
// Item is not set, try global Blog:
           
global $Collection, $Blog;
            if( empty(
$Blog ) )
            {    
// We can't get a Blog, this way "apply_rendering" plugin collection setting is not available:
               
return false;
            }
        }

       
$apply_rendering = $this->get_coll_setting( 'coll_apply_rendering', $Blog );
        if( empty(
$apply_rendering ) || $apply_rendering == 'never' )
        {    
// Plugin is not enabled for current case, so don't display a toolbar:
           
return false;
        }

        return
$this->DisplayCodeToolbar( $params );
    }


   
/**
     * Event handler: Called when displaying editor toolbars on comment form.
     *
     * @param array Associative array of parameters
     * @return boolean did we display a toolbar?
     */
   
function DisplayCommentToolbar( & $params )
    {
        if( ! empty(
$params['Comment'] ) )
        {    
// Comment is set, get Blog from comment:
           
$Comment = & $params['Comment'];
            if( ! empty(
$Comment->item_ID ) )
            {
               
$comment_Item = & $Comment->get_Item();
               
$Collection = $Blog = & $comment_Item->get_Blog();
            }
        }

        if( empty(
$Blog ) )
        {    
// Comment is not set, try global Blog:
           
global $Collection, $Blog;
            if( empty(
$Blog ) )
            {    
// We can't get a Blog, this way "apply_comment_rendering" plugin collection setting is not available:
               
return false;
            }
        }

       
$apply_rendering = $this->get_coll_setting( 'coll_apply_comment_rendering', $Blog );
        if( empty(
$apply_rendering ) || $apply_rendering == 'never' )
        {    
// Plugin is not enabled for current case, so don't display a toolbar:
           
return false;
        }

       
// Print toolbar on screen
       
return $this->DisplayCodeToolbar( $params );
    }


   
/**
     * Event handler: Called when displaying editor toolbars for message.
     *
     * @param array Associative array of parameters
     * @return boolean did we display a toolbar?
     */
   
function DisplayMessageToolbar( & $params )
    {
       
$apply_rendering = $this->get_msg_setting( 'msg_apply_rendering' );
        if( ! empty(
$apply_rendering ) && $apply_rendering != 'never' )
        {    
// Print toolbar on screen:
           
return $this->DisplayCodeToolbar( $params );
        }
        return
false;
    }


   
/**
     * Event handler: Called when displaying editor toolbars for email.
     *
     * @param array Associative array of parameters
     * @return boolean did we display a toolbar?
     */
   
function DisplayEmailToolbar( & $params )
    {
       
$apply_rendering = $this->get_email_setting( 'email_apply_rendering' );
        if( ! empty(
$apply_rendering ) && $apply_rendering != 'never' )
        {    
// Print toolbar on screen:
           
return $this->DisplayCodeToolbar( $params );
        }
        return
false;
    }


   
/**
     * Display Toolbar
     *
     * @param array Params
     */
   
function DisplayCodeToolbar( $params = array() )
    {
        global
$Hit, $debug;

        if(
$Hit->is_lynx() )
        {
// let's deactive toolbar on Lynx, because they don't work there
           
return false;
        }

       
$params = array_merge( array(
               
'js_prefix' => '', // Use different prefix if you use several toolbars on one page
           
), $params );

       
// Load JS to work with textarea
       
require_js_defer( 'functions.js', 'blog', true );

       
// Load CSS for modal window
       
$this->require_css( 'polls.css', true );

       
// Initialize JavaScript to build and open window:
       
echo_modalwindow_js();

       
$js_config = array(
               
'prefix'               => $params['js_prefix'],
               
'plugin_code'          => $this->code,
               
'debug'                => $debug,

               
'toolbar_title_before' => format_to_js( $this->get_template( 'toolbar_title_before' ) ),
               
'toolbar_title_after'  => format_to_js( $this->get_template( 'toolbar_title_after' ) ),
               
'toolbar_group_before' => format_to_js( $this->get_template( 'toolbar_group_before' ) ),
               
'toolbar_group_after'  => format_to_js( $this->get_template( 'toolbar_group_after' ) ),
               
'toolbar_title'        => T_('Polls').':',
               
               
'button_title'         => T_('Insert a Poll'),
               
'button_value'         => T_('Insert a Poll'),
               
'button_class'         => $this->get_template( 'toolbar_button_class' ),
               
'modal_window_title'   => T_('Insert a Poll'),
            );

        if(
is_ajax_request() )
        {
           
?>
           <script>
                jQuery( document ).ready( function() {
                        window.evo_init_polls_toolbar( <?php echo evo_json_encode( $js_config ); ?> );
                    } );
            </script>
            <?php
       
}
        else
        {
           
expose_var_to_js( 'polls_toolbar_'.$params['js_prefix'], $js_config, 'evo_init_polls_toolbar_config' );
        }

        echo
$this->get_template( 'toolbar_before', array( '$toolbar_class$' => $params['js_prefix'].$this->code.'_toolbar' ) );
        echo
$this->get_template( 'toolbar_after' );

        return
true;
    }


   
/**
     * Render poll for email
     *
     * @param array Associative array of parameters
     */
   
function render_email( $params = array() )
    {
       
$PollCache = & get_PollCache();
       
$Poll = $PollCache->get_by_ID( $params['poll_ID'], false, false );

       
$poll_question = empty( $params['poll_question'] ) ? $Poll->get( 'question_text' ) : $params['poll_question'];
       
$poll_options = $Poll->get_poll_options();

        if(
count( $poll_options ) > 0 )
        {
            if(
$params['block_display_title'] )
            {
                echo
$params['block_title_start'].$params['title'].$params['block_title_end'];
            }
            echo
'<ul>'.$poll_question == '-' ? '' : '<b>'.$poll_question.'</b>';
            foreach(
$poll_options as $poll_option )
            {
               
$vote_url = get_htsrv_url().'action.php?mname=polls&action=email_vote&poll_ID='.$params['poll_ID'].'&poll_answer='.$poll_option->ID.'&email_ID=$mail_log_ID$&email_key=$email_key$';
                if( ! empty(
$params['redirect_to'] ) )
                {
                   
$vote_url = url_add_param( $vote_url, 'redirect_to='.rawurlencode( $params['redirect_to'] ) );
                }
                echo
'<li'.emailskin_style('li.evo_poll_option').'><a href="'.$vote_url.'">'.$poll_option->option_text.'</a></li>';
            }
            echo
'</ul>';
        }
    }
}
?>