2012-05-22 102 views
1

我正在使用ExpressionEngine對網站進行一些更改,但有一個概念我似乎無法理解,並且可能是編碼具有預先提供的方法的解決方法。表達式引擎中的自定義字段名稱映射

具體來說,對於渠道和成員,原創者添加了多個自定義字段。我來自傳統的數據庫背景,表中的每一列都有一個特定的有意義的名字。我也習慣通過添加一個與唯一鍵相關的相關表來擴展專有數據,同樣,相關表中的字段名也是有意義的。

但是,在EE中,當您添加自定義字段時,它會在表中將它們創建爲field_id_x,並將條目放入另一個表中,告訴您這些是什麼。

現在,從用戶界面的角度來看,這對管理員來說是非常好的,但是在編寫任何代碼時這是一個頭痛的問題。

好的,有模板標籤,但我傾向於不使用它們,無論如何它們在數據庫查詢中都不好。

是否有一種簡單的方法來對成員表進行查詢,然後將m_field_1作爲其真正稱爲 - 在我的情況下爲「addresslonglat」。

在我正在處理的表格中有幾十個這樣的字段,目前我正在使用固定名稱(如「m_field_id_73」)來解決這些字段,這意味着什麼都沒有。

有人知道一個簡單的方法可以輕鬆地將數據和字段名稱組合在一起嗎?

理想情況下,我想做到以下幾點:

$result = $this->EE->db->query("select * from exp_member_data where member_id = 123")->row(); 
echo $result->addresslonglat; 

不是

echo $result->m_field_id_73; 

回答

1

這應該爲你工作:

<?php  
$fields = $data = array(); 
$member_fields = $this->EE->db->query("SELECT m_field_id, m_field_name FROM exp_member_fields"); 
foreach($member_fields->result_array() as $row) 
{ 
    $fields['m_field_id_'.$row['m_field_id']] = $row['m_field_name']; 
} 

$member_data = $this->EE->db->query("SELECT * FROM exp_member_data WHERE member_id = 1")->row(); 
foreach($member_data as $k => $v) 
{  
    if($k != 'member_id') 
    { 
     $data[$fields[$k]] = $v; 
    } 
} 
print_r($data); 
?> 

然後,只需使用新的$data陣列。

+0

完美的,我可以擴展EE的DB類以覆蓋row()和result()數組方法自動執行此操作,是否有一種方法可以確保我的DB版本可以加載以擴展作爲擴展的EE版本的CodeIgniter版本? – JamesB

+0

我不會那樣做,因爲這段代碼是專門針對成員字段的...看起來過分。如果你在附加組件中使用它(希望是這種情況),並且想讓事情保持乾爽,只需將字段映射包裝到一個函數中,並將結果傳遞給它(例如,$ data = $ this-> _map_member_fields($ member_data);) –

+0

謝謝Derek,我只是希望他們在EE中更加明白如何從開發人員的角度處理自定義字段。我不認爲EE的數據庫管理得特別好,因爲它只是增加了列而不是正確地管理表。 – JamesB

相關問題