我有一个cakePHP应用程序,我希望我的登录和注册表单位于我遵循本教程的同一页面中:http://bakery.cakephp.org/articles/RabidFire/2010/06/26/multiple-forms-per-page-for-the-same-modeland我能够使注册部分正常工作,但登录部分不是工作我收到以下错误:“缺少数据库表错误:在数据源默认情况下找不到模型Tbluserlogin的表tblforumuserlogins。” 这是我正在使用的控制器:
class TblusersController extends AppController {
public function signup() {
$this->loadModel('Tbluser');
$this->loadModel('Tbluserlogin');
if (!empty($this->data)) {
if (isset($this->data['Tbluser'])) { // Check if the signup Form was submitted
$this->Session->setFlash("SignUp Form was submitted.","notif");
} else if (isset($this->data['Tbluserlogin'])) { // Check if the login Form was submitted
$this->Session->setFlash("Login Form was submitted.","notif");
}
}
}
}
?>
我正在使用的模型是:
Tbluser.php
<?php
class Tbluser extends AppModel{
public $validate = array(
'username'=>array(
array(
'rule'=>'alphaNumeric',
'allowEmpty'=>false,
'message'=>'Invalide Username!'
),
array(
'rule' => array('minLength', '4'),
'message' => 'Username has to be more than 3 chars'
),
array(
'rule'=>'isUnique',
'message'=>'Username already taken!'
)
),
'password' => array(
array(
'rule' => 'alphaNumeric',
'allowEmpty'=>false,
'message' => 'Password must be AlphaNumeric!'
),
array(
'rule' => array('minLength', '4'),
'message' => 'Username has to be more that 3 chars'
),
array(
'rule' => array('confirmPassword', 'cakehashedpassword'),
'message' => 'Passwords do not match'
)),
'email'=>array(
array(
'rule'=>array('email',true),
'required'=>true,
'allowEmpty'=>false,
'message'=>'Invalide email adress!'
),
array(
'rule'=>'isUnique',
'message'=>'Mail adress already taken!'
)
)
);
}
?>
Tbluserlogin.php模型:
<?php
class Tblforumuserlogin extends Tblforumuser{
}
?>
我的观看文件是“signup.ctp”
<h4>Sign up</h4>
<div><?php echo $this->Session->flash();?></div>
<?php
echo $this->Form->create("Tblforumuser", array('url' => '/Tblusers/signup'));
echo $this->Form->input('username' ,array('label'=>'Username<b style="color:red;">'));
echo $this->Form->input('password' ,array('label'=>'Password<b style="color:red;">','type' => 'password'));
echo $this->Form->input('email' ,array('label'=>'Email<b style="color:red;">'));
echo $this->Form->end('Register');
?>
<h4>Log in to Ohyeahhh</h4>
<div><?php echo $this->Session->flash(); ?></div>
<?php echo $this->Form->create("Tbluserlogin", array('url' => '/Tblusers/signup')); ?>
<?php echo $this->Form->input('username' ,array('label'=>"Username :")); ?>
<?php echo $this->Form->end('Login'); ?>
谢谢。
答案 0 :(得分:2)
您没有遵循CakePHP约定,因此CakePHP无法自动找到要使用的正确数据库表;
默认情况下,CakePHP模型应该以database-table命名;例如对于表foos
(复数),模型应命名为Foo
(单数)。
如果您没有遵循约定,则应通过useTable
属性手动指定要用于模型的表;
class Tblforumuserlogin extends Tblforumuser
{
public $useTable = 'tblforumusers';
}
使用相同的属性,这也允许您创建更多“友好”的模型名称(也就是说,如果您无法重命名数据库表,这可能是更好的方法);
class User extends AppModel
{
public $useTable = 'tblforumusers';
]
由于这两个模型仅用于区分已提交的“哪个”表单,因此这似乎是一个很大的开销。另一种方法是仅使用“正常”模型,但将操作指向单独的“登录”操作;
class TblusersController extends AppController
{
public $uses = array(
'Tbluser';
);
public function signup()
{
if ($this->request->is('post')) {
// handle sign-up
}
}
public function login()
{
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirectUrl);
}
}
// Login failed or no form submitted
return $this->redirect(array('action' => 'signup'));
}
}
在你的视野中;
echo $this->Form->create("Tblforumuser");
echo $this->Form->input('username' ,array('label'=>'Username<b style="color:red;">'));
echo $this->Form->input('password' ,array('label'=>'Password<b style="color:red;">'));
echo $this->Form->input('email' ,array('label'=>'Email<b style="color:red;">'));
echo $this->Form->end('Register');
echo $this->Form->create("Tblforumuser", array('action' => 'login'));
// etc...
echo $this->Form->end('Login');
只需在表单中添加隐藏字段即可指示已发送的表单;
echo $this->Form->create("Tblforumuser");
echo $this->Form->hidden('formsent', array('value' => 'register'));
// etc...
echo $this->Form->end('Register');
echo $this->Form->create("Tblforumuser");
echo $this->Form->hidden('formsent', array('value' => 'login'));
// etc...
echo $this->Form->end('Login');
在你的控制器内;
if ($this->request->is('post')) {
if ('register' === $this->request->data['Tblforumuser']['formsent']) {
// register
} else {
// login
}
}