Seditio Source
Root |
./othercms/ips_4.3.4/applications/core/extensions/core/GroupForm/GroupSettings.php
<?php
/**
 * @brief        Group Form: Core
 * @author        <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
 * @copyright    (c) Invision Power Services, Inc.
 * @license        https://www.invisioncommunity.com/legal/standards/
 * @package        Invision Community
 * @since        25 Mar 2013
 */

namespace IPS\core\extensions\core\GroupForm;

/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
   
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
    exit;
}

/**
 * Group Form: Core
 */
class _GroupSettings
{
   
/**
     * Process Form
     *
     * @param    \IPS\Helpers\Form        $form    The form
     * @param    \IPS\Member\Group        $group    Existing Group
     * @return    void
     */
   
public function process( &$form, $group )
    {
       
/* Group title */
       
$form->addHeader( 'group_details' );
       
$form->add( new \IPS\Helpers\Form\Translatable( 'g_title', NULL, TRUE, array( 'app' => 'core', 'key' => ( !$group->g_id ) ? NULL : "core_group_{$group->g_id}" ) ) );
       
       
/* Group Icon */
       
$icon = NULL;
        if (
$group->g_icon )
        {
            try
            {
               
$icon = \IPS\File::get( 'core_Theme', $group->g_icon );
            }
            catch ( \
Exception $e ) { }
        }
       
$form->add( new \IPS\Helpers\Form\Upload( 'g_icon', $icon, FALSE, array( 'storageExtension' => 'core_Theme', 'allowedFileTypes' => array( 'gif', 'png', 'jpeg', 'jpg' ) ) ) );

       
/* Prefix/Suffix */
       
$form->add( new \IPS\Helpers\Form\Custom( 'g_prefixsuffix', array( 'prefix' => $group->prefix, 'suffix' => $group->suffix ), FALSE, array(
           
'getHtml'    => function( $element )
            {
               
$color = NULL;
                if (
preg_match( '/^<span style=\'color:#((?:(?:[a-f0-9]{3})|(?:[a-f0-9]{6})));\'>$/i', $element->value['prefix'], $matches ) and $element->value['suffix'] === '</span>' )
                {
                   
$color = $matches[1];
                   
$element->value['prefix'] = NULL;
                   
$element->value['suffix'] = NULL;
                }
                               
                return \
IPS\Theme::i()->getTemplate( 'members', 'core' )->prefixSuffix( $element->name, $color, $element->value['prefix'], $element->value['suffix'] );
            },
           
'formatValue' => function( $element )
            {
                if (
$element->value['prefix'] or $element->value['suffix'] )
                {
                    return array(
'prefix' => $element->value['prefix'], 'suffix' => $element->value['suffix'] );
                }
                elseif ( isset(
$element->value['color'] ) AND $element->value['color'] )
                {
                   
$color = mb_strtolower( $element->value['color'] );
                    if (
mb_substr( $color, 0, 1 ) !== '#' )
                    {
                       
$color = '#' . $color;
                    }
               
                    if( !
in_array( $color, array( '#fff', '#ffffff', '#000', '#000000' ) ) )
                    {
                        return array(
'prefix' => "<span style='color:{$color}'>", 'suffix' => '</span>' );
                    }
                }
               
                return array(
'prefix' => '', 'suffix' => '' );
            }
        ) ) );
       
        if (
$group->g_id != \IPS\Settings::i()->guest_group )
        {
           
$form->add( new \IPS\Helpers\Form\YesNo( 'g_promote_exclude', $group->g_id ? !$group->g_promote_exclude : FALSE, FALSE ) );
        }
       
       
/* Can access site? */
       
$form->addHeader( 'permissions' );
       
$tabs = array();
        foreach ( \
IPS\Application::allExtensions( 'core', 'GroupForm', FALSE ) as $key => $class )
        {
            if (
$key != 'core_GroupSettings' )
            {
               
$tabs[] = $form->id . '_tab_group__' . $key;
            }
        }

       
$form->add( new \IPS\Helpers\Form\YesNo( 'g_view_board', $group->g_id ? $group->g_view_board : TRUE, FALSE, array( 'togglesOn' => array_merge( $tabs, array( 'group_username', 'g_dohtml', 'g_use_search', "gbw_cannot_be_ignored", "{$form->id}_header_group_signatures", 'g_use_signatures', "{$form->id}_header_group_staff", 'g_access_offline', 'g_search_flood', 'gbw_cannot_be_ignored' ) ) ) ) );
       
$form->add( new \IPS\Helpers\Form\YesNo( 'g_access_offline', $group->g_access_offline, FALSE, array(), NULL, NULL, NULL, 'g_access_offline' ) );

       
/* Usernames */
       
if( $group->g_id != \IPS\Settings::i()->guest_group )
        {
           
$defaultValues = array(
               
$group->g_dname_changes,
               
$group->g_displayname_unit,
               
$group->g_bitoptions['gbw_displayname_unit_type'],
               
$group->g_dname_date ?: 1,
               
'canchange'        => (bool) $group->g_dname_changes,
               
'unlimited'        => ( $group->g_dname_changes == -1 AND !$group->g_dname_date ),
               
'always'        => ( !$group->g_dname_changes AND !$group->g_bitoptions['gbw_displayname_unit_type'] ),
            );

           
$form->add( new \IPS\Helpers\Form\Custom( 'group_username', $defaultValues, FALSE, array(
               
'getHtml' => function( $element )
                {
                    return \
IPS\Theme::i()->getTemplate( 'members' )->usernameChanges( $element->name, $element->value );
                },
               
'formatValue' => function( $element )
                {
                   
$value = $element->value;

                    if ( !isset(
$value['canchange'] ) OR !$value['canchange'] )
                    {
                       
$value[0] = 0;
                    }
                    else
                    {
                        if ( isset(
$value['unlimited'] ) AND $value['unlimited'] )
                        {
                           
$value[0] = -1;
                           
$value[3] = 0;
                        }
                        elseif ( !isset(
$value[0] ) )
                        {
                           
$value[0] = 0;
                        }
                       
                        if ( isset(
$value['always'] ) AND $value['always'] )
                        {
                           
$value[1] = 0;
                           
$value[2] = 0;
                        }
                    }

                    return
$value;
                },
               
'validate' => function( $element )
                {
                   
$value = $element->value;

                    if( ( isset(
$value[1] ) AND $value[1] < 0 ) OR ( isset( $value[2] ) AND $value[2] < 0 ) OR ( isset( $value[3] ) AND $value[3] < 0 ) )
                    {
                        throw new \
DomainException( 'only_positive_values' );
                    }
                }
            ),
NULL, NULL, NULL, 'group_username' ) );
        }
       
       
/* HTML */
       
$form->add( new \IPS\Helpers\Form\YesNo( 'g_dohtml', $group->g_dohtml, FALSE, array( 'togglesOn' => array( 'g_dohtml_warning' ) ), NULL, NULL, NULL, 'g_dohtml' ) );

       
/* Search */
       
if ( $group->canAccessModule( \IPS\Application\Module::get( 'core', 'search', 'front' ) ) )
        {
           
$form->add( new \IPS\Helpers\Form\Number( 'g_search_flood', $group->g_search_flood, FALSE, array( 'unlimited' => 0 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('seconds'), 'g_search_flood' ) );
        }
       
       
/* Privacy */
       
$form->addHeader( 'group_privacy' );
       
$form->add( new \IPS\Helpers\Form\YesNo( 'g_hide_online_list', $group->g_hide_online_list, FALSE, array(), NULL, NULL, NULL, 'g_hide_online_list' ) );
       
$form->add( new \IPS\Helpers\Form\YesNo( 'gbw_hide_group', !$group->g_bitoptions['gbw_hide_group'], FALSE, array(), NULL, NULL, NULL, 'gbw_hide_group' ) );
       
        if ( \
IPS\Settings::i()->ignore_system_on )
        {
           
$form->add( new \IPS\Helpers\Form\YesNo( 'can_be_ignored', $group->g_id ? ( !$group->g_bitoptions['gbw_cannot_be_ignored'] ) : TRUE, FALSE, array(), NULL, NULL, NULL, 'gbw_cannot_be_ignored' ) );
        }

       
/* Signatures */
       
if( \IPS\Settings::i()->signatures_enabled AND $group->g_id != \IPS\Settings::i()->guest_group )
        {
           
$form->addHeader( 'group_signatures' );
           
$signatureLimits = ( $group->g_id ) ? explode( ':', $group->g_signature_limits ) : array( 0, '', '', '', '', '' );
           
$form->add( new \IPS\Helpers\Form\YesNo( 'g_use_signatures', !$signatureLimits[0], FALSE, array( 'togglesOn' => array( 'g_signature_limit', 'g_sig_max_images', 'g_sig_max_image_size', 'g_sig_max_urls', 'g_sig_max_lines' ) ), NULL, NULL, NULL, 'g_use_signatures' ) );
           
$form->add( new \IPS\Helpers\Form\Custom( 'g_signature_limit', array( $group->g_sig_unit, $group->g_bitoptions['gbw_sig_unit_type'] ), FALSE, array( 'getHtml' => function( $element )
            {
                if( !isset(
$element->value[0] ) )
                {
                   
$element->value[0] = 0;
                }

                if( !isset(
$element->value[1] ) )
                {
                   
$element->value[1] = 0;
                }

                return \
IPS\Theme::i()->getTemplate( 'members' )->signatureLimits( $element->name, $element->value );
            } ),
NULL, NULL, NULL, 'g_signature_limit' ) );
           
           
/* We need a special check for 0 here, as that indicates the user is not allowed to use images at all - the ternary condition here will always show the field as "unlimited" in this case */
           
$form->add( new \IPS\Helpers\Form\Number( 'g_sig_max_images', ( $signatureLimits[1] OR (int) $signatureLimits[1] === 0 ) ? $signatureLimits[1] : '', FALSE, array( 'unlimited' => '' ), NULL, NULL, NULL, 'g_sig_max_images' ) );


           
$form->add( new \IPS\Helpers\Form\WidthHeight( 'g_sig_max_image_size', array( $signatureLimits[2] ?: '', $signatureLimits[3] ?: '' ), FALSE, array( 'unlimited' => array( '', '' ) ), NULL, NULL, NULL, 'g_sig_max_image_size' ) );
           
$form->add( new \IPS\Helpers\Form\Number( 'g_sig_max_urls', ( $signatureLimits[4] OR (int) $signatureLimits[4] === 0 ) ? $signatureLimits[4] : '', FALSE, array( 'unlimited' => '' ), NULL, NULL, NULL, 'g_sig_max_urls' ) );
           
$form->add( new \IPS\Helpers\Form\Number( 'g_sig_max_lines', ( $signatureLimits[5] OR (int) $signatureLimits[5] === 0 ) ? $signatureLimits[5] : '', FALSE, array( 'unlimited' => '' ), NULL, NULL, NULL, 'g_sig_max_lines' ) );
        }
    }
   
   
/**
     * Save
     *
     * @param    array                $values    Values from form
     * @param    \IPS\Member\Group    $group    The group
     * @return    void
     */
   
public function save( $values, &$group )
    {
       
/* Group title */
       
\IPS\Lang::saveCustom( 'core', "core_group_{$group->g_id}", $values['g_title'] );
       
       
/* Group Icon */
       
$group->g_icon = NULL;
        if (
$values['g_icon'] instanceof \IPS\File )
        {
           
$group->g_icon = (string) $values['g_icon'];
        }
       
       
/* Prefix/Suffix */
       
$group->prefix = $values['g_prefixsuffix']['prefix'];
       
$group->suffix = $values['g_prefixsuffix']['suffix'];

       
/* Group promotion */
       
if ( isset( $values['g_promote_exclude'] ) )
        {
           
$group->g_promote_exclude = !$values['g_promote_exclude'];
        }

       
/* Username changes */
       
if( $group->g_id != \IPS\Settings::i()->guest_group )
        {
           
$group->g_dname_changes = ( isset( $values['group_username']['canchange'] ) and $values['group_username']['canchange'] ) ? $values['group_username'][0] : 0;
           
$group->g_displayname_unit = ( isset( $values['group_username']['canchange'] ) ) ? (int) $values['group_username'][1] : 0;
           
$group->g_bitoptions['gbw_displayname_unit_type'] = ( isset( $values['group_username'][2] ) ) ? $values['group_username'][2] : 0;
           
$group->g_dname_date = ( isset( $values['group_username']['canchange'] ) ) ? $values['group_username'][3] : 1;
        }

       
/* Signatures */
       
if( \IPS\Settings::i()->signatures_enabled AND $group->g_id != \IPS\Settings::i()->guest_group )
        {
            if( isset(
$values['g_use_signatures'] ) )
            {
               
$group->g_signature_limits = implode( ':', array( (int) !$values['g_use_signatures'], $values['g_sig_max_images'], $values['g_sig_max_image_size'][0], $values['g_sig_max_image_size'][1], $values['g_sig_max_urls'], $values['g_sig_max_lines'] ) );

                if( !isset(
$values['g_signature_limit'][3] ) and $values['g_use_signatures'] )
                {
                   
$group->g_sig_unit = $values['g_signature_limit'][0];
                   
$group->g_bitoptions['gbw_sig_unit_type'] = $values['g_signature_limit'][1];
                }
                else
                {
                   
$group->g_sig_unit = 0;
                }
            }
            else
            {
               
$group->g_signature_limits = '0:::::';
               
$group->g_sig_unit = 0;
            }
        }
                       
       
/* Other */
       
$group->g_view_board = $values['g_view_board'];
       
$group->g_dohtml = isset( $values['g_dohtml'] ) ? $values['g_dohtml'] : FALSE;
        if ( isset(
$values['g_search_flood'] ) )
        {
           
$group->g_search_flood = $values['g_search_flood'];
        }
        if ( isset(
$values['g_hide_online_list'] ) )
        {
           
$group->g_hide_online_list = $values['g_hide_online_list'];
        }

        if ( isset(
$values['gbw_hide_group'] ) )
        {
           
$group->g_bitoptions['gbw_hide_group'] = !$values['gbw_hide_group'];
        }

       
$group->g_access_offline = $values['g_access_offline'];
        if ( isset(
$values['can_be_ignored'] ) )
        {
           
$group->g_bitoptions['gbw_cannot_be_ignored'] = !$values['can_be_ignored'];
        }
    }

   
/**
     * Delete
     *
     * @param    \IPS\Member\Group    $group    The group
     * @return    void
     */
   
public function delete( $group )
    {
        if (
$group->g_icon )
        {
            try
            {
                \
IPS\File::get( 'core_Theme', $group->g_icon )->delete();
            }
            catch( \
Exception $ex ) { }
        }
    }

   
/**
     * Copy Group
     *
     * @param    \IPS\Member\Group    $oldGroup    The old, just cloned group
     * @param    \IPS\Member\Group    $newGroup    The new group
     * @return    void
     */
   
public function cloneGroup( $oldGroup, $newGroup )
    {
        if (
$oldGroup->g_icon )
        {
                try
                {
                   
$icon = \IPS\File::get( 'core_Theme', $oldGroup->g_icon );
                   
$newIcon = \IPS\File::create( 'core_Theme', $icon->originalFilename, $icon->contents() );
                   
$newGroup->g_icon = (string) $newIcon;
                }
                catch ( \
Exception $e )
                {
                   
$newGroup->g_icon = NULL;
                }

           
$newGroup->save();
        }
    }
}