binoy
binoy

Reputation: 1768

cakephp calling controller action from model

I have a shopping cart site and on successful purchase I need to send a mail with all product details in the order as attachment. I have used fat model skinny controller approach and all my functions are in model. I have a controller action which will give the order details by passing order id along with view. Using dompdf I can convert this html to pdf and can create a file. So for creating attachment I can use the same function by passing some parameter. My mail sending code is in model. From here I need to call the controller action and need to get the pdf file name that just created. I know calling controller action from model is against MVC architecture. But how can I achieve this functionality ?

Upvotes: 0

Views: 1672

Answers (2)

thaJeztah
thaJeztah

Reputation: 29137

'fat' models is a good thing to do, however, try not to put things in a Model that should not be in a Model. In MVC, Models should handle all things related to data.

Fat models

The 'fat' Model concept is to reduce the amount of code in your Controller, by moving data related code to the Model. for example:

In stead of this; (in your Controller):

public function view($id)
{
    $this->request->data = $this->SomeModel->find('first', array(
        'fields' => array(
            // list of fields to retrieve
        ),
        'conditions' => array(
            // conditions
        ),
        // etc.
    ); 
}

Move the find instructions to a method inside your model and use this:

public function view($id)
{
    $this->request->data = $this->SomeModel->someMethod($id);
}

Other locations to put your code

Code that is not related to data, can also be moved outside your Controller (to make it 'skinny'). CakePHP offers other locations to move your code to, for example inside a Component

Then inside your Controller;

this:

public function view($id)
{
    $this->request->data = $this->SomeModel->someMethod($id);

    // use functionality of a component
    $this->SomeComponent->doSomething();
}

Triggering functionality via Events

To keep code and logic outside your controller, CakePHP 2.x now offers an 'Event' system. This allows you to execute code if a certain event happens. You can pass additional information through the events (the event will become a 'communication channel' that passes through your application).

Sending e-mails for certain events is a good example. The CakePHP also uses sending mails to illustrate the Event system in CakePHP; this is probably what you are looking for:

Dispatching Events - send emails

Upvotes: 2

floriank
floriank

Reputation: 25698

Make your model method return the data so you have it in the controller and pass it to the other model function together with your pdf related data.

Upvotes: 1

Related Questions