3
\$\begingroup\$

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 = 2

Topic 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?

Vogel612
25.5k7 gold badges59 silver badges141 bronze badges
asked Oct 28, 2014 at 13:10
\$\endgroup\$

1 Answer 1

4
\$\begingroup\$

you could do something like that :

public function showForumTopicsByCat($catId)
{
 $topic_model = $this->loadModel('Forum');
 $this->view->forum_topics = $topic_model->getForumTopics($catId);
 $this->view->render('forum/viewTopics');
}

and on view

<?php
if ($this->forum_categories) {
 for($i=o; $i < $numberCat; $i++){
 echo '<a href="'. URL . 'forum/showForumTopicsCat'.$i.'/">Category1</a>';
 }
 } else {
 echo '<p>There are no categories.</p>';
}
?>
answered Oct 28, 2014 at 13:19
\$\endgroup\$
2
  • \$\begingroup\$ Undefined variable: numberCat \$\endgroup\$ Commented Oct 28, 2014 at 13:31
  • \$\begingroup\$ Of course... You must count number of category you have, I don't know if you forum_categories is an array or something else \$\endgroup\$ Commented Oct 28, 2014 at 13:33

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.