Version 4.3.6

This commit is contained in:
Neo committed 2025-12-19 05:49:12 -08:00
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> &nbsp; <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> &nbsp; <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'] ? '&#10004;' : '&#10007;';
}
);
/* 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 .= ' &mdash; <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 .= ' &mdash; <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