有两种方法可以解决这个问题:
作为单独的页面登录
这是推荐的方式,因为它更快、更安全。
- 有一个 index.php 页面,用于检查用户是否已登录。
- 如果用户已登录,您应该只需要您的实际系统索引文件,其中包括 ExtJs 标头。
- 如果用户未登录,您应该需要一个显示实际登录屏幕的 login.php 文件。此页面可能会或可能不会加载 ExtJs 库(因为此页面上的内容很少,我假设您在这里不需要 ExtJs 文件)。
例如,这是我的 index.php:
<?php
require_once('common/include/User.php');
if ( SessionUser()->IsLoggedIn() )
{
// chdir is simply to keep the correct paths when compiling the app.
// It works for php, but for html/css links you should use the base tag
// in your php/html file: <base href="app/"/>
chdir('app');
require_once('app/index.php');
} else {
require_once('login.php');
}
?>
然后app/index.php
是加载您的应用程序脚本和 ExtJs 库的实际索引文件。
login.php
只是一个相当简单的登录表单:
<?php
// Index file for logged out users (guests)
$iUserName = isset( $_POST['username'] ) ? $_POST['username'] : '';
$iLoginErrorTxt = '';
if ( isset( $_POST['username'] ) )
{
require_once('common/include/User.php');
$iLoginError = SessionUser()->Authenticate( $_POST['username'], $_POST['password'] );
if ( $iLoginError['success'] )
{
// Login successful - reload the page.
header( "Location: " . $_SERVER['PHP_SELF'] );
exit();
} else {
// Login failed - present an error.
$iLoginErrorTxt = $iLoginError['error'];
}
}
?>
<html>
<head>
<title>My System</title>
</head>
<body>
<form class="login-form" action="<?=$_SERVER['PHP_SELF']?>" enctype="application/x-www-form-urlencoded" method="post">
<input name="username" size="25" type="text" value="<?=$iUserName?>" value spellcheck="false" placeholder="User Name"/>
<input name="password" size="25" type="password" value spellcheck="false" placeholder="Password"/>
<div class="error-message"><?=$iLoginErrorTxt?></div>
<input name="submit" type="submit" value="Login" />
</form>
</body>
</html>
从 ExtJs 应用程序内登录
不强烈推荐这种方法,因为您需要在用户进行身份验证之前加载整个 ExtJs 框架和很可能是您的应用程序脚本。
一个可能的实现将涉及拥有一个容器面板,它一次只显示一个面板,可以是登录页面,也可以是实际的应用程序页面。
app.js 可能包含以下代码:
refs:
[{
ref: 'contentPanel',
selector: 'viewport > #contentPanel'
}],
controllers: [
'MainMenu'
],
launch: function() {
// Enable quicktips
Ext.QuickTips.init();
// Create the viewport
Ext.create('Ext.container.Viewport', {
layout: 'fit',
items: [
{
xtype: 'panel',
id: 'contentPanel',
layout: 'card',
dockedItems: [{
xtype: 'mainmenu',
dock: 'top'
}]
}
]
});
},
然后你可以这样做:
var iContentPanel = this.getContentPanel();
iContentPanel.getLayout().setActiveItem( iPage );
iPage
您希望显示的任何页面(面板)在哪里。
显然有一些方法可以改进它的工作方式,例如,通过动态加载控制器;但我相信这是一个不同问题的故事。
无论如何,我强烈建议您考虑第一种方法。