2009-11-06 45 views
2

如果我有一個人的模型first_namelast_name,我該如何創建並顯示full_name?我想在我的編輯和視圖視圖(即「編輯弗蘭克盧克」)和其他地方的頂部顯示它。簡單地將回波降至first_namelast_name不是乾燥的。需要在蛋糕全名PHP

對不起,如果這是一個非常簡單的問題,但沒有任何工作。

謝謝 弗蘭克盧克

編輯爲清楚:好吧,我對人模型的功能。

function full_name() { 
    return $this->Person->first_name . ' ' . $this->Person->last_name; 
} 

在視圖中,我稱之爲

echo $person['Person']['full_name'] 

這給了我,我有一個未定義的指標的通知。從視圖中調用函數的正確方法是什麼?我必須在控制器或其他地方執行嗎?

回答

2

如果你想要的只是顯示一個完整的名稱,而不需要做任何數據庫操作(比較,查找),我認爲你應該只在視圖中連接你的字段。

這將更符合MVC設計模式。在你的例子中,你只是想以不同的方式查看數據庫中的信息。

由於連接操作很簡單,因此可能不會通過將代碼放置在單獨的函數中來節省大量代碼。我認爲它最容易在視圖文件中完成。

如果你想做更多花哨的事情(即改變大小,返回一個鏈接給用戶)我建議創建一個元素,你用用戶數據調用。

+0

這涵蓋了需求。我繼續這個元素。 – 2009-11-09 17:33:01

0

您可能需要從數據庫中返回兩個字段,並將它們連接成一個字符串變量,然後才能顯示。

+0

這就是我一直在嘗試的。我可以讓這個功能很好。它叫它讓我晾乾。我應該更清楚。 – 2009-11-06 22:51:55

2

save()方法設置的數組僅返回數據庫中的字段,它們不調用模型函數。要正確使用上面的函數(位於模型),你將需要添加以下內容:

控制器,在$操作方法:

$this->set('fullname', $this->Person->full_name(); 
// must have $this-Person->id set, or redefine the method to include $person_id 
視圖

echo $fullname; 

基本上,您需要使用控制器從模型中收集數據,並將其分配給控制器。這與您之前的過程相同,您可以將查詢中返回的數據從find()調用分配給變量,除非您從其他來源獲取數據。

2

有多種方法可以做到這一點。一種方法是在模型類中使用afterFind函數。 參見:http://book.cakephp.org/view/681/afterFind

但是,這個函數不能很好地處理嵌套數據,相反,它並沒有處理它! 因此,我使用一個afterFind功能在通過所述結果集行走app_model

function afterFind($results, $primary=false){ 
    $name = isset($this->alias) ? $this->alias : $this->name; 
    // see if the model wants to attach attributes 
    if (method_exists($this, '_attachAttributes')){ 
     // check if array is not multidimensional by checking the key 'id' 
     if (isset($results['id'])) { 
      $results = $this->_attachAttributes($results); 
     } else { 
      // we want each row to have an array of required attributes 
      for ($i = 0; $i < sizeof($results); $i++) { 
       // check if this is a model, or if it is an array of models 
       if (isset($results[$i][$name])){ 
        // this is the model we want, see if it's a single or array 
        if (isset($results[$i][$name][0])){ 
         // run on every model 
         for ($j = 0; $j < sizeof($results[$i][$name]); $j++) { 
          $results[$i][$name][$j] = $this->_attachAttributes($results[$i][$name][$j]); 
         } 
        } else { 
         $results[$i][$name] = $this->_attachAttributes($results[$i][$name]); 
        } 
       } else { 
        if (isset($results[$i]['id'])) { 
         $results[$i] = $this->_attachAttributes($results[$i]); 
        } 
       } 
      } 
     } 
    } 
    return $results; 
} 

然後我添加_attachAttributes函數模型中的類,例如用於在你的Person.php中

function _attachAttributes($data) { 
    if (isset($data['first_name']) && isset($data['last_name'])) { 
     $data['full_name'] = sprintf("%s %s %s", $data['first_name'], $data['last_name']); 
    } 
    return $data; 
} 

該方法可以處理嵌套modelData,例如,人有許多帖子,那麼這個方法也可以在Post模型中附加屬性。

該方法也記住,由於使用別名而不僅僅是名稱(這是className),所以具有除className之外的其他名稱的鏈接模型是固定的。

0

http://old.nabble.com/Problems-with-CONCAT-function-td22640199.html http://teknoid.wordpress.com/2008/09/29/dealing-with-calculated-fields-in-cakephps-find/

閱讀的第一個,找出如何使用「字段」鍵即找到(「所有」,陣列(「字段」 =>數組())到CONCAT傳遞給CakePHP的查詢生成器。

第二個鏈接顯示您如何合併,當您使用自定義字段回適當位置,在返回的結果是得到返回的數字指標。

這當然應該放在模型功能並從那裏調用。