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?

\$\endgroup\$
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>';
}
?>
\$\endgroup\$
2
  • \$\begingroup\$ Undefined variable: numberCat \$\endgroup\$ – kampfkuchen Oct 28 '14 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\$ – Nanis Bzh Oct 28 '14 at 13:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.