Вход Регистрация
Файл: IPBMafia.ru_IPB_3.4.6_Final_Rus _Nulled/board/upload/ips_kernel/classCustomFields.php
Строк: 410
<?php

/**
 * <pre>
 * Invision Power Services
 * IP.Board v3.4.6
 * Custom fields library
 * Last Updated: $Date: 2013-10-14 17:55:18 -0400 (Mon, 14 Oct 2013) $
 * </pre>
 *
 * @author         $Author: rashbrook $
 * @copyright    (c) 2001 - 2009 Invision Power Services, Inc.
 * @license        http://www.invisionpower.com/company/standards.php#license
 * @package        IP.Board
 * @subpackage    Kernel
 * @link        http://www.invisionpower.com
 * @since        Thursday 8th May 2008 10:31
 * @version        $Revision: 12377 $
 *
 */
 
abstract class customFieldPlugin
{
    
/**
     * Custom field name
     *
     * @var        string
     */
    
public $name       = '';
    
    
/**
     * Custom field title
     *
     * @var        string
     */
    
public $title      = '';
    
    
/**
     * Custom field id
     *
     * @var        integer
     */
    
public $id         = 0;
    
    
/**
     * Custom field attributes
     *
     * @var        array
     */
    
public $attributes = array();
    
    
/**
     * Custom field value
     *
     * @var        array
     */
    
public $raw_data   = array();
    
    
/**
     * Custom field mode
     *
     * @var        string
     */
    
public $mode       = '';
    
    
/**
     * Allows you to treat a custom field type as a string, returning the current value of $this->parsed
     *
     * @see        getValue()
     * @return    @e string
     */        
    
public function __tostring()
    {
        return 
$this->getValue();
    }
    
    
/**
     * Gets the value of the field (the current value of $this->parsed)
     *
     * @return    @e string
     */        
    
public function getValue()
    {
        if( 
is_array( $this->parsed ) )
        {
            return 
implode( ", ", $this->parsed );            
        }
        else
        {
            return 
$this->parsed;
        }        
    }
    
    
/**
     * Creates an attribute string from an array
     *
     * @return    @e string
     */    
    
protected function _compileAttributes()
    {
        
$_attributes = '';
        
        if( 
is_array( $this->attributes ) )
        {
            foreach( 
$this->attributes as $k => $v )
            {
                
$_attributes .= " {$k}='{$v}'";
            }
        }
        
        return 
$_attributes;
    }
    
    
/**
     * Removes harmful html from display
     *
     * @var        string        String to make safe
     * @return    @e string
     */
    
protected function makeSafeForView( $t )
    {
        
$t = IPSText::htmlspecialchars( $t );
        
$t = preg_replace("/&amp;#([0-9]+);/s", "&#\1;", $t );
        
$t = nl2br( $t );
        
        return 
$t;
    }
    
    
/**
     * Format value for display in a form field
     *
     * @var        string        String to make safe
     * @return    @e string
     */    
    
protected function makeSafeForForm( $t )
    {
        return 
IPSText::htmlspecialchars( $t );
    }    
}

/**
 * Interface for custom fields
 *
 */
interface interfaceCustomFieldPlugin
{
    
/**
     * Format the field for display and store to $this->parsed
     *
     * @return    @e void
     */
    
public function edit();
    
    
/**
     * Format the field for viewing and store to $this->parsed
     *
     * @return    @e void
     */
    
public function view();
}

/**
 * Text input custom fields
 *
 */
