I am trying to create a forum using php in a MVC architecture.
This is my database setup:
Table: forum_categories
`forum_categories` (
`cat_id` INT(8) NOT NULL AUTO_INCREMENT,
`cat_title` VARCHAR(255) NOT NULL,
`cat_desc` TEXT NOT NULL,
PRIMARY KEY (`cat_id`),
UNIQUE KEY (`cat_title`)
Table: forum_topics
`forum_topics` (
`topic_id` INT(8) NOT NULL AUTO_INCREMENT,
`cat_id` INT(8) NOT NULL COMMENT 'foreign key with forum_categories table',
`user_id` INT(11) NOT NULL COMMENT 'foreign key with users table',
`topic_title` VARCHAR(255) NOT NULL,
`topic_desc` TEXT NOT NULL,
`topic_date` DATETIME DEFAULT NULL,
PRIMARY KEY (`topic_id`),
FOREIGN KEY (`cat_id`) REFERENCES forum_categories (`cat_id`) ON DELETE CASCADE ON UPDATE CASCADE
Example of the functionality, I would like to achieve:
Category 1 has cat_id = 1
Category 2 has cat_id = 2Topic 1 has cat_id = 1
Topic 2 has cat_id = 2
Now when category 1 is selected I just want topic 1 to show.
If category 2 is selected I just want topic 2 to show.
The following code does that:
Controller
/**
* Show all the topics in the chosen category
*/
public function showForumTopicsCat1()
{
$topic_model = $this->loadModel('Forum');
$this->view->forum_topics = $topic_model->getForumTopics(1);
$this->view->render('forum/viewTopics');
}
public function showForumTopicsCat2()
{
$topic_model = $this->loadModel('Forum');
$this->view->forum_topics = $topic_model->getForumTopics(2);
$this->view->render('forum/viewTopics');
}
public function showForumTopicsCat3()
{
$topic_model = $this->loadModel('Forum');
$this->view->forum_topics = $topic_model->getForumTopics(3);
$this->view->render('forum/viewTopics');
}
public function showForumTopicsCat4()
{
$topic_model = $this->loadModel('Forum');
$this->view->forum_topics = $topic_model->getForumTopics(4);
$this->view->render('forum/viewTopics');
}
Model
/**
* Gets an array that contains all the forum topics in the database.
* Each array element is an object, containing a specific topic's data.
* @return array All the forum topics
*/
public function getForumTopics($cat_id)
{
$sql = 'SELECT * FROM forum_categories fc JOIN forum_topics ft ON fc.cat_id = ft.cat_id WHERE fc.cat_id = :cat_id ORDER BY ft.topic_date DESC';
$query = $this->db->prepare($sql);
$query->execute(array(':cat_id' => $cat_id));
return $query->fetchAll();
}
View
<?php
if ($this->forum_categories) {
echo '<a href="'. URL . 'forum/showForumTopicsCat1/">Category1</a>';
echo '<a href="'. URL . 'forum/showForumTopicsCat2/">Category2</a>';
echo '<a href="'. URL . 'forum/showForumTopicsCat3/">Category3</a>';
echo '<a href="'. URL . 'forum/showForumTopicsCat4/">Category4</a>';
} else {
echo '<p>There are no categories.</p>';
}
?>
My Concern: Is there anyway to this more DRY and more reusable?