今天记录3c之家 兰州短租公寓建设过程中遇到的一点小问题。由于网站需要,找了个会员积分系统来用用,AlphaUserPoints,总体感觉很是不错,先来看看后台
还可以吧?功能很是强大。
于是,我新建了一个菜单->会员中心,指向了AlphaUserPoints的个人页面,然而在前台点击后问题出现了,错误提示:您没有权限观看此页面;是啊,没有登录。可是想想这样的话会员肯定会不高兴的,最起码让网页直接能跳转到登录页面呢。好,开始分析源代码,下面是此组件的文件列表
我们来看看控制器,
class alphauserpointsController extends JController { function display() { parent::display(); } }
里面没有东西,进controllers文件夹看看:
有这几个文件,分析url:http://3c-home.com/index.php?option=com_alphauserpoints&view=account&Itemid=103
可知此应该使用的是account视图,对于的也就是account控制器,打开文件查看display函数部分
function display () { $app = JFactory::getApplication(); require_once (JPATH_ROOT.DS.'components'.DS.'com_alphauserpoints'.DS.'helper.php'); $com_params = JComponentHelper::getParams( 'com_alphauserpoints' ); $model = &$this->getModel ( 'alphauserpoints' ); $view = $this->getView ( 'account','html' ); // current user $user = JFactory::getUser(); // profil request $userid = JRequest::getVar( 'userid', '', 'default', 'string' ); if ( !$user->id && !$com_params->get( 'allowGuestUserViewProfil', 1 ) ) { $msg = JText::_('ALERTNOTAUTH' ); $app->redirect('index.php', $msg); } 这段代码就是检测是否有用户登录,如果没有用户登录就跳转到首页,并显示错误消息$msg. // check referre ID if ( ! $userid ) { $referrerid = $model->_checkUser(); } else { $referrerid = $userid; } // Rule Profile View if ( $referrerid != @$_SESSION['referrerid'] ) { $keyreference = AlphaUserPointsHelper::buildKeyreference( 'sysplgaup_profile_view', $user->id ); $username = ( $user->username ) ? $user->username : JText::_('AUP_GUEST'); $datareference = JText::_('AUP_PROFILE_VIEW_REFERENCE') . ' ' . $username; AlphaUserPointsHelper::userpoints ( 'sysplgaup_profile_view' , $referrerid, 0, $keyreference, $datareference ); } // End rule Profile View // Get the parameters of the active menu item $params = $model->_getParamsAUP(); $num_item_activities = $params->get( 'num_item_activities', 10 ); $_get_last_points = $model->_get_last_points ( $referrerid, $num_item_activities ); $_listing_last_points = $_get_last_points[0]; $_listing_total = $_get_last_points[1]; $_listing_limit = $_get_last_points[2]; $_listing_limitstart = $_get_last_points[3]; $rowsreferrees = $model->_get_referrees ( $referrerid ); $pointsearned = $model->_pointsearned(); // users points earned TOP 10 $totalpoints = $model->_totalpoints(); // entire community $mypointsearned = $model->_mypointsearned($referrerid); $mypointsspent = $model->_mypointsspent($referrerid); $mypointsearnedthismonth= $model->_mypointsearnedthismonth($referrerid); $mypointsspentthismonth = $model->_mypointsspentthismonth($referrerid); $mypointsearnedthisday = $model->_mypointsearnedthisday($referrerid); $mypointsspentthisday = $model->_mypointsspentthisday($referrerid); $_average_age = _get_average_age_community(); $_user_info = AlphaUserPointsHelper::getUserInfo ( $referrerid ); $currenttotalpoints = $_user_info->points; $lastupdate = $_user_info->last_update; $referraluser = $_user_info->referraluser; $myname = $_user_info->name; $myusername = $_user_info->username; $mybirthday = $_user_info->birthdate; $referralname = ""; if ( $referraluser ) { $referralinfo = AlphaUserPointsHelper::getUserInfo ( $referraluser ); $referralname = $referralinfo->username; } // get level/rank if exist $userrankinfo = AlphaUserPointsHelper::getUserRank ( $referrerid ); // get medals if exist $medalslistuser = AlphaUserPointsHelper::getUserMedals ( $referrerid ); // load avatar $useAvatarFrom = $com_params->get('useAvatarFrom'); $height = 100; if ( $useAvatarFrom=='alphauserpoints' ) JPlugin::loadLanguage( 'com_media', JPATH_ADMINISTRATOR ); $avatar = getAvatar( $useAvatarFrom, $_user_info, $height ); // Get coupons code $resultCoupons = $model->_getMyCouponCode( $referrerid ); $view->assign('params', $params ); $view->assign('cparams', $com_params ); $view->assign('referreid', $referrerid ); $view->assign('currenttotalpoints', $currenttotalpoints ); $view->assign('rowslastpoints', $_listing_last_points ); $view->assign('total', $_listing_total ); $view->assign('limit', $_listing_limit ); $view->assign('limitstart', $_listing_limitstart ); $view->assign('lastupdate', $lastupdate ); $view->assign('referraluser', $referraluser ); $view->assign('referralname', $referralname ); $view->assign('rowsreferrees', $rowsreferrees ); $view->assign('userid', $user->id); $view->assign('userrankinfo', $userrankinfo); $view->assign('medalslistuser', $medalslistuser); $view->assign('pointsearned', $pointsearned); $view->assign('totalpoints', $totalpoints); $view->assign('mypointsearned', $mypointsearned); $view->assign('mypointsspent', $mypointsspent); $view->assign('mypointsearnedthismonth', $mypointsearnedthismonth); $view->assign('mypointsspentthismonth', $mypointsspentthismonth); $view->assign('mypointsearnedthisday', $mypointsearnedthisday); $view->assign('mypointsspentthisday', $mypointsspentthisday); $view->assign('myname', $myname); $view->assign('myusername', $myusername); $view->assign('avatar', $avatar); $view->assign('birthday', $mybirthday); $view->assign('user_info', $_user_info); $view->assign('useAvatarFrom', $useAvatarFrom); $view->assign('mycouponscode', $resultCoupons); $view->assign('userinfo', $_user_info); $view->assign('average_age', $_average_age); // Display $view->_display(); }
现在找到了地方,我们来做修改,把下面代码的跳转改改:
if ( !$user->id && !$com_params->get( 'allowGuestUserViewProfil', 1 ) )
{$msg = JText::_('ALERTNOTAUTH' );
//login first
$app->redirect('index.php?option=com_users&view=login', $msg);}
现在把跳转改到了登录表单,然后把ALERTNOTAUTH对于的汉语提示改改,改成友善一点,就是提示顾客登录。继续测试,成功,窃喜呢。
点登录。。。。。
不对啊,登录以后是系统自带的用户界面啊,我得定向到新的会员界面啊,怎么办呢,我想还是把系统自带的user组件改改吧
找到com_user文件夹,好多文件啊,慢慢看吧,先入手控制器,
com_user下的controller.php文件里面没有点击login按钮触发的事件,最终在controllers文件夹下的user.php文件中找到相关代码。就是login函数
public function login() { JSession::checkToken('post') or jexit(JText::_('JInvalid_Token')); $app = JFactory::getApplication(); // Populate the data array: $data = array(); $data['return'] = base64_decode(JRequest::getVar('return', '', 'POST', 'BASE64')); $data['username'] = JRequest::getVar('username', '', 'method', 'username'); $data['password'] = JRequest::getString('password', '', 'post', JREQUEST_ALLOWRAW); // Set the return URL if empty. if (empty($data['return'])) { $data['return'] = 'index.php?option=com_users&view=profile'; } // Set the return URL in the user state to allow modification by plugins $app->setUserState('users.login.form.return', $data['return']); // Get the log in options. $options = array(); $options['remember'] = JRequest::getBool('remember', false); $options['return'] = $data['return']; // Get the log in credentials. $credentials = array(); $credentials['username'] = $data['username']; $credentials['password'] = $data['password']; // Perform the log in. if (true === $app->login($credentials, $options)) { // Success $app->setUserState('users.login.form.data', array()); $app->redirect(JRoute::_($app->getUserState('users.login.form.return'), false)); } else { // Login failed ! $data['remember'] = (int)$options['remember']; $app->setUserState('users.login.form.data', $data); $app->redirect(JRoute::_('index.php?option=com_users&view=login', false)); } }
红色的那几行就是成功登陆后的跳转的相关代码,我直接跳转到我们需要的页面看看:
if (empty($data['return'])) { // $data['return'] = 'index.php?option=com_users&view=profile'; $data['return'] ='index.php?option=com_alphauserpoints&view=account&Itemid=103'; }
成功了。
总结:本次修改代码是在对组件开发不是特别熟悉的前提下进行的,在修改代码时考虑的不是很完备,如果能在AlphaUserPoints组件中实现登陆及相关的跳转就再好不过了,但时间紧迫,目前先将就使用。也希望通过这次的修改,为下次自己写组件奠定一些基础。