在我正在构建的网站上,当访问者加载页面时会自动生成帐户。创建帐户时,将要求新用户通过创建模态窗口来选择用户名,当用户提交新用户名时,数据将被发送回服务器并且模式将关闭。
所以现在唯一的问题是我不知道如何在生成新帐户时调用此模态窗口。现在它每次都会显示页面重新加载,但应该发生的事情是仅在生成帐户之后。
所以这应该在制作帐户时调用,但仅在发生时才会调用:
$('#i-modal').foundation('reveal', 'open');
创建帐户时,会发生这种情况。请求已发送至/createUser
UserController中:
public function createUser()
{
$newUser = new User;
$newUser->username = 'user-'.Helpers::randomLowerCase(4);
$newUser->save();
// Check if user isn't logged in yet
if (!Auth::check()) {
Auth::login($newUser);
} else {
// ...
}
// Return the user home
return Redirect::action('HomeController@showHome');
}
那么我应该如何做到这一点,并且只能在创建帐户后调用$('#i-modal').foundation('reveal', 'open');
?
答案 0 :(得分:4)
我会使用AJAX来检查帐户。文档加载完成后,将触发一个请求,该请求将检查以确保帐户已完全使用用户名进行设置。如果没有,那么你可以弹出模态,我假设你已经设置了。
对于这个例子,我正在创建一个AjaxController,它可以放置你所有的ajax调用逻辑,但是这些函数可以放在任何地方。只需确保相应地更改路线。请注意,此代码很大程度上未经测试。
// Route
Route::post('ajax/checkUserAccount', array('uses' => 'AjaxController@checkUserAccountExists', as 'ajax.checkUserAccount');
// Controller
AjaxController extends BaseController {
public function checkUserAccountExists {
// Do user account check logic here. This is just an example as I'm not sure how you plan on handling this or what variables are set when someone creates an account
$userCount = DB::table('users')->where('username', Input::get('username'))->count();
if($userCount > 0) {
return Response::json(array('member' => 'true'));
} else {
return Response::json(array('member' => 'false'));
}
}
}
// jQuery AJAX
$(document).ready(function()
{
$.ajax({
method: "POST"
, url: "{{ URL::route('ajax.checkUserAccount') }}"
success: function(data) {
if(data.member === false) {
$('#i-modal').foundation('reveal', 'open');
}
}
});
});
答案 1 :(得分:3)
一种方法可以是在http session
中存储用户输入的用户名,并且可能还会自动将用户登录到系统。然后,如果页面重新加载,UserController
会在会话中检查是否已存储用户名或用户是否已登录。根据结果显示模式是否显示。
因此,当首次加载页面时,您可以执行以下步骤(然后是未经测试的代码,作为可以放置代码的每个部分的示例),
1。检查会话(php http会话,例如session_start();if(isset($_SESSION[$username])){..
),看看是否存在用户名或Auth::check()
。
<强> PHP 强>
Route::get('checkUser', 'UserController@checkUser');
Route::get('createUser/{username}', 'UserController@createUser');
class UserController extends BaseController {
public function checkUser(){
session_start();
if(isset($_SESSION["username"])){/*or use something like Auth::check()*/
return Response::json(array('exists' => 'true'));
/*or redirect e.g. return Redirect::action('HomeController@showHome');*/
/*or render a view e.g. return View::make('user.page', array('username' => $username));*/
}else{
return Response::json(array('exists' => 'false'));
}
}
....
1.1 如果存在,请不要执行显示基础模式和欢迎用户的js代码。
1.2 如果它不存在,请执行js代码并显示要求用户登录的模态窗口。
js (或通过视图从您的php代码输入,例如从控制器返回View :: make('user.page',array('username'=&gt; $ username )); )
$.ajax({
url: "checkUser"
success: function(data) {
if(!data.exists) {
$('#i-modal').foundation('reveal', 'open');
}else{
/*set any content e.g. welcome user*/
}
}
});
1.2.1 如果用户输入现有用户名或生成新用户名,请登录用户并将用户名存储在会话中。
<强> PHP 强>
....
Route::get('createUser/{username}', 'UserController@createUser');
class UserController extends BaseController {
....
/*your code slightly modified*/
public function createUser($username)
{
// Check if user isn't logged in yet
if (!Auth::check()/*&& if persistence is used, which is best to actually use it to persist usernames, check if the username is available*/) {
$newUser = new User;
//$newUser->username = 'user-'.Helpers::randomLowerCase(4);
$newUser->username=$username;
$newUser->save();
Auth::login($newUser);
} else {
return Response::json(array('created' => 'false'));
/* or return Redirect::action('HomeController@loginFailed');*/
}
// Return the user home
return Redirect::action('HomeController@showHome');
}
....
<强> JS 强>
$.ajax({
url: "createUser",
data:{usernae:the_username_from_modal}
success: function(data) {
if(!data.created) {
/*if the redirection is not handled by the controller, handle the failed login/registration of existing username*/
}
}
});
同样在您的代码中,您应该将用户名存储到持久层,以便检查现有用户名,允许用户使用他们现有的用户名并恢复/检索您可能仍在其中持久存在的任何类型的状态或数据你的应用。
答案 2 :(得分:2)
这没有任何意义。为什么要在页面加载时自动创建帐户?您不知道是谁加载了该页面,也不知道他们为什么或是否有资格创建帐户。除非用户单击“创建帐户”链接或执行等效的号召性用途,否则不应打开您的创建帐户模式。此外,在模式提交的表单数据已在后端进行了验证之前,实际上不应创建该帐户。
此模式中显示的表单应使用前端的JavaScript验证。这将使用户省去等待数据发布以发现他们没有正确完成表单的麻烦。您可以通过将Ajax合并到前端验证中来进一步增强UX。例如,用户名输入的onblur事件可以触发查询数据库并检查用户名是否可用的方法。您可以使用类似的Ajax方法来检查电子邮件地址是否已经注册。您可以使用stock jQuery验证插件完成所有这些操作。
请注意,前端验证仅为用户提供便利。您仍然需要验证服务器端的数据,因为客户端JS很容易被具有恶意意图的用户绕过。
答案 3 :(得分:-2)
我认为更好的解决方案是在HTML文档的标题中包含一个javascript变量User
。
为此,您可以使用
创建一个与所有视图共享的全局变量View::share('user', $current_user);
然后在<head>
的视图文件中添加以下内容:
<script type="text/javascript">var User = {{ $user->toJson() }}</script>
然后你可以做类似的事情:
if (User.id == 0)
$('#i-modal').foundation('reveal', 'open');