Version 4.3.6
This commit is contained in:
1 parent
fe1acf984a
commit
1a0c7fd3c2
609 files changed
+14707
-5726
No files matched your search
@@ -35,7 +35,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
}
|
||||
|
||||
/* Create the table */
|
||||
$table = new \IPS\Helpers\Table\Db( 'core_members', \IPS\Http\Url::internal( 'app=core&module=members&controller=members' ), array( array( 'name<>? AND email<>?', '', '' ) ), 'joined' );
|
||||
$table = new \IPS\Helpers\Table\Db( 'core_members', \IPS\Http\Url::internal( 'app=core&module=members&controller=members' ), array( array( 'email<>?', '' ) ), 'joined' );
|
||||
$table->langPrefix = 'members_';
|
||||
|
||||
/* Columns we need */
|
||||
@@ -48,7 +48,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
$table->sortBy = $table->sortBy ?: 'joined';
|
||||
$table->sortDirection = $table->sortDirection ?: 'desc';
|
||||
|
||||
/* Groups for advanced filter (need to do it this way because array_merge renumbers the result */
|
||||
/* Groups for advanced filter (need to do it this way because array_merge renumbers the result) */
|
||||
$groups = array( '' => 'any_group' );
|
||||
$joinFields = array( 'core_members.member_id as member_id' );
|
||||
|
||||
@@ -58,7 +58,6 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
}
|
||||
|
||||
$fieldsToAdd = array();
|
||||
$helperClasses = array();
|
||||
|
||||
/* Profile fields */
|
||||
foreach ( \IPS\core\ProfileFields\Field::fields( array(), \IPS\core\ProfileFields\Field::STAFF ) as $group => $fields )
|
||||
@@ -108,9 +107,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
$helper = array( \IPS\Helpers\Table\SEARCH_SELECT, array( 'options' => $options ) );
|
||||
break;
|
||||
}
|
||||
|
||||
$helperClasses[ "field_{$id}" ] = $type;
|
||||
|
||||
|
||||
if ( $helper )
|
||||
{
|
||||
$fieldsToAdd[ "field_{$id}" ] = $helper;
|
||||
@@ -172,10 +169,14 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
return array( '( member_group_id=? OR FIND_IN_SET( ?, mgroup_others ) )', $val, $val );
|
||||
} ),
|
||||
'joined' => \IPS\Helpers\Table\SEARCH_DATE_RANGE,
|
||||
'joined' => \IPS\Helpers\Table\SEARCH_DATE_RANGE,
|
||||
'member_last_post' => \IPS\Helpers\Table\SEARCH_DATE_RANGE,
|
||||
'last_visit' => \IPS\Helpers\Table\SEARCH_DATE_RANGE,
|
||||
'last_activity' => \IPS\Helpers\Table\SEARCH_DATE_RANGE,
|
||||
'member_posts' => \IPS\Helpers\Table\SEARCH_NUMERIC,
|
||||
'allow_admin_emails' => array( \IPS\Helpers\Table\SEARCH_RADIO, array( 'options' => array( 'a' => 'allow_admin_emails_any', 1 => 'yes', 0 => 'no' ) ), function( $val )
|
||||
{
|
||||
return ( $val == 'a' ) ? array( '1=1' ) : array( 'allow_admin_mails=?', intval( $val ) );
|
||||
} )
|
||||
);
|
||||
|
||||
if( count( $fieldsToAdd ) )
|
||||
@@ -192,7 +193,12 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
'members_filter_validating' => '( v.lost_pass=0 AND v.forgot_security=0 AND v.vid IS NOT NULL )',
|
||||
'members_filter_administrators' => '( m.row_id IS NOT NULL OR g.row_id IS NOT NULL )'
|
||||
);
|
||||
|
||||
|
||||
if ( \IPS\Db::i()->select( 'COUNT(*)', 'core_members', array( "email <> '' and name=''" ) )->first() )
|
||||
{
|
||||
$table->filters['members_filtered_reserved'] = "(name='')";
|
||||
}
|
||||
|
||||
if( \IPS\Settings::i()->ipb_bruteforce_attempts )
|
||||
{
|
||||
/* We do this so we can put the locked filter at the 'end' of the buttons - array_unshift does not give us a simple method to retain keys */
|
||||
@@ -249,32 +255,42 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
return ( $val ) ? \IPS\DateTime::ts( $val )->localeDate() : \IPS\Member::loggedIn()->language()->addToStack( 'never' );
|
||||
},
|
||||
'last_visit' => function( $val, $row )
|
||||
'last_activity' => function( $val, $row )
|
||||
{
|
||||
return ( $val ) ? \IPS\DateTime::ts( $val )->localeDate() : \IPS\Member::loggedIn()->language()->addToStack( 'never' );
|
||||
},
|
||||
'name' => function( $val, $row )
|
||||
{
|
||||
$member = \IPS\Member::constructFromData( $row );
|
||||
|
||||
if ( $banned = $member->isBanned() )
|
||||
if ( $val )
|
||||
{
|
||||
if ( $banned instanceof \IPS\DateTime )
|
||||
$member = \IPS\Member::constructFromData( $row );
|
||||
|
||||
if ( $banned = $member->isBanned() )
|
||||
{
|
||||
$title = \IPS\Member::loggedIn()->language()->addToStack( 'suspended_until', FALSE, array( 'sprintf' => array( $banned->localeDate() ) ) );
|
||||
if ( $banned instanceof \IPS\DateTime )
|
||||
{
|
||||
$title = \IPS\Member::loggedIn()->language()->addToStack( 'suspended_until', FALSE, array( 'sprintf' => array( $banned->localeDate() ) ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
$title = \IPS\Member::loggedIn()->language()->addToStack( 'banned' );
|
||||
}
|
||||
return "<a href='" . \IPS\Http\Url::internal( 'app=core&module=members&controller=members&do=view&id=' ) . $row['member_id'] . "'>" . htmlentities( $val, ENT_DISALLOWED, 'UTF-8', FALSE ) . "</a> <span class='ipsBadge ipsBadge_negative'>" . $title ."</span> ";
|
||||
}
|
||||
else
|
||||
{
|
||||
$title = \IPS\Member::loggedIn()->language()->addToStack( 'banned' );
|
||||
return "<a href='" . \IPS\Http\Url::internal( 'app=core&module=members&controller=members&do=view&id=' ) . $row['member_id'] . "'>" . htmlentities( $val, ENT_DISALLOWED, 'UTF-8', FALSE ) . "</a>";
|
||||
}
|
||||
return "<a href='" . \IPS\Http\Url::internal( 'app=core&module=members&controller=members&do=view&id=' ) . $row['member_id'] . "'>" . htmlentities( $val, ENT_DISALLOWED, 'UTF-8', FALSE ) . "</a> <span class='ipsBadge ipsBadge_negative'>" . $title ."</span> ";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "<a href='" . \IPS\Http\Url::internal( 'app=core&module=members&controller=members&do=view&id=' ) . $row['member_id'] . "'>" . htmlentities( $val, ENT_DISALLOWED, 'UTF-8', FALSE ) . "</a>";
|
||||
return \IPS\Theme::i()->getTemplate( 'members', 'core', 'admin' )->memberReserved( \IPS\Member::constructFromData( $row ) );
|
||||
}
|
||||
|
||||
},
|
||||
'allow_admin_emails' => function( $val, $row )
|
||||
{
|
||||
return $row['allow_admin_mails'] ? '✔' : '✗';
|
||||
}
|
||||
);
|
||||
|
||||
/* Specify the buttons */
|
||||
@@ -398,7 +414,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
if( \IPS\Request::i()->advanced_search_submitted OR \IPS\Request::i()->quicksearch )
|
||||
{
|
||||
$link = ' <a href="' . \IPS\Http\Url::internal( 'app=core&module=members&controller=members' ) . '">' . \IPS\Member::loggedIn()->language()->addToStack('member_view_full_list') . '</a>';
|
||||
|
||||
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'core', 'members', 'member_delete' ) OR \IPS\Member::loggedIn()->hasAcpRestriction( 'core', 'members', 'member_edit' ) )
|
||||
{
|
||||
$query = array(
|
||||
@@ -410,9 +426,10 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
'members_member_group_id' => \IPS\Request::i()->members_member_group_id,
|
||||
'members_joined' => \IPS\Request::i()->members_joined,
|
||||
'members_last_post' => \IPS\Request::i()->members_member_last_post,
|
||||
'members_last_visit' => \IPS\Request::i()->members_last_visit,
|
||||
'members_last_activity' => \IPS\Request::i()->members_last_activity,
|
||||
'members_posts' => \IPS\Request::i()->members_member_posts,
|
||||
'filter' => \IPS\Request::i()->filter,
|
||||
'members_allow_admin_emails' => \IPS\Request::i()->members_allow_admin_emails
|
||||
);
|
||||
|
||||
foreach ( \IPS\Request::i() as $k => $v )
|
||||
@@ -423,31 +440,15 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
$query[ $k ] = $v;
|
||||
|
||||
/* And also add them as parsers so they display properly */
|
||||
$table->parsers[ str_replace( 'members_', '', $k ) ] = function( $val, $row ) use ( $k, $helperClasses )
|
||||
$table->parsers[ str_replace( 'members_', '', $k ) ] = function( $val, $row ) use ( $k )
|
||||
{
|
||||
if ( isset( $helperClasses[ 'field_' . str_replace( 'members_field_', '', $k ) ] ) )
|
||||
try
|
||||
{
|
||||
$helper = $helperClasses[ 'field_' . str_replace( 'members_field_', '', $k ) ];
|
||||
$options = array();
|
||||
switch( $helper )
|
||||
{
|
||||
case 'IPS\Helpers\Form\Editor':
|
||||
$options = array_merge(
|
||||
\IPS\core\ProfileFields\Field::$editorOptions,
|
||||
array(
|
||||
'autoSaveKey' => md5( $helper . '-' . str_replace( 'members_field_', '', $k ) . '-' . $row['member_id'] ),
|
||||
'attachIds' => array( $row['member_id'], str_replace( 'members_field_', '', $k ) )
|
||||
)
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
||||
$class = new $helper( 'field_' . str_replace( 'members_field_', '', $k ), $val, FALSE, $options );
|
||||
return $class->formatValue();
|
||||
return \IPS\core\ProfileFields\Field::load( str_replace( 'members_field_', '', $k ) )->displayValue( $val );
|
||||
}
|
||||
else
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
return $val;
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -461,6 +462,11 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'core', 'members', 'member_edit' ) )
|
||||
{
|
||||
$link .= ' — <a href="' . \IPS\Http\Url::internal( "app=core&module=members&controller=members&do=massManage&action=move" )->setQueryString( $query ) . '">' . \IPS\Member::loggedIn()->language()->addToStack( 'member_search_move' ) . '</a>';
|
||||
|
||||
if ( \IPS\Request::i()->members_allow_admin_emails !== 'a' )
|
||||
{
|
||||
$link .= ' — <a href="' . \IPS\Http\Url::internal( "app=core&module=members&controller=members&do=massManage&action=unSub" )->setQueryString( $query ) . '">' . \IPS\Member::loggedIn()->language()->addToStack( 'member_search_unsub' ) . '</a>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -592,7 +598,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
}
|
||||
}
|
||||
|
||||
foreach ( array( 'joined', 'last_post', 'last_visit' ) as $k )
|
||||
foreach ( array( 'joined', 'last_post', 'last_activity' ) as $k )
|
||||
{
|
||||
$requestKey = "members_{$k}";
|
||||
if ( $k === 'last_post' )
|
||||
@@ -608,12 +614,28 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
$end = NULL;
|
||||
if ( $request['start'] )
|
||||
{
|
||||
$start = new \IPS\DateTime( \IPS\Helpers\Form\Date::_convertDateFormat( $request['start'] ) );
|
||||
$time = \IPS\Helpers\Form\Date::_convertDateFormat( $request['start'] );
|
||||
if ( is_numeric( $time ) )
|
||||
{
|
||||
$start = \IPS\DateTime::ts( $time );
|
||||
}
|
||||
else
|
||||
{
|
||||
$start = new \IPS\DateTime( $time );
|
||||
}
|
||||
$start = $start->setTime( 0, 0, 0 );
|
||||
}
|
||||
if ( $request['end'] )
|
||||
{
|
||||
$end = new \IPS\DateTime( \IPS\Helpers\Form\Date::_convertDateFormat( $request['end'] ) );
|
||||
$time = \IPS\Helpers\Form\Date::_convertDateFormat( $request['end'] );
|
||||
if ( is_numeric( $time ) )
|
||||
{
|
||||
$end = \IPS\DateTime::ts( $time );
|
||||
}
|
||||
else
|
||||
{
|
||||
$end = new \IPS\DateTime( $time );
|
||||
}
|
||||
$end = $end->setTime( 23, 59, 59 );
|
||||
}
|
||||
|
||||
@@ -730,7 +752,13 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
catch ( \OutOfRangeException $e ) { }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Bulk email */
|
||||
if ( isset( \IPS\Request::i()->members_allow_admin_emails ) and \IPS\Request::i()->members_allow_admin_emails != 'a' )
|
||||
{
|
||||
$where[] = array( 'allow_admin_mails=?', intval( \IPS\Request::i()->members_allow_admin_emails ) );
|
||||
}
|
||||
|
||||
if ( !count( $where ) )
|
||||
{
|
||||
if ( \IPS\Request::i()->action === 'prune' )
|
||||
@@ -746,8 +774,8 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
/* Unset any previous session data */
|
||||
$_SESSION['members_manage_where'] = $where;
|
||||
$_SESSION['members_manage_action'] = \IPS\Request::i()->action;
|
||||
|
||||
if ( \IPS\Request::i()->action === 'prune' )
|
||||
|
||||
if ( \IPS\Request::i()->action === 'prune' or \IPS\Request::i()->action === 'unSub' )
|
||||
{
|
||||
$count = \IPS\Db::i()->select( 'COUNT(*) AS count', 'core_members', $where )
|
||||
->join( 'core_pfields_content', 'core_members.member_id=core_pfields_content.member_id' );
|
||||
@@ -763,13 +791,20 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
->join( array( 'core_admin_permission_rows', 'g' ), array( 'g.row_id', \IPS\Db::i()->select( 'row_id', array( 'core_admin_permission_rows', 'sub' ), array( "((sub.row_id=core_members.member_group_id OR FIND_IN_SET( sub.row_id, core_members.mgroup_others ) ) AND sub.row_id_type='group') AND g.row_id_type='group'" ), NULL, array( 0, 1 ) ) ) );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'members' )->confirmMassAction( $count->first(), 'prune' );
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'members' )->confirmMassAction( $count->first(), \IPS\Request::i()->action );
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack( 'member_prune_confirm' );
|
||||
}
|
||||
else
|
||||
{
|
||||
$form = new \IPS\Helpers\Form;
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'move_to_group', NULL, TRUE, array( 'options' => \IPS\Member\Group::groups( TRUE, FALSE ), 'parse' => 'normal' ) ) );
|
||||
$groups = \IPS\Member\Group::groups( TRUE, FALSE );
|
||||
|
||||
/* We can remove the group we are moving *from* */
|
||||
if( isset( \IPS\Request::i()->members_member_group_id ) )
|
||||
{
|
||||
unset( $groups[\IPS\Request::i()->members_member_group_id] );
|
||||
}
|
||||
$form->add( new \IPS\Helpers\Form\Select( 'move_to_group', NULL, TRUE, array( 'options' => $groups, 'parse' => 'normal' ) ) );
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
@@ -827,6 +862,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
AND isset( $_SESSION['members_manage_action'] ) AND $_SESSION['members_manage_action'] !== NULL )
|
||||
{
|
||||
\IPS\Task::queue( 'core', 'MoveMembers', array( 'where' => $_SESSION['members_manage_where'], 'group' => $_SESSION['members_manage_group'], 'oldGroup' => ( isset( $_SESSION['members_manage_old_group'] ) ) ? $_SESSION['members_manage_old_group'] : NULL, 'by' => \IPS\Member::loggedIn()->member_id ), 2 );
|
||||
\IPS\Session::i()->log( 'acplog__members_mass_move' );
|
||||
|
||||
$_SESSION['members_manage_where'] = NULL;
|
||||
$_SESSION['members_manage_action'] = NULL;
|
||||
@@ -836,6 +872,30 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
|
||||
\IPS\Output::i()->error( 'members_manage_error', '2C114/K', 404, '' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Unsubscribe Members
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function doUnsub()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'member_edit' );
|
||||
|
||||
/* Don't queue the task if the session variables are null (i.e. the page has been reloaded) */
|
||||
if( isset( $_SESSION['members_manage_where'] ) AND $_SESSION['members_manage_where'] !== NULL
|
||||
AND isset( $_SESSION['members_manage_action'] ) AND $_SESSION['members_manage_action'] !== NULL )
|
||||
{
|
||||
\IPS\Task::queue( 'core', 'UnsubMembers', array( 'where' => $_SESSION['members_manage_where'] ), 2 );
|
||||
\IPS\Session::i()->log( 'acplog__members_mass_unsub' );
|
||||
|
||||
$_SESSION['members_manage_where'] = NULL;
|
||||
$_SESSION['members_manage_action'] = NULL;
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( "app=core&module=members&controller=members" ), 'members_queued_for_unsub' );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->error( 'members_manage_error', '2C114/K', 404, '' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Prune members
|
||||
@@ -851,6 +911,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
AND isset( $_SESSION['members_manage_action'] ) AND $_SESSION['members_manage_action'] !== NULL )
|
||||
{
|
||||
\IPS\Task::queue( 'core', 'PruneMembers', array( 'where' => $_SESSION['members_manage_where'] ), 2 );
|
||||
\IPS\Session::i()->log( 'acplog__members_mass_delete' );
|
||||
|
||||
$_SESSION['members_manage_where'] = NULL;
|
||||
$_SESSION['members_manage_action'] = NULL;
|
||||
@@ -954,7 +1015,15 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
}
|
||||
|
||||
/* Get the available tabs */
|
||||
$extensions = \IPS\Application::allExtensions( 'core', 'MemberACPProfileTabs', TRUE, 'core', 'Main', FALSE );
|
||||
$extensions = array();
|
||||
foreach( \IPS\Application::allExtensions( 'core', 'MemberACPProfileTabs', TRUE, 'core', 'Main', FALSE ) AS $key => $ext )
|
||||
{
|
||||
$class = new $ext( $member );
|
||||
if ( $class->canView() )
|
||||
{
|
||||
$extensions[ $key ] = $ext;
|
||||
}
|
||||
}
|
||||
|
||||
/* What's our active tab? */
|
||||
$activeTab = ( isset( \IPS\Request::i()->tab ) and array_key_exists( \IPS\Request::i()->tab, $extensions ) ) ? \IPS\Request::i()->tab : 'core_Main';
|
||||
@@ -962,7 +1031,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
$tab = new $classname( $member );
|
||||
|
||||
/* Output */
|
||||
\IPS\Output::i()->title = $member->name;
|
||||
\IPS\Output::i()->title = $member->name ? $member->name : \IPS\Member::loggedIn()->language()->addToStack('members_name_missing_as_reserved');
|
||||
if ( \IPS\Request::i()->isAjax() )
|
||||
{
|
||||
if ( isset( \IPS\Request::i()->blockKey ) )
|
||||
@@ -1221,7 +1290,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
$error = \IPS\Member::loggedIn()->language()->addToStack('form_bad_value');
|
||||
}
|
||||
elseif ( $message = \IPS\Login::usernameIsInUse( \IPS\Request::i()->name ) )
|
||||
elseif ( $message = \IPS\Login::usernameIsInUse( \IPS\Request::i()->name, $member ) )
|
||||
{
|
||||
$error = $message;
|
||||
}
|
||||
@@ -1306,7 +1375,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
$error = NULL;
|
||||
if ( filter_var( \IPS\Request::i()->email, FILTER_VALIDATE_EMAIL ) === FALSE )
|
||||
{
|
||||
$error = 'form_email_bad';
|
||||
$error = \IPS\Member::loggedIn()->language()->addToStack( 'form_email_bad' );
|
||||
}
|
||||
elseif ( $message = \IPS\Login::emailIsInUse( \IPS\Request::i()->email, $member ) )
|
||||
{
|
||||
@@ -1318,7 +1387,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
if ( preg_match( '/^' . str_replace( '\*', '.*', preg_quote( $bannedEmail, '/' ) ) . '$/i', \IPS\Request::i()->email ) )
|
||||
{
|
||||
$error = 'form_email_banned';
|
||||
$error = \IPS\Member::loggedIn()->language()->addToStack( 'form_email_banned' );
|
||||
}
|
||||
}
|
||||
if ( \IPS\Settings::i()->allowed_reg_email !== '' AND $allowedEmailDomains = explode( ',', \IPS\Settings::i()->allowed_reg_email ) )
|
||||
@@ -1333,7 +1402,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
}
|
||||
if ( count( $allowedEmailDomains ) AND !$matched )
|
||||
{
|
||||
$error = 'form_email_banned';
|
||||
$error = \IPS\Member::loggedIn()->language()->addToStack( 'form_email_banned' );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1535,7 +1604,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if ( $option == 'status' and ( !$member->canAccessModule( \IPS\Application\Module::get( 'core', 'status' ) ) or !\IPS\core\Statuses\Status::canCreateFromCreateMenu( $member ) or !\IPS\Settings::i()->profile_comments or $member->group['gbw_no_status_update'] ) )
|
||||
if ( $option == 'status' and ( !$member->canAccessModule( \IPS\Application\Module::get( 'core', 'status', 'front' ) ) or !\IPS\core\Statuses\Status::canCreateFromCreateMenu( $member ) or !\IPS\Settings::i()->profile_comments or $member->group['gbw_no_status_update'] ) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -2693,6 +2762,8 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'member_add' );
|
||||
|
||||
$maxMemberId = 16777215; // This is the maximum value for UNSIGNED MEDIUMINT. Even though nowadays we use BIGINT, older installs might still have MEDIUMINT, plus setting the limit to lower than what the limit actually is ensures there's room for future members.
|
||||
|
||||
$wizard = new \IPS\Helpers\Wizard(
|
||||
array(
|
||||
/* Step 1: Upload .csv file */
|
||||
@@ -2720,7 +2791,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
return (string) $form;
|
||||
},
|
||||
/* Step 2: Select Columns */
|
||||
'import_select_cols' => function( $data )
|
||||
'import_select_cols' => function( $data ) use ( $maxMemberId )
|
||||
{
|
||||
/* Init */
|
||||
$fh = fopen( $data['file'], 'r' );
|
||||
@@ -2822,7 +2893,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
unset( \IPS\Member::loggedIn()->language()->words[ 'core_pfield_' . $fieldId . '_desc' ] );
|
||||
}
|
||||
}
|
||||
return new \IPS\Helpers\Form\Select( $key, $value, FALSE, array( 'options' => $importOptions ) );
|
||||
return new \IPS\Helpers\Form\Select( $key, $value, FALSE, array( 'options' => $importOptions, 'toggles' => array( 'member_id' => array( 'elImportMemberIdWarning' ) ) ) );
|
||||
}
|
||||
);
|
||||
|
||||
@@ -2973,6 +3044,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
|
||||
/* Add the matrix */
|
||||
$form->addMatrix( 'columns', $matrix );
|
||||
$form->addMessage( \IPS\Member::loggedIn()->language()->addToStack( 'import_member_id_warning', FALSE, array( 'sprintf' => array( \IPS\Member::loggedIn()->language()->formatNumber( $maxMemberId ) ) ) ), 'ipsMessage ipsMessage_warning', FALSE, 'elImportMemberIdWarning' );
|
||||
|
||||
/* Handle submissions */
|
||||
if ( $values = $form->values() )
|
||||
@@ -3002,9 +3074,9 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
return (string) $form;
|
||||
},
|
||||
/* Step 3: Import */
|
||||
'import_do_import' => function( $wizardData )
|
||||
'import_do_import' => function( $wizardData ) use ( $maxMemberId )
|
||||
{
|
||||
return (string) new \IPS\Helpers\MultipleRedirect( \IPS\Http\Url::internal('app=core&module=members&controller=members&do=import'), function( $mrData ) use ( $wizardData )
|
||||
return (string) new \IPS\Helpers\MultipleRedirect( \IPS\Http\Url::internal('app=core&module=members&controller=members&do=import'), function( $mrData ) use ( $wizardData, $maxMemberId )
|
||||
{
|
||||
/* Get line from the file */
|
||||
$fh = fopen( $wizardData['file'], 'r' );
|
||||
@@ -3092,10 +3164,16 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
switch ( $wizardData['columns'][ $k ] )
|
||||
{
|
||||
case 'member_id':
|
||||
if ( !is_numeric( $v ) or $v < 0 or $v > $maxMemberId )
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_member_id_invalid' ), $v, \IPS\Member::loggedIn()->language()->formatNumber( $maxMemberId ) ) );
|
||||
}
|
||||
$v = intval( $v );
|
||||
|
||||
$existingMember = \IPS\Member::load( $v );
|
||||
if ( $existingMember->member_id )
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_member_id_exists' ) ) );
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_member_id_exists' ), $v ) );
|
||||
}
|
||||
$member->member_id = $v;
|
||||
break;
|
||||
@@ -3103,7 +3181,11 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
case 'name':
|
||||
if ( !$v )
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_no_name' ) ) );
|
||||
throw new \DomainException( \IPS\Member::loggedIn()->language()->get( 'import_no_name' ) );
|
||||
}
|
||||
if ( \strlen( $v ) > 255 )
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_name_too_long' ), $v ) );
|
||||
}
|
||||
if ( \IPS\Login::usernameIsInUse( $v, NULL, TRUE ) )
|
||||
{
|
||||
@@ -3120,6 +3202,10 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_no_email' ) ) );
|
||||
}
|
||||
if ( \strlen( $v ) > 255 )
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_email_too_long' ), $v ) );
|
||||
}
|
||||
if ( filter_var( $v, FILTER_VALIDATE_EMAIL ) === FALSE )
|
||||
{
|
||||
throw new \DomainException( sprintf( \IPS\Member::loggedIn()->language()->get( 'import_email_invalid' ), $v ) );
|
||||
@@ -3219,6 +3305,9 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
$member->joined = time();
|
||||
}
|
||||
|
||||
$member->members_bitoptions['created_externally'] = TRUE;
|
||||
|
||||
$member->save();
|
||||
if ( count( $profileFields ) )
|
||||
{
|
||||
@@ -3406,7 +3495,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
}
|
||||
return $wizardData;
|
||||
}
|
||||
|
||||
|
||||
return (string) new \IPS\Helpers\MultipleRedirect(
|
||||
$baseUrl,
|
||||
function( $mrData ) use ( $wizardData, $baseUrl )
|
||||
@@ -3428,11 +3517,7 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
{
|
||||
if( $_where = $extension->getQueryWhereClause( $wizardData['filters'][ $key ] ) )
|
||||
{
|
||||
if ( is_string( $_where ) )
|
||||
{
|
||||
$_where = array( $_where );
|
||||
}
|
||||
$where = array_merge( $where, $_where );
|
||||
$where[] = $_where;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3638,6 +3723,53 @@ class _members extends \IPS\Helpers\CoverPhoto\Controller
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('members_export');
|
||||
\IPS\Output::i()->output = $wizard;
|
||||
}
|
||||
|
||||
/**
|
||||
* Export Personal Information
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function exportPersonalInfo()
|
||||
{
|
||||
/* Check permission */
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'member_export_pi' );
|
||||
|
||||
/* Member */
|
||||
$member = \IPS\Member::load( \IPS\Request::i()->id );
|
||||
|
||||
if ( !$member->member_id )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2C114/V', 404, '' );
|
||||
}
|
||||
|
||||
if ( ! isset( \IPS\Request::i()->process ) )
|
||||
{
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('member_export_pi_title');
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('memberprofile')->downloadPersonalInfo( $member );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Init */
|
||||
$xml = \IPS\Xml\SimpleXML::create('member_export');
|
||||
$xml->addAttribute( 'created', \IPS\DateTime::ts( time() )->rfc3339() );
|
||||
|
||||
/* Get the data */
|
||||
foreach( \IPS\Application::allExtensions( 'core', 'MemberExportPersonalInformation', TRUE, 'core' ) AS $key => $ext )
|
||||
{
|
||||
if ( $data = $ext->getData( $member ) and is_array( $data ) and count( $data ) )
|
||||
{
|
||||
$child = $xml->addChild( $key );
|
||||
foreach( $data as $k => $v )
|
||||
{
|
||||
$child->addChild( $k, $v );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Build */
|
||||
\IPS\Output::i()->sendOutput( $xml->asXML(), 200, 'application/xml', array( "Content-Disposition" => \IPS\Output::getContentDisposition( 'attachment', $member->name . '_personal_information.xml' ) ), FALSE, FALSE, FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Member History
|
||||
|
||||
Reference in new issue
Block a user