2013-08-09 3 views
1

저는 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> 
+0

이것은 속임수 문제와 관련이 없지만 POST 데이터가 포함될 수 있으므로 활동에'$ this-> request-> data'를 사용하지 마십시오. 그래서 여러분의 페이지 중 하나가 폼을 POST하면'$ this-> request-> data'에 많은 데이터가 저장되어서'activities' 테이블에 저장할 때 문제가 발생할 수 있습니다. '$ data [ 'User'] [ 'id'] = $ this-> Auth-> user ('id'); 등등을 사용하면됩니다. '$ this-> Activity-> save ($ data);를 통해 저장하십시오. – Costa

+0

re : dupes : 컨트롤러 및 오류 코드 중 하나에 대한 코드를 게시하십시오. 어디에서나'requestAction()'을 호출하고 있습니까? – Costa

+0

@Costa, 나는 당신이 말한대로 활동을 $ $ 데이터로 변경했으며, 프로필 페이지의 컨트롤러와 뷰를 사용하여 게시물을 업데이트했습니다.이 페이지는 중복을 초래하는 두 가지 중 하나입니다. – user2655021

답변

0

아마도 becaus 당신은 컨트롤러에

$this->redirect(array('action' => 'index')); 

과 같은 것을 가지고 있습니다. 인덱스 페이지가로드되면 beforeRender 함수가 다시 호출됩니다.

관련 문제