저는 CakePHP에 익숙하지 않아 많은 행동과 모든 것을 배우고 있습니다. 하나는 솔루션을 찾기 위해 애 쓰고 있어요 사실은 내가 beforeRender를 사용하여 AppController에 코드가 있다는 것입니다. 코드는 활동을 기록하기 위해 사용자의 ID, IP 주소 및 페이지로드의 현재 시간을 데이터베이스에 저장합니다.CakePHP에서는 AppController의 beforeRender가 데이터베이스에 두 번 저장됩니다.
나는 다소 흥미로운 결과를 얻고 있습니다. 답을 찾기 위해 주변을 둘러 보았지만 찾지 못했습니다. 다른 컨트롤러 (이 경우 UserController)에 의해 제어되는 페이지를로드하면 데이터베이스에 데이터를 저장하고 정확한 복제본을 저장합니다.
지금은 몇 페이지 만 있습니다. 기본 색인 페이지, 로그인 페이지, 등록 페이지, 사용자 프로필 페이지 및 사용자 설정 페이지 인덱스 페이지를 제외하고 모두 UserController에서 제어되지만 로그인/등록 페이지에서 리디렉션되어/URLs/login 대신/login이됩니다. 흥미롭게도, 로그인 페이지 또는 등록 페이지에서 프로필 및 설정 페이지 만 복제본을 만들지는 않습니다.
필자는 원래 beforeFilter에 코드를 삽입했으며, 2 대신에 동일한 데이터를 3 부 복사했습니다. afterFilter에서도 시도했지만 2 부는 여전히 남아 있습니다.
내가 언급 한 세 가지 필드는 데이터베이스의 사용자 테이블에 위치하지 않습니다. 자체 테이블 '활동'이 있습니다.
이것은 AppController가 내 beforeRender 코드 :
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');
}
그리고 : 요청에 따라
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);
}
}
,이 프로필 페이지에 대한 컨트롤러 액션입니다, 그들 중 하나가 중복의 원인 프로필 페이지보기 (대부분 기본 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>
이것은 속임수 문제와 관련이 없지만 POST 데이터가 포함될 수 있으므로 활동에'$ this-> request-> data'를 사용하지 마십시오. 그래서 여러분의 페이지 중 하나가 폼을 POST하면'$ this-> request-> data'에 많은 데이터가 저장되어서'activities' 테이블에 저장할 때 문제가 발생할 수 있습니다. '$ data [ 'User'] [ 'id'] = $ this-> Auth-> user ('id'); 등등을 사용하면됩니다. '$ this-> Activity-> save ($ data);를 통해 저장하십시오. – Costa
re : dupes : 컨트롤러 및 오류 코드 중 하나에 대한 코드를 게시하십시오. 어디에서나'requestAction()'을 호출하고 있습니까? – Costa
@Costa, 나는 당신이 말한대로 활동을 $ $ 데이터로 변경했으며, 프로필 페이지의 컨트롤러와 뷰를 사용하여 게시물을 업데이트했습니다.이 페이지는 중복을 초래하는 두 가지 중 하나입니다. – user2655021