這次的問題之所以有點麻煩,是因為extra field是一個在預料不到系統會做什麽擴展的情況下預留的擴展能力,而它必然有局限性。局限性的體現就是,jos_bl_extra_values表只能將這個值存放為字符類型數據。
實際上,在處理這部份問題時,我採用的做法是將三個表聯合:jos_bl_players,jos_bl_extra_filds與jos_bl_extra_values。在jos_bl_extra_values中存放的正是前兩個表聯合后的值,它有兩個外鍵,分別是前兩者的主鍵,而這個組合是jos_bl_extra_values自身的組合主鍵。
在函數BL_PlayerEdit()中,當對數據進行查找時,SQL里用到的是LEFT JION:
SELECT ef.*,ev.fvalue as fvalue FROM #__bl_extra_filds as ef LEFT JOIN #__bl_extra_values as ev ON ef.id=ev.f_id AND ev.uid=? WHERE ef.published=1 AND ef.type='0' ORDER BY ef.ordering
這樣做的好處是,不需要在jos_bl_extra_values中為每個可能的組合都存儲一個記錄,而同時,在需要編輯球員時,又可以呈現出所有與該球員有關的額外參數。在這裡type字段被我用來標記是與球員有關的參數。
後臺:
現在的問題是,我們需要的是一個布爾類型,它在HTML里應該是一個check box。所以看來我們需要用e_table_show字段來標記布爾這種情況,同時在前端要用Javascript作一點小伎倆:
將bl_editPlayer()中原本輸出這幾欄的代碼改成:
<?php
for($p=0;$p<count($lists['ext_fields']);$p++){
if("1"==$lists['ext_fields'][$p]->e_table_view)
{
?>
<tr>
<td width="100">
<?php echo $lists['ext_fields'][$p]->name;?>
</td>
<td>
<input type="checkbox" id="extra-field-check" value="" <?php echo (isset($lists['ext_fields'][$p]->fvalue))&&("1"==$lists['ext_fields'][$p]->fvalue)?"checked='checked'":""?>/>
<input type="hidden" name="extraf[]" id="extra-field-hidden" value="<?php echo $lists['ext_fields'][$p]->fvalue?>" />
<input type="hidden" name="extra_id[]" value="<?php echo $lists['ext_fields'][$p]->id?>" />
</td>
</tr>
<?php
}
else
{
?>
<tr>
<td width="100">
<?php echo $lists['ext_fields'][$p]->name;?>
</td>
<td>
<input type="text" maxlength="255" size="60" name="extraf[]" value="<?php echo isset($lists['ext_fields'][$p]->fvalue)?htmlspecialchars($lists['ext_fields'][$p]->fvalue):""?>" />
<input type="hidden" name="extra_id[]" value="<?php echo $lists['ext_fields'][$p]->id?>" />
</td>
</tr>
<?php
}
}
?>
同時,在js中的submitbutton函數修改成:
function submitbutton(pressbutton) {
var form = document.adminForm;
if(pressbutton == 'player_apply' || pressbutton == 'player_save'){
if(form.first_name.value == '' || form.last_name.value == ''){
alert('<?php echo JText::_( 'BLBE_JSNOTICEPL' ); ?>');
}else if(form.team_id.value == 0){
alert('<?php echo JText::_( 'BLBE_SELTEAM' ); ?>');
}else{
// add by Vin 2012-07-21
if(getObj('extra-field-check').checked)
{
getObj('extra-field-hidden').value = '1';
}
else
{
getObj('extra-field-hidden').value = '0';
}
//
submitform( pressbutton );
return;
}
}else{
submitform( pressbutton );
return;
}
}
注意,在此之前,需要在這個函數的前面先調用:
joomsport_html::JS_getObj();
這樣的目的是將getObj()函數的js定義輸出到頁面中,實際上這個部份的js代碼是爲了瀏覽器兼容。
至於獲取和存取這些額外參數值到數據庫的PHP代碼,無需修改。
前臺:
下面是修改前端網站輸出,在視圖【罰牌記錄】中,在view.html.php文件中接近末尾的地方將一個代碼塊修改成:
foreach($panelty as $rec)
{
$rec->yellow_card = intval($rec->yellow_card);
$rec->red_card = intval($rec->red_card);
$rec->disci = intval($rec->disci);
$rec->overall = intval($st_name["red_disci_point"]) * $rec->red_card
+ intval($st_name["yellow_disci_point"]) * $rec->yellow_card
+ $rec->disci;
$query = "SELECT fvalue FROM #__bl_extra_values WHERE f_id = 2 AND uid =".$rec->player_id;
$db->setQuery($query);
$remark = $db->loadResult();
$rec->remark = $remark;
// add by Vin 2012-07-21
$query = "SELECT fvalue FROM #__bl_extra_values WHERE f_id = 4 AND uid =".$rec->player_id;
$db->setQuery($query);
$if_hgl_remark = $db->loadResult();
$rec->if_hgl_remark = ($if_hgl_remark === "1")?true:false;
// ends add
$pan_marr[] = (array)$rec;
}
然後將模板文件tmpl/default.php修改:
$red_font = "";
if($record['if_hgl_remark'])
{
$red_font = "class='vincent_red_font' ";
}
echo "<td ".$red_font.">" . $record['remark'] . "</td>";
echo "</tr>";