2014-09-05 115 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 

当选择从你的数据库的任务一定要完全外连接与此表,否则你会过滤掉那些没有先决条件的任务。

相关问题