Seditio Source
Root |
./othercms/ips_4.3.4/applications/core/sources/StaffDirectory/User.php
<?php
/**
 * @brief        Staff Directory User Node
 * @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        18 Sep 2013
 */

namespace IPS\core\StaffDirectory;

/* 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;
}

/**
 * Staff Directory User Node
 */
class _User extends \IPS\Node\Model
{
   
/**
     * @brief    [ActiveRecord] Multiton Store
     */
   
protected static $multitons;
   
   
/**
     * @brief    [ActiveRecord] Database Table
     */
   
public static $databaseTable = 'core_leaders';
   
   
/**
     * @brief    [ActiveRecord] Database Prefix
     */
   
public static $databasePrefix = 'leader_';
   
   
/**
     * @brief    [ActiveRecord] ID Database Column
     */
   
public static $databaseColumnId = 'id';

   
/**
     * @brief    [ActiveRecord] Database ID Fields
     */
   
protected static $databaseIdFields = array( 'leader_type_id' );
   
   
/**
     * @brief    [ActiveRecord] Multiton Map
     */
   
protected static $multitonMap    = array();
   
   
/**
     * @brief    [Node] Parent Node ID Database Column
     */
   
public static $parentNodeColumnId = 'group_id';
   
   
/**
     * @brief    [Node] Parent Node Class
     */
   
public static $parentNodeClass = 'IPS\core\StaffDirectory\Group';
   
   
/**
     * @brief    [Node] Order Database Column
     */
   
public static $databaseColumnOrder = 'position';
   
   
/**
     * @brief    [Node] ACP Restrictions
     */
   
protected static $restrictions = array(
       
'app'        => 'core',
       
'module'    => 'staff',
       
'prefix'    => 'leaders_',
    );
   
   
/**
     * Get staff users in a group
     *
     * @param    int|null        $group    [Optional] Group to return users from
     * @return    array
     */
   
public static function staff( $group=NULL )
    {
        if(
$group === NULL )
        {
            return static::
roots();
        }

       
$users    = array();

        foreach ( static::
roots() as $user )
        {
            if(
$user->group_id === $group )
            {
               
$users[]    = $user;
            }
        }
               
        return
$users;
    }

   
/**
     * [Node] Add/Edit Form
     *
     * @param    \IPS\Helpers\Form    $form    The form
     * @return    void
     */
   
public function form( &$form )
    {
       
$form->add( new \IPS\Helpers\Form\Radio( 'leader_type', $this->type ?: 'm', TRUE, array(
           
'options'     => array( 'm' => 'leader_type_member', 'g' => 'leader_type_group' ),
           
'toggles'    => array(
               
'm'            => array( 'leader_id_member', 'leader_name_toggle', 'leader_title_toggle', 'leader_custom_bio_id' ),
               
'g'            => array( 'leader_id_group' )
            ),
        ) ) );

       
$form->add( new \IPS\Helpers\Form\Select( 'leader_id_group', $this->type === 'g' ? $this->type_id : NULL, FALSE, array( 'options' => \IPS\Member\Group::groups( TRUE, FALSE ), 'parse' => 'normal' ), NULL, NULL, NULL, 'leader_id_group' ) );
       
$form->add( new \IPS\Helpers\Form\Member( 'leader_id_member', ( $this->type === 'm' AND !$this->_new ) ? \IPS\Member::load( $this->type_id )->name : NULL, FALSE, array(), function( $val )
        {
            if ( !
$val and \IPS\Request::i()->leader_type === 'm' )
            {
                throw new \
DomainException('form_required');
            }
        },
NULL, NULL, 'leader_id_member' ) );
       
$form->add( new \IPS\Helpers\Form\Radio( 'leader_use_custom_name', ( \IPS\Member::loggedIn()->language()->checkKeyExists("core_staff_directory_name_{$this->id}") ) ? 1 : 0, FALSE, array( 'options' => array( 0 => 'leader_custom_name_default', 1 => 'leader_custom_name_custom' ), 'toggles' => array( 1 => array( 'leader_custom_name' ) ) ), NULL, NULL, NULL, 'leader_name_toggle' ) );
       
$form->add( new \IPS\Helpers\Form\Translatable( 'leader_custom_name', NULL, FALSE, array( 'app' => 'core', 'key' => ( $this->id ? "core_staff_directory_name_{$this->id}" : NULL ) ), NULL, NULL, NULL, 'leader_custom_name' ) );
       
$form->add( new \IPS\Helpers\Form\Radio( 'leader_use_custom_title', ( \IPS\Member::loggedIn()->language()->checkKeyExists("core_staff_directory_title_{$this->id}") ) ? 1 : 0, FALSE, array( 'options' => array( 0 => 'leader_custom_title_default', 1 => 'leader_custom_title_custom' ), 'toggles' => array( 1 => array( 'leader_custom_title' ) ) ), NULL, NULL, NULL, 'leader_title_toggle' ) );
       
$form->add( new \IPS\Helpers\Form\Translatable( 'leader_custom_title', NULL, FALSE, array( 'app' => 'core', 'key' => ( $this->id ? "core_staff_directory_title_{$this->id}" : NULL ) ), NULL, NULL, NULL, 'leader_custom_title' ) );
       
$form->add( new \IPS\Helpers\Form\Translatable( 'leader_custom_bio', NULL, FALSE, array(
           
'app'            => 'core',
           
'key'            => ( $this->id ? "core_staff_directory_bio_{$this->id}" : NULL ),
           
'editor'        => array(
               
'app'            => 'core',
               
'key'            => 'Staffdirectory',
               
'autoSaveKey'    => ( $this->id ? ( 'leader-' . $this->id ) : ( 'leader-' . 999999999 ) ),
               
'attachIds'        => ( $this->id ? array( $this->id ) : NULL )
            ),
        ),
NULL, NULL, NULL, 'leader_custom_bio_id' ) );
    }
   
   
/**
     * [Node] Format form values from add/edit form for save
     *
     * @param    array    $values    Values from the form
     * @return    array
     */
   
public function formatFormValues( $values )
    {
        if( isset(
$values['leader_type'] ) )
        {
            try
            {
                if( \
IPS\Db::i()->select( '*', 'core_leaders', array( 'leader_type=? AND leader_type_id=?', $values['leader_type'], $values['leader_type'] === 'm' ? $values['leader_id_member']->member_id : $values['leader_id_group'] ) )->first() )
                {
                    if( !
$this->id OR ( $this->id AND $this->type != $values['leader_type'] OR $this->type_id != ( $values['leader_type'] === 'm' ? $values['leader_id_member']->member_id : $values['leader_id_group'] ) ) )
                    {
                        throw new \
LogicException( \IPS\Member::loggedIn()->language()->addToStack("only_one_leader") );
                    }
                }
            }
            catch( \
UnderflowException $e ){}
        }

        if( isset(
$values['leader_type'] ) AND ( isset( $values['leader_id_member'] ) OR $values['leader_id_group'] ) )
        {
           
$values['type_id']            = $values['leader_type'] === 'm' ? $values['leader_id_member']->member_id : $values['leader_id_group'];
            unset(
$values['leader_id_group'], $values['leader_id_member'] );
           
$this->type        = $values['leader_type'];
           
$this->type_id    = $values['type_id'];
        }

        if ( !
$this->id )
        {
           
$this->save();

           
$values['position']            = ( \IPS\Db::i()->select( 'MAX(leader_position)', 'core_leaders' )->first() + 1 );
        }

       
$toUnset    = array();

        if ( isset(
$values['leader_use_custom_name'] ) )
        {
           
$toUnset[]    = 'leader_use_custom_name';
           
$toUnset[]    = 'leader_custom_name';

            \
IPS\Lang::deleteCustom( 'core', "core_staff_directory_name_{$this->id}" );
        }

        if( isset(
$values['leader_custom_name'] ) AND isset( $values['leader_use_custom_name'] ) AND $values['leader_use_custom_name'] )
        {
            \
IPS\Lang::saveCustom( 'core', "core_staff_directory_name_{$this->id}", $values['leader_custom_name'] );
        }

        if ( isset(
$values['leader_use_custom_title'] ) )
        {
           
$toUnset[]    = 'leader_use_custom_title';
           
$toUnset[]    = 'leader_custom_title';

            \
IPS\Lang::deleteCustom( 'core', "core_staff_directory_title_{$this->id}" );
        }
       
        if( isset(
$values['leader_custom_title'] ) AND isset( $values['leader_use_custom_title'] ) AND $values['leader_use_custom_title'] )
        {
            \
IPS\Lang::saveCustom( 'core', "core_staff_directory_title_{$this->id}", $values['leader_custom_title'] );
        }

        if(
array_key_exists( 'leader_custom_bio', $values ) )
        {
           
$toUnset[]    = 'leader_custom_bio';
            if ( isset (
$values['leader_custom_bio'] ) )
            {
                \
IPS\Lang::saveCustom( 'core', "core_staff_directory_bio_{$this->id}", $values['leader_custom_bio'] );
            }
        }

        if(
count( $toUnset ) )
        {
            foreach(
$toUnset as $_key )
            {
                unset(
$values[ $_key ] );
            }
        }

        return
$values;
    }

   
/**
     * Process created object AFTER the object has been created
     *
     * @param    \IPS\Content\Comment|NULL    $comment    The first comment
     * @param    array                        $values        Values from form
     * @return    void
     */
   
public function postSaveForm( $values )
    {
       
parent::postSaveForm( $values );

        \
IPS\File::claimAttachments( 'leader-' . 999999999, $this->id );
    }
   
   
/**
     * [Node] Get Node Title
     *
     * @return    string
     */
   
protected function get__title()
    {
        if ( !
$this->id )
        {
            return
'';
        }
       
        if (
$this->type === 'm' )
        {
            if( \
IPS\Member::loggedIn()->language()->checkKeyExists("core_staff_directory_name_{$this->id}") and \IPS\Member::loggedIn()->language()->get("core_staff_directory_name_{$this->id}") )
            {
                return \
IPS\Member::loggedIn()->language()->addToStack( "core_staff_directory_name_{$this->id}", FALSE, array( 'escape' => TRUE ) );
            }

           
$member = \IPS\Member::load( $this->type_id );

            if(
$member->member_id )
            {
                return
$member->name;
            }

            return \
IPS\Member::loggedIn()->language()->addToStack('deleted_member');
        }
        else
        {
            try
            {
                return \
IPS\Member\Group::load( $this->type_id )->name;
            }
            catch( \
OutOfRangeException $e )
            {
                return \
IPS\Member::loggedIn()->language()->addToStack('deleted_group');
            }
        }
    }
   
   
/**
     * [Node] Get Node Icon
     *
     * @return    string
     */
   
protected function get__icon()
    {
        return
$this->type === 'm' ? 'fa-user' : 'fa-group';
    }
   
   
/**
     * @brief    Member
     */
   
public $member;

   
/**
     * Get member data for user
     *
     * @return    \IPS\Member
     */
   
public function member()
    {
        if (
$this->member === NULL )
        {
           
$this->member =  \IPS\Member::load( $this->type_id );
        }
       
        return
$this->member;
    }

   
/**
     * [Node] Does the currently logged in user have permission to edit permissions for this node?
     *
     * @return    bool
     */
   
public function canAdd()
    {
        return
FALSE;
    }

   
/**
     * [Node] Does the currently logged in user have permission to copy this node?
     *
     * @return    bool
     */
   
public function canCopy()
    {
        return
FALSE;
    }

   
/**
     * [Node] Does the currently logged in user have permission to edit permissions for this node?
     *
     * @return    bool
     */
   
public function canManagePermissions()
    {
        return
FALSE;
    }
   
   
/**
     * Delete
     *
     * @return    void
     */
   
public function delete()
    {
        \
IPS\File::unclaimAttachments( 'core_Staffdirectory', $this->id );
       
parent::delete();
        static::
updateEmptySetting();
    }
   
   
/**
     * Save Changed Columns
     *
     * @return    void
     */
   
public function save()
    {
       
parent::save();
        static::
updateEmptySetting( FALSE );
    }
   
   
/**
     * Check if there are any records and update setting so we can hide the link if there is nothing
     *
     * @param    bool|NULL    $value    If we already know the value (because we've just set it), will save a query
     * @return    void
     */
   
public static function updateEmptySetting( $value = NULL )
    {
        if (
$value == NULL )
        {
           
$value = !( (bool) \IPS\Db::i()->select( 'COUNT(*)', 'core_leaders', NULL, NULL, NULL, NULL, NULL, \IPS\Db::SELECT_FROM_WRITE_SERVER )->first() );
        }
       
        \
IPS\Settings::i()->changeValues( array( 'staff_directory_empty' => $value ) );
    }
}