我是CakePHP的新手,所以我仍然在学习很多行为和一切。我很难找到一个解决方案,那就是我在AppController中有一个使用beforeRender的代码。该代码将用户的ID、IP地址和页面加载的当前时间保存到数据库中,以便记录活动。
我得到了一个相当奇怪的结果,尽管我四处寻找答案,但还是没能找到。在加载由另一个控制器(在本例中为UserController)控制的页面时,它会将数据保存到数据库中,并保存一个完全重复的数据。
现在我只有几页。主索引页面、登录页面、注册页面、用户配置文件页面和用户设置页面。除了索引页面之外的所有内容都在UserController中控制,但我有一个来自登录和注册页面的重定向,因此它们的URL是/login而不是/users/login。有趣的是,重复项并不是在登录或注册页面上创建的,只是在配置文件和设置页面上创建。
我最初把代码放在beforeFilter中,得到了3个相同数据的副本,而不是2个。我也在afterFilter中尝试过,但我仍然有两份。
我应该提到的是,我正在更新的三个字段不在数据库的Users表中——它们有自己的表"Activities"。
这是我在AppController中的beforeRender代码:
public function beforeRender() {
if ($user = $this->Session->read('Auth.User')) {
$this->loadModel('User');
$this->loadModel('Activity');
$data['User']['id'] = $this->Auth->user('id');
$data['Activity']['user_ip'] = $this->request->clientIp();
$data['Activity']['user_id'] = $data['User']['id'];
$data['Activity']['last_activity'] = date("Y-m-d H:i:s");
$this->Activity->save($data);
}
}
根据请求,这是配置文件页面的控制器操作,是导致重复的操作之一:
public function profile($id = null) {
$this->loadModel('User');
$this->User->id = $id;
$this->request->data['User']['id'] = $this->Auth->user('id');
if (!$this->User->exists()) {
throw new NotFoundException(__('User not found'));
}
$user = $this->User->findById($id);
if (!$user) {
throw new NotFoundException(__('User not found'));
}
$this->set('user', $this->User->read(null, $id));
$this->set('title_for_layout', $user['User']['screenname'] . "'s" . ' ' . 'Profile');
}
配置文件页面的视图(主要是基本的HTML):
<?php echo $this->Html->css('profile'); ?>
<h2><?php echo h($user['User']['screenname']); ?></h2>
<center><table cellpadding="6">
<tr><center>
<td><center><div class="ha_image"></div>
</td>
<td><center><h4>User Information</h4>
<div class="user_info">
<table class="">
<tr>
<td class="stats_names">
Member Type
</td>
<td class="stats_stats">
--
</td>
</tr>
<tr>
<td class="stats_names">
Member Since
</td>
<td class="stats_stats">
<?php echo date('M jS, Y', strtotime($user['User']['created'])); ?>
</td>
</tr>
<tr>
<td class="stats_names">
Last Active
</td>
<td class="stats_stats">
<?php echo date('M j, Y h:i A', strtotime($user['User']['last_active'])); ?>
</td>
</tr>
<tr>
<td class="laststats_names">
Status
</td>
<td class="laststats_stats">
</td>
</tr>
<tr>
<td class="stats_names">
Totals
</td>
<td class="stats_stats">
--
</td>
</tr>
<tr>
<td class="stats_names">
Forum Posts
</td>
<td class="stats_stats">
--
</td>
</tr>
<tr>
<td class="stats_names">
Achievements
</td>
<td class="stats_stats">
--
</td>
</tr>
<tr>
<td class="laststats_names">
Quests Done
</td>
<td class="laststats_stats">
--
</td>
</tr>
</table>
也许是因为你有类似的东西
$this->redirect(array('action' => 'index'));
在您的控制器中。加载索引页时,将再次调用beforeRender函数。