class customFieldText extends customFieldPlugin implements interfaceCustomFieldPlugin
{
    
/**
     * Plugin type
     *
     * @var        string
     */
    
public $plugin_type = '';
    
    
/**
     * Value
     *
     * @var        string
     */
    
public $value       = '';
    
    
/**
     * Parsed value
     *
     * @var        string
     */
    
public $parsed      = '';
    
    
/**
     * CONSTRUCTOR
     *
     * @param    array     $field    Array of field data { id, type, title, attributes, value }
     * @param    string    $mode    Set to 'view' or 'edit'
     * @return    @e void
     */
    
public function __construct( $field, $mode )
    {    
        
/* INI */
        
$this->value       = $field['value'];
        
$this->plugin_type = $field['type'];
        
$this->name        = 'field_' . $field['id'];
        
$this->id          = $field['id'];
        
$this->title       = isset( $field['title'] ) ? $field['title'] : '';
        
$this->attributes  = isset( $field['attributes'] ) ? $field['attributes'] : '';
        
$this->raw_data    = $field;
        
$this->mode        = $mode;
        
        if( 
$mode == 'edit' )
        {
            
$this->edit();
        }
        else
        {
            
$this->view();
        }
    }
    
    
/**
     * Edit a field
     *
     * @return    @e void
     */
    
public function edit()
    {
        
/* Attributes */
        
$_attributes = $this->_compileAttributes();
                
        
/* Make Safe */
        
$this->value = $this->makeSafeForForm( $this->value );
    
        if( 
$this->plugin_type == 'input' )
        {
            
$this->parsed = "<input type='text' id='{$this->name}' size='40' class='input_text' name='{$this->name}' value='{$this->value}'{$_attributes}/>";
        }
        else
        {
            
$this->parsed = "<textarea id='{$this->name}' class='input_text' cols='60' rows='4' name='{$this->name}'{$_attributes}>{$this->value}</textarea>";
        }
    }
    
    
/**
     * View a field
     *
     * @return    @e void
     */    
    
public function view()
    {
        
/* Make Safe */
        
$this->value = $this->makeSafeForView( $this->value );
        
$this->parsed = $this->value;
    }
}

/**
 * Check boxes button custom fields
 *
 */
class customFieldCbox extends customFieldPlugin implements interfaceCustomFieldPlugin
{
    
/**
     * Plugin type
     *
     * @var        string
     */
    
public $plugin_type = 'radio';
    
    
/**
     * Value
     *
     * @var        string
     */
    
public $value       = '';
    
    
/**
     * Parsed value
     *
     * @var        string
     */
    
public $parsed      = '';

    
/**
     * Data
     *
     * @var        string
     */
    
public $data        = '';
    
    
/**
     * CONSTRUCTOR
     *
     * @param    array     $field    Array of field data { id, data, title, attributes, value }
     * @param    string    $mode    Set to 'view' or 'edit'
     * @return    @e void
     */
    
public function __construct( $field, $mode )
    {
        
/* INI */
        
$this->data       = $field['data'];
        
$this->value      = $field['value'];
        
$this->name       = 'field_' . $field['id'];
        
$this->id         = $field['id'];
        
$this->title      = isset($field['title']) ? $field['title'] : '';
        
$this->attributes = isset($field['attributes']) ? $field['attributes'] : '';
        
$this->raw_data   = $field;
        
$this->mode       = $mode;
        
        if( 
$mode == 'edit' )
        {
            
$this->edit();
        }
        else
        {
            
$this->view();
        }
    }
    
    
/**
     * Edit a field
     *
     * @return    @e void
     */
    
public function edit()
    {
        
/* INI */
        
$carray      = explode( '|', $this->data );
        
$def_values  = ( is_array( $this->value ) ) ? $this->value : explode( '|', $this->value );
        
$_attributes = $this->_compileAttributes();
        
        
#The first checkbox gets shifted over to the right due to the <label>, so add a linebreak to make them line up
        
$this->parsed .= "<!--<br />-->";
        
        
/* Make Safe */
        
foreach( $def_values as $k => $v  )
        {
            
$def_values[$k] = $this->makeSafeForForm( $v );
            if ( !
$v && $v != "0" ) { unset( $def_values[$k] ); }
        }        
        
        foreach( 
$carray as $entry )
        {
            
$value = explode( '=', $entry );
            
            
$ov = trim( $value[0] );
            
$td = trim( $value[1] );
                        
            if( 
count( $def_values ) && in_array( $ov, $def_values ) )
            {
                
$this->parsed .= "<span class='f'><input type='checkbox' class='input_check' id='{$this->name}_{$ov}' name='{$this->name}[$ov]' value='1' checked='checked'{$_attributes}/> $td</span>n";
            }
            else
            {
                
$this->parsed .= "<span class='f'><input type='checkbox' class='input_check' id='{$this->name}_{$ov}' name='{$this->name}[$ov]' value='1'{$_attributes}/> $td</span>n";
            }
        }
    }
    
    
/**
     * View a field
     *
     * @return    @e void
     */    
    
public function view()
    {
        
/* INI */
        
$carray      = explode( '|', $this->data );
        
$curr_values = ( is_array( $this->value ) ) ? $this->value : explode( '|', $this->value );
        
$parsed      = array();
        
        
/* Make Safe */
        
foreach( $curr_values as $k => $v  )
        {
            
$curr_values[$k] = $this->makeSafeForView( $v );
        }
    
        foreach( 
$carray as $entry )
        {
            
$value = explode( '=', $entry );
            
            if( 
in_array( trim( $value[0] ), $curr_values ) )
            {
                
$this->parsed[] = trim( $value[1] );
            }            
        }
    }
}

