2014-09-05 167 views
0

我有一些工作代碼,當前在Joomla中生成一個動態的文章列表。這是我正在開發的任務系統的一部分。每篇文章(任務)都有一個自定義的先決條件值分配給它。我已經使用名爲Fields Attach的擴展名來分配這些值,它允許您定義自定義文章屬性並將它們存儲在數據庫中。下面的代碼列出了所有具有prereq值爲0的任務或具有與完成的任務表中任務的物品ID匹配的prereq值的任何任務。檢查數組中的所有值是否存在於表中

現在,當用戶提交任務時,它將文章信息(ID,標題等)存儲在已完成的任務表中。如果一個任務的prereq值與尚未完成任務的id匹配,則不會顯示。希望這是有道理的。

所以,我的問題是這樣的:我如何存儲文章ID的數組?例如,如果我想要一個特定的任務來擁有多個先決條件,我可以將1,2,3等分配給該任務。但是,我該如何檢查以確保存儲數組中的所有值都存在於完成的任務表中?我必須分配多個先決條件來完成這個系統的工作。它可以幫助顯示我當前的代碼:

這是我使用的編譯列表中查詢:

$query = "SELECT c.id, c.title, c.catid, r.user_id, r.prereqID, f.fieldsid, f.articleid, f.value FROM arp2i_fieldsattach_values AS f 
LEFT JOIN arp2i_content AS c 
ON f.articleid=c.id 
AND f.fieldsid=5 
AND f.value!=0 
LEFT JOIN arp2i_completed_quests AS r 
ON r.user_id = $userID 
ORDER BY f.articleid, c.id"; // prepare query 

$db = &JFactory::getDBO(); // get database object 
$db->setQuery($query); // apply query 
$prereqs = $db->loadObjectList(); // execute query, return result list 

顯示列表中的PHP:

foreach ($prereqs as $prereq){ // loop through articles 

if ($prereq->fieldsid == 1) { 
$questXp2 = $prereq->value; 
} 

else if ($prereq->fieldsid == 3) { 
$hexValue2 = $prereq->value; 
} 

else if ($prereq->fieldsid == 4) { 
$image2 = $prereq->value; 
} 

if ($prereq->catid == $catID 
&& $prereq->prereqID == $prereq->value) { 

echo '<div class="questBlock" style="background-color:' . $hexValue2 . ';">' . '<a class="questLink" href="http://localhost/quest/index.php/quests/' . $prereq->articleid . '-' . $prereq->c.title . '">' . '<img src="images/documents/' . $prereq->articleid . '/' . $image2 . ' " />' . $prereq->title . '<span class="xpFloat">' . $questXp2 . ' XP' . '</span>' . '</a>' . '</div>' ;} 

} 

爲了澄清,假設我有4個任務,其中物品ID爲1,2,3和4.我希望任務4具有1,2,3的先決條件值。這樣,任務4將不會顯示,直到任務1,2和3已完成。任何援助將不勝感激。

回答

0

由於您的任務存儲在數據庫數組中,您可以在顯示文章之前添加驗證,並使用php in_array()函數進行比較。

下面是基本的語法示例:

<?php 
$os = array("Mac", "NT", "Irix", "Linux"); 
if (in_array("Irix", $os)) { 
    echo "Got Irix"; 
} 
if (in_array("mac", $os)) { 
    echo "Got mac"; 
} 
?> 

祝您好運!

1

如果要從數據庫中選擇所有任務,然後根據其先決條件篩選這些任務,可以將prereqID字段更改爲VARCHAR(512)(或不同的適當大小),並將先決條件陣列存儲爲JSON編碼串。請參閱PHP函數json_encodejson_decode

取決於你在數據庫中有多少任務,這可能不是最好的想法,但它可能是最容易實現的。

另一種可能性是,從表中刪除arp2i_completed_quests領域prereqID,然後創建一個新的n:m -table arp2i_prereqs映射任務到其先決條件是這樣的:

CREATE TABLE arp2i_prereqs (article_id INT , prereq_id INT); 

我用INT在這裏,因爲我不不知道文章ID的確切數據類型。相應地更改它。

對於每個先決條件,將一條記錄插入到將該文章映射到其先決條件的表中。你的情況會是這樣的:

article_id prereq_id 
---------------------- 
     4   1 
     4   2 
     4   3 

當選擇從你的數據庫的任務一定要完全外連接與此表,否則你會過濾掉那些沒有先決條件的任務。

相關問題