我使用的是Zend 2.0,我从未将EXTJS与Zend结合使用。
这是我在视图/ login / index.phtml中的extjs代码:
<?php $this->inlineScript()->captureStart() ?>
var LoginWindow
Ext.onReady(function() {
LoginWindow = new Ext.create('Ext.window.Window',{
title: 'Login',
closable: false,
draggable: false,
resizable: false,
width: 370,
items: [
Ext.create('Ext.form.Panel', {
id: 'LoginForm',
bodyPadding: 5,
width: 350,
url: '/',
layout: 'anchor',
defaults: {
anchor: '100%'
},
// The fields
defaultType: 'textfield',
items: [{
fieldLabel: 'Username',
name: 'user',
allowBlank: false
},{
fieldLabel: 'Password',
inputType: 'password',
name: 'pw',
allowBlank: false
}],
// Reset and Submit buttons
buttons: [{
text: 'Reset',
handler: function() {
this.up('form').getForm().reset();
}
},
{
text: 'Submit',
formBind: true,
disabled: true,
handler: function() {
var form = this.up('form').getForm();
}
}]
})
]
});
Ext.getBody().mask()
LoginWindow.show()
});
<?php $this->inlineScript()->captureEnd() ?>
现在我不确定如何将用户名/密码发送到LoginController.php并使用该模型从数据库表中验证用户名/密码。
任何示例或可能的解决方案都会有所帮助。
答案 0 :(得分:6)
请不要将以下内容视为即用型解决方案。我还添加了一些您在开始管理登录时会发现有用的部分。您的主要部分应该是控制器的路由。除了ExtJS部分之外,我还保留了视图内容。无论如何,我希望这会对你有所帮助。
首先,您的表单中存在一些问题。尝试以下
var loginWindow;
Ext.onReady(function() {
loginWindow = new Ext.create('Ext.window.Window',{
title: 'Login',
closable: false,
draggable: false,
resizable: false,
width: 370,
modal: true,
items: [
Ext.create('Ext.form.Panel', {
id: 'LoginForm',
bodyPadding: 5,
width: 350,
layout: 'anchor',
defaults: {
anchor: '100%'
},
defaultType: 'textfield',
items: [{
fieldLabel: 'Username',
name: 'user',
allowBlank: false
},{
fieldLabel: 'Password',
inputType: 'password',
name: 'pw',
allowBlank: false
}],
url: 'Login/Auth', // first one should be your controller, second one the controller action (this one need to accept post)
buttons: [
{
text: 'Reset',
handler: function() {
this.up('form').getForm().reset();
}
},
{
text: 'Submit',
formBind: true,
disabled: true,
handler: function() {
var form = this.up('form').getForm();
if (form.isValid()) {
form.submit({
success: function(form, action) {
Ext.Msg.alert('Success', 'Authenticated!');
},
failure: function(form, action) {
Ext.Msg.alert('Failed', 'Authentication Failed');
}
});
}
}
}
]
})
]
}).show();
// Ext.getBody().mask(); <- modal property does the same
});
现在到ZF2
路由
应用程序的每个页面都称为操作,操作被分组到模块中的控制器中。因此,您通常会将相关操作分组到控制器中。
使用模块的module.config.php文件中定义的路由完成URL到特定操作的映射。您应该为Login操作添加路由。这是更新的模块配置文件,其中包含新的代码块。
<?php
return array(
'controllers' => array(
'invokables' => array(
'Login\Controller\Login' => 'Login\Controller\LoginController',
),
),
// The following section is new and should be added to your file
'router' => array(
'routes' => array(
'login' => array(
'type' => 'segment',
'options' => array(
'route' => '/login[/:action][/:username][/:password]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'username' => '[a-zA-Z][a-zA-Z0-9_-]*',
'password' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'controller' => 'Login\Controller\Login',
'action' => 'index',
),
),
),
),
),
'view_manager' => array(
'template_path_stack' => array(
'login' => __DIR__ . '/../view',
),
),
);
路线名称为“登录”,其类型为“段”。段路由允许您在URL模式(路由)中指定将映射到匹配路由中的命名参数的占位符。在这种情况下,路由是 / login [/:action] [/:id] ,它将匹配以/ login开头的任何URL。下一个段将是一个可选的操作名称,最后下一个段将映射到一个可选的id。方括号表示段是可选的。约束部分允许您确保段中的字符符合预期,因此您只能使用字母开头,后续字符只能是字母数字,下划线或连字符。
控制器
现在您需要设置控制器。控制器是一个通常称为{Controller name} Controller的类。请注意,{Controller name}必须以大写字母开头。此类位于模块的Controller目录中名为{Controller name} Controller.php的文件中。在你的情况下,这将是模块/登录/ src /登录/控制器。每个操作都是控制器类中的一个名为{action name} Action的公共方法。在你的情况下,{action name}应该以小写字母开头。
<?php
namespace Login\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class LoginController extends AbstractActionController
{
public function authenticateAction($username, $password)
{
$params = array('driver' => 'driver',
'dbname' => 'name');
$db = new DbAdapter($params);
use Zend\Authentication\Adapter\DbTable as AuthAdapter;
// Oversimplified example without even hashing the password
$adapter = new AuthAdapter($db,
'Logins',
'username',
'password'
);
// get select object (by reference)
$this->_adapter->setIdentity($username);
$this->_adapter->setCredential($password);
$result = $adapter->authenticate();
if($result->isValid()) {
// authenticated
}
}
protected $loginTable;
public function getLoginTable()
{
if (!$this->loginTable) {
$sm = $this->getServiceLocator();
$this->loginTable = $sm->get('Login\Model\LoginTable');
}
return $this->loginTable;
}
}
查看脚本
这些文件将由DefaultViewStrategy执行,并将传递从控制器操作方法返回的任何变量或视图模型。这些视图脚本存储在我们模块的views目录中,该目录位于以控制器命名的目录中。立即创建这四个空文件:
模块/登录/视图/登录/登录/ authenticate.phtml`
模型
在 module / Login / src / Login / Model 下创建名为 Login.php 的文件:
<?php
namespace Login\Model;
class Login
{
public $id;
public $username;
public $password;
public function exchangeArray($data)
{
$this->id = (isset($data['id'])) ? $data['id'] : null;
$this->username = (isset($data['username'])) ? $data['username'] : null;
$this->password = (isset($data['password'])) ? $data['password'] : null;
}
}
在 module / Login / src / Login / Model 目录中创建 LoginTable.php 文件,如下所示:
<?php
namespace Login\Model;
use Zend\Db\TableGateway\TableGateway;
class LoginTable
{
protected $tableGateway;
public function __construct(TableGateway $tableGateway)
{
$this->tableGateway = $tableGateway;
}
public function fetchAll()
{
$resultSet = $this->tableGateway->select();
return $resultSet;
}
public function getLogin($id)
{
$id = (int) $id;
$rowset = $this->tableGateway->select(array('id' => $id));
$row = $rowset->current();
if (!$row) {
throw new \Exception("Could not find row $id");
}
return $row;
}
public function saveLogin(Login $login)
{
$data = array(
'username' => $login->password,
'password' => $login->username,
);
$id = (int)$login->id;
if ($id == 0) {
$this->tableGateway->insert($data);
} else {
if ($this->getLogin($id)) {
$this->tableGateway->update($data, array('id' => $id));
} else {
throw new \Exception('Form id does not exist');
}
}
}
public function deleteLogin($id)
{
$this->tableGateway->delete(array('id' => $id));
}
}
使用ServiceManager配置表网关并注入LoginTable
将此方法添加到 module / Login 中 Module.php 文件的底部。
<?php
namespace Login;
// Add these import statements:
use Login\Model\Login;
use Login\Model\LoginTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
class Module
{
// getAutoloaderConfig() and getConfig() methods here
// Add this method:
public function getServiceConfig()
{
return array(
'factories' => array(
'Login\Model\LoginTable' => function($sm) {
$tableGateway = $sm->get('LoginTableGateway');
$table = new LoginTable($tableGateway);
return $table;
},
'LoginTableGateway' => function ($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(new Login());
return new TableGateway('login', $dbAdapter, null, $resultSetPrototype);
},
),
);
}
}
最后,您需要配置ServiceManager,以便它知道如何获取 Zend \ Db \ Adapter \ Adapter 。 使用以下代码修改 config / autoload / global.php
<?php
return array(
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=zf2tutorial;host=localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter'
=> 'Zend\Db\Adapter\AdapterServiceFactory',
),
),
);
您应该将数据库凭据放在 config / autoload / local.php
中<?php
return array(
'db' => array(
'username' => 'YOUR USERNAME HERE',
'password' => 'YOUR PASSWORD HERE',
),
);
您还可以找到以下有用的代码段(请参阅 tests 和演示):
答案 1 :(得分:0)
在一个问题中你有几个问题。首先研究Zend_Auth如何验证密码,Zend_Controller如何从请求中检索参数,Zend_Form如何发送这些参数,Zend_View如何将一些js与你的应用程序的其余部分联系起来。
简而言之,密码和用户名通过表单发送,您的应用程序通过Request对象的getParams方法获取它们。
我没有太多的链接要发送给你,ZF2的文档目前还有很多。
答案 2 :(得分:0)
你不是很清楚你在问什么,所以我要写一个通用的答案,它不会特定于zend框架因为我不知道zend框架。但以下几点适用于任何用于身份验证的技术。
您必须对服务器执行普通表单POST。您可以 通过使用
发送AJAX帖子来实现extjsform.submit(options)
或通过设置standardSubmit : true
进行正常的HTML提交
表格。两者的文档都是here&amp; here。如
在Ext.form.Panel
虽然没有列为FormPanel的配置选项,但是 FormPanel类接受所支持的所有配置选项 Ext.form.Basic类,并将它们传递给内部 BasicForm创建时。
密码应以加密格式存储在数据库中 安全原因。此外,出于同样的安全原因,密码 解密存储后,不应在代码中进行比较 来自DB的密码。因此,标准查询验证 就像
select * from users where username='username' and password='password'
传递给上述查询的密码也应加密。该 上述查询的结果应该确定用户是否有 已成功通过身份验证。如果查询返回0结果, 然后验证失败。另外,使用的优点 上面的风格是你有一个用户对象 无需进行额外查询即可与会话相关联。
因此,跟随应该是这样的:
我希望这能回答你的问题。
答案 3 :(得分:0)
ZfcUser模块具有登录身份验证的有效实现。它是ZF-Commons模块组的一部分,所以你也可以赌它积极维护。
非常适合参考或只是直接使用。