/**
 * Radio button custom fields
 *
 */
class customFieldRadio extends customFieldPlugin implements interfaceCustomFieldPlugin
{
    
/**
     * Plugin type
     *
     * @var        string
     */
    
public $plugin_type = 'radio';
    
    
/**
     * Value
     *
     * @var        string
     */
    
public $value       = '';
    
    
/**
     * Parsed value
     *
     * @var        string
     */
    
public $parsed      = '';

    
/**
     * Data
     *
     * @var        string
     */
    
public $data        = '';
    
    
/**
     * CONSTRUCTOR
     *
     * @param    array     $field    Array of field data { id, data, value, title, attributes }
     * @param    string    $mode    Set to 'view' or 'edit'
     * @return    @e void
     */
    
public function __construct( $field, $mode )
    {
        
/* INI */
        
$this->data       = $field['data'];
        
$this->value      = $field['value'];
        
$this->name       = 'field_' . $field['id'];
        
$this->id         = $field['id'];
        
$this->title      = isset($field['title']) ? $field['title'] : '';
        
$this->attributes = isset($field['attributes']) ? $field['attributes'] : '';
        
$this->raw_data   = $field;
        
$this->mode       = $mode;
        
        if( 
$mode == 'edit' )
        {
            
$this->edit();
        }
        else
        {
            
$this->view();
        }
    }
    
    
/**
     * Edit a field
     *
     * @return    @e void
     */
    
public function edit()
    {
        
/* Attributes */
        
$_attributes = $this->_compileAttributes();

        
$carray     = explode( '|', $this->data );

        foreach( 
$carray as $entry )
        {
            
$value = explode( '=', $entry );
            
            
$ov = trim( $value[0] );
            
$td = trim( $value[1] );
            
            
/* Make Safe */
            
$this->value = $this->makeSafeForForm( $this->value );            
            
            if( 
$this->value == $ov and $this->value != "" )
            {
                
$this->parsed .= "<span class='f'><input type='radio' class='input_radio' id='{$this->name}_{$ov}' name='{$this->name}' value='$ov' checked='checked'{$_attributes}/> $td</span>n";
            }
            else
            {
                
$this->parsed .= "<span class='f'><input type='radio' class='input_radio' id='{$this->name}_{$ov}' name='{$this->name}' value='$ov'{$_attributes}/> $td</span>n";
            }
        }
    }
    
    
/**
     * View a field
     *
     * @return    @e void
     */    
    
public function view()
    {
        
/* INI */
        
$carray      = explode( '|', $this->data );
        
$curr_values = ( is_array( $this->value ) ) ? $this->value : array( $this->value );
        
        
/* Make Safe */
        
foreach( $curr_values as $k => $v  )
        {
            
$curr_values[$k] = $this->makeSafeForView( $v );
        }
    
        foreach( 
$carray as $entry )
        {
            
$value = explode( '=', $entry );
            
            if( 
in_array( trim( $value[0] ), $curr_values ) )
            {
                
$this->parsed = trim( $value[1] );
            }            
        }        
    }
}

