Mvc Confusion

Hi, I am new to Yii and have come from a background building simpler websites often using Drupal or Joomla and, though I feel I mostly ‘get’ the MVC design pattern, there are some things which I am unsure about the correct ‘mvc way’ and ‘Yii way’ to implement. Any insights anyone could offer would be very helpful.

The main stumbling block I have right now is probably best served with an example:

Say I am building an ecommerce site, I will likely have controllers for categories, products, pages, shopping process (checkout etc) which have a selection of different views depending on what the user is trying to do and, obviously, the controller and view can interact with the data model.

The part I find confusing is that, in this case I also have a persistent navigation which is built using product categories so needs to get that data from a model to render it. What is the right way to go about this? Should it be a widget? A partial view? What is the way to pass a model into a widget and should you? The same question could apply to the persistent shipping basket which needs data from products model so again I am getting confused about the right way to put these parts together.

I appreciate this is probably a really obvious thing but as I said, I’m not that familiar with MVC and just want to clear it up.

Thanks for any help.

I prefer using widgets.

So I do this:

View:




<? $this->widget('MyWidget', array('data' => $mydata)); ?>

// here goes passing data----^^^^^^^^^^^^^^^^^^^^^^^^



Widget:


class MyWidget extends CWidget {

    public $data; // !!!


    public function run() {

        $controller = $this->controller;

        $action = $controller->action;


        $items = ...; // get items depends on some condition


        $this->render('myWidget', array('items' => $items));

    }

}

Thanks ORey, I hadn’t realised widgets could render view files which I think clears everything up, that and I think I’m starting to wrap my head around it, widgets seem like mini controllers which is exactly the kind of functionality I was looking for as the widgets need to be separate from the current controller.

So do you think a category tree menu or a shopping basket is a good fit for a widget?

Thanks again.

Callum

Hi,

Yes - menus and any view that needs to be reused is a perfect fit for widgets. They are not mini controllers though - you cannot point a URL to a widget. Have a look at Yii breadcrumbs and menu.

Thanks, though there are a few references to widgets being “like” controllers and I think it is a good analogy, though they cannot be accessed by a URL they are accessed on a page in the same kind of way. A view requests a widget, the widget gets its data from a model and renders a view. That seems to make sense to me - maybe they are more like partial controllers like views have partial views - I don’t know.

You make a good point about looking at existing code to understand how they work, as this is what I did and it was very helpful. Thanks.