我有一些工作代码,目前在Joomla中生成一个动态的文章列表。这是我正在开发的任务系统的一部分。每篇文章(任务)都有一个分配给它的自定义先决条件值。我使用名为Fields Attach的扩展名分配了这些值,允许您定义自定义文章属性并将其存储在数据库中。下面的代码列出了prereq值为0的所有任务,或者任何具有与已完成任务表中任务的文章ID匹配的prereq值的任务。
现在,当用户提交任务时,它会将文章信息(id,title等)存储在已完成的任务表中。如果任务的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 :(得分:1)
如果要从数据库中选择所有任务,然后根据先决条件过滤这些任务,可以将prereqID
字段更改为VARCHAR(512)
(或不同的,适当的大小)并存储数组作为JSON编码的字符串的先决条件。请参阅PHP函数json_encode和json_decode。
根据您在数据库中拥有的任务数量,这可能不是最好的主意,但它可能是最容易实现的。
另一种可能性是从表prereqID
中删除字段arp2i_completed_quests
,然后创建一个新的n:m
- 表arp2i_prereqs
,将任务映射到其先决条件,如下所示:< / p>
CREATE TABLE arp2i_prereqs ( article_id INT , prereq_id INT );
我在这里使用了INT
,因为我不知道文章ID的确切数据类型。相应地改变它。
对于每个先决条件,在该表中插入一条记录,将文章映射到其先决条件。在你的情况下看起来像:
article_id prereq_id
----------------------
4 1
4 2
4 3
从数据库中选择任务时,请确保使用此表进行完全外连接,否则您将过滤掉那些没有先决条件的任务。
答案 1 :(得分: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";
}
?>
祝你好运!