/**
 * Dropdown custom fields
 *
 */
class customFieldDrop extends customFieldPlugin implements interfaceCustomFieldPlugin
{
    
/**
     * Plugin type
     *
     * @var        string
     */
    
public $plugin_type = 'drop';
    
    
/**
     * Value
     *
     * @var        string
     */
    
public $value       = '';
    
    
/**
     * Parsed value
     *
     * @var        string
     */
    
public $parsed      = '';

    
/**
     * Data
     *
     * @var        string
     */
    
public $data        = '';
    
    
/**
     * Allow multi-input
     *
     * @var        boolean
     */
    
protected $multi       = false;
    
    
/**
     * CONSTRUCTOR
     *
     * @param    array    $field    Array of field data { id, data, value, multi, title, attributes }
     * @param    string    $mode    Set to 'view' or 'edit'
     * @return    @e void
     */
    
public function __construct( $field, $mode )
    {
        
/* INI */
        
$this->data        = $field['data'];
        
$this->value       = $field['value'];
        
$this->multi       = !empty( $field['multi'] ) ? 1 : 0;
        
$this->name        = $this->multi ? 'field_' . $field['id'] . '[]' : 'field_' . $field['id'];        
        
$this->id          = $field['id'];
        
$this->title       = isset( $field['title'] ) ? $field['title'] : '';
        
$this->attributes  = isset( $field['attributes'] ) ? $field['attributes'] : '';
        
$this->raw_data    = $field;
        
$this->mode        = $mode;
        
        if( 
$mode == 'edit' )
        {
            
$this->edit();
        }
        else
        {
            
$this->view();
        }
    }
    
    
/**
     * Edit a field
     *
     * @return    @e void
     */
    
public function edit()
    {
        
/* INI */
        
$carray      = explode( '|', $this->data );
        
$multi       = !empty( $this->multi ) ? " multiple='multiple'" : '';
        
$def_values  = ( is_array( $this->value ) ) ? $this->value : array( $this->value );
        
$_attributes = $this->_compileAttributes();
        
        
/* Make Safe */
        
foreach( $def_values as $k => $v  )
        {
            
$def_values[$k] = $this->makeSafeForForm( $v );
        }        
        
        
/* Start the select tag */
        
$this->parsed = "<select id='{$this->name}' class='input_select' name='{$this->name}'{$multi}{$_attributes}>n";
        
        foreach( 
$carray as $entry )
        {
            
$value = explode( '=', $entry );
            
            
$ov = trim( $value[0] );
            
$td = trim( $value[1] );
                        
            if( 
in_array( $ov, $def_values ) )
            {
                
$this->parsed .= "<option value='$ov' selected='selected'>$td</option>n";
            }
            else
            {
                
$this->parsed .= "<option value='$ov'>$td</option>n";
            }
        }
        
        
/* End the tag */
        
$this->parsed .= "</select>n";
    }
    
    
/**
     * View a field
     *
     * @return    @e void
     */    
    
public function view()
    {
        
/* INI */
        
$carray      = explode( '|', $this->data );
        
$curr_values = ( is_array( $this->value ) ) ? $this->value : array( $this->value );
        
        
/* Make Safe */
        
foreach( $curr_values as $k => $v  )
        {
            
$curr_values[$k] = $this->makeSafeForView( $v );
        }        
        
        foreach( 
$carray as $entry )
        {
            
$value = explode( '=', $entry );
            
            if( 
in_array( trim( $value[0] ), $curr_values ) )
            {
                
$this->parsed[] = trim( $value[1] );
            }            
        }
    }
}

/**
 * Primary custom fields class
 *
 */
class classCustomFields
{
    
/**
     * List of fields
     *
     * @var        array
     */    
    
protected $field_list     = array();
    
    
/**
     * Loaded plugins
     *
     * @var        array
     */
    
public $loaded_plugins = array();
    
    
/**
     * Mode
     *
     * @var        string
     */
    
protected $mode           = '';
    
    
/**
     * Custom Fields
     *
     * @var        array
     */    
    
public $cfields         = array();
    
    
/**
     * CONSTRUCTOR
     *
     * @param    array         Field data (expected params depend upon the type of custom field object you create)
     * @param    string        Mode
     * @return    @e void
     */    
    
public function __construct( $field_data, $mode='view' )
    {
        
/* Setup */
        
$this->field_list     = $field_data;
        
$this->mode         = $mode;

        
$this->loaded_plugins['drop']  = 'customFieldDrop';
        
$this->loaded_plugins['radio'] = 'customFieldRadio';
        
$this->loaded_plugins['text']  = 'customFielText';
        
$this->loaded_plugins['cbox']  = 'customFieldCbox';
        
        
/* Loop through and build custom fields */
        
foreach( $this->field_list as $field )
        {
            
$this->cfields[ $field['id'] ] = $this->parseField( $field );
        }
    }
    
    
/**
     * Returns an array of supported field types, each entry being ( type, human-readable string )
     *
     * @return    @e array
     */    
    
public function getFieldTypes()
    {
        return array( 
                        array( 
'drop'     , ipsRegistry::instance()->getClass('class_localization')->words['cf_drop'] ),
                        array( 
'cbox'     , ipsRegistry::instance()->getClass('class_localization')->words['cf_cbox'] ),
                        array( 
'radio'    , ipsRegistry::instance()->getClass('class_localization')->words['cf_radio'] ),
                        array( 
'input'    , ipsRegistry::instance()->getClass('class_localization')->words['cf_input'] ),
                        array( 
'textarea' , ipsRegistry::instance()->getClass('class_localization')->words['cf_textarea'] ),
                    );
    }
    
    
/**
     * Returns an array of supported field search types, each entry being ( type, human-readable string )
     *
     * @return    @e array
     */    
    
public function getFieldSearchTypes()
    {
        return array( 
                        array( 
'exact' , ipsRegistry::instance()->getClass('class_localization')->words['cf_search_exact'] ),
                        array( 
'loose' , ipsRegistry::instance()->getClass('class_localization')->words['cf_search_loose'] ),
                    );
    }
    
    
/**
     * Parses a submitted form for custom fields, returning an array with keys 'save_array' and 'errors'
     *
     * @param    array        Array of field data
     * @return    @e array
     */    
    
public function getFieldsToSave( $input_array )
    {
        
/* INI */
        
$save_data = array();
        
$errors    = array();

        
/* Loop through all the fields */
        
foreach( $this->field_list as $field )
        {
            
/* Submitted Value */
            
$submit_value = $this->formatTextToSave( $input_array[ 'field_' . $field['id'] ] );
            
            if( ! 
is_array( $submit_value ) )
            {
                
$submit_value = trim( $submit_value );
            }

            
/* Check for restrictions */
            
if( isset( $field['restrictions'] ) && is_array( $field['restrictions'] ) )
            {
                if( 
$field['type'] == 'input' OR $field['type'] == 'textarea' )
                {
                    
/* Size Restriction */
                    
if( $field['restrictions']['max_size'] && IPSText::mbstrlen( $submit_value ) > $field['restrictions']['max_size'] )
                    {
                        
$errors[ 'field_' . $field['id'] ][] = 'too_big';
                    }
                    
                    
/* Size Restriction */
                    
if( $field['restrictions']['min_size'] && IPSText::mbstrlen( $submit_value ) < $field['restrictions']['min_size'] )
                    {
                        
$errors[ 'field_' . $field['id'] ][] = 'too_small';
                    }
                }
                
                
/* Null restriction */
                
if( $field['restrictions']['not_null'] && ( (string)$submit_value !== '0' AND !$submit_value) )
                {
                    
$errors[ 'field_' . $field['id'] ][] = 'empty';
                }
                
                
/* Format Restriction */
                
if( $field['restrictions']['format'] && $submit_value )
                {
                    
$regex = str_replace( 'n', '\d', preg_quote( $field['restrictions']['format'], "#" ) );
                    
$regex = str_replace( 'a', '\w', $regex );
                    
                    if ( ! 
preg_match( "#^".$regex."$#iu", $submit_value ) )
                    {
                        
$errors[ 'field_' . $field['id'] ][] = 'invalid';
                    }
                }
                
                
/* Check box? */
                
if ( $field['type'] == 'cbox' )
                { 
                    if ( 
is_array( $input_array[ 'field_' . $field['id'] ] ) AND count( $input_array[ 'field_' . $field['id'] ] ) )
                    {
                        
$submit_value = '|' . implode( '|', array_keys( $input_array[ 'field_' . $field['id'] ] ) ) . '|';
                    }
                }
            }
            
            
/* Add to save */
            
$this->field_list[$field['id']]['value'] = $submit_value;
            
$save_data[ 'field_' . $field['id'] ]    = $submit_value;
        }
        
        return array( 
'save_array' => $save_data, 'errors' => $errors );
    }
    
    
/**
     * Parsed a field for display
     *
     * @param    array    $field        Array of field data
     * @param    string    [$mode]        View/Edit, or blank for class default
     * @return    @e object
     */    
    
protected function parseField( $field, $mode='' )
    {
        
/* INI */
        
$mode = ( $mode ) ? $mode : $this->mode;
        
        
/* Check the type of field */
        
if( isset( $this->loaded_plugins[$field['type']] ) && class_exists( $this->loaded_plugins[$field['type']] ) )
        {
            return new 
$this->loaded_plugins[$field['type']]( $field, $mode );
        }
        else
        {
            return new 
customFieldText( $field, $mode );
        }
    }
    
    
/**
     * Formats the content field for a textarea
     *
     * @param    string        Content to format
     * @return    @e string
     */    
    
public function formatContentForEdit( $c )
    {
        return 
str_replace( '|', "n", $c );
    }
    
    
/**
     * Formats the content field for saving in the database
     *
     * @param    string        Content to format
     * @return    @e string
     */    
    
public function formatContentForSave( $c )
    {
        
$c = str_replace( "r"   , "n", $c );
        
$c = str_replace( "&#39;", "'" , $c );

        return 
str_replace( "n", '|', str_replace( "nn", "n", trim($c) ) );
    }
    
    
/**
     * Foramts text for saving into the database
     *
     * @var        string        String to make safe
     * @return    @e string
     */
    
protected function formatTextToSave( $t )
    {
        if( 
is_array( $t ) )
        {
            foreach( 
$t as $k => $v )
            {
                
$v = str_replace( "<br>"  , "n", $v );
                
$v = str_replace( "<br />", "n", $v );
                
$v = str_replace( "&#39;" , "'" , $v );
                
                if ( @
get_magic_quotes_gpc() )
                {
                    
$v = stripslashes($v);
                }
                
                
$t[ $k ]    = $v;
            }
        }
        else
        {
            
$t = str_replace( "<br>"  , "n", $t );
            
$t = str_replace( "<br />", "n", $t );
            
$t = str_replace( "&#39;" , "'" , $t );
            
            if ( @
get_magic_quotes_gpc() )
            {
                
$t = stripslashes($t);
            }
        }
        
        return 
$t;
    }    
}
Онлайн: 1
Реклама