I've been programming since 1984 and have felt pretty comfortable in almost every new language I've tackled over the years. I've written some incredibly complex software for the stock market industry so I wouldn't say that I'm a beginner programmer. Most of my experience over the last ten years has been in Microsoft ASP pages, my current task to add a payment into this website--if it were done in ASP pages--would have probably taken me no more than about three hours of work.
That said, I've already spent at least five full days of pulling my hair out trying to understand what is going on with OpenCart. I wouldn't say that any of this is "easy", having just read now all the glowing information about the benefits of MVC+L. So far, I'm mostly impressed by the obsfucation that's been added by this. For example, I was decyphering one page's output and what would normally be static text was coming from 1) the language file, 2) the controller/model code from the mysql db and 3) the template itself. You suggest that this code should only come from the language file itself. And yes, I know why you might put some text in the database--I've designed countless systems.
I need to add a payment method. It's really that simple. In fact, why on earth wouldn't you include a standard credit card processing method for people who have a brick-and-mortar store and have a POS system? You could just store the credit card information. But instead you only offer the ability to sign up with yet another middle man who wants a cut of the transactions.

So here I am, coding up another payment method. This should be simplicity itself. I should be able to duplicate one of the existing payment methods, change the names, change the variable names themselves and "install" it in the admin section. I've done this but now I'm completely flummoxed by the lack of documentation about HOW the pages submit data from a form back to itself.
In ASP page terms:
- A form has an ACTION attribute which determines where the POST'd data goes
- The recieving *ASP* page has server-side functionality at the top of that page that fetches the arriving variables
- At this point you might have local-scope variables or session-scope variables or even application-scope variables
- At this point you're free to use code to write them to the database if you wish
- The ASP page then has static HTML and inline dynamic data from those various types of variables
--------------------------
So here I am with this OpenCart.
- In the shipping/payment areas it doesn't look like the Comment form field is being email'd or stored in the Order or Order_History tables at all. Why ask the information if it's not being stored? I actually need this data and have been fruitlessly trying to get it stored in the order_history table, for example.
- I've searched throughout the many pages and I see references to: $data['comment'], $this->session->data['comment'], $comment, nl2br($this->session->data['comment']), there's a comment field in order_history. I've attempted to use any of these in an attempt to store the data and they keep showing up empty.
- I'm interested in a form submission from the "checkout/payment" page to the "checkout/confirm" page. In theory, somewhere in the controller I'm going to store to variables those form elements that I've submitted. In theory, somewhere upon the "checkout/confirm" submission it goes... SOMEWHERE to server-side code. Where is this?
To make matters worse you sometimes have injected AJAX code into the button submissions. The ACTION aspect of the form submission is also obsfucated so much that it's difficult to tell where the page is going.
In a nutshell then my question is: When the customer clicks the final CONFIRM button on the "checkout/confirm" page, where does it go? What server-side code processes and writes the data? Why isn't COMMENT written? How do I know that my stored data from the "checkout/payment" page is preserved somehow?
My suspicion is that all these layers are each attempting to save the comment field in their own way and one is eventually overwriting my attempts to save this data. I'm weary of this project.
What is the difference and scope of these variables?
$data['comment']
$this->session->data['comment']
$comment
nl2br($this->session->data['comment'])
When is the order written? (Is it after "checkout/confirm" itself is submitted back to the server?) In theory, if I know that the order has been written to the database then I can make the SQL call to update the order_history table myself.
Seriously guys, the documentation needs a diagram of what happens during a form submission back to itself. There is nothing easy about the end of the point-of-sale process since it includes layers of modules in a stack: product, shipping, address, payment, coupon. It's not clear when a particular CMV set is being used to render a page itself and whether/not it processes the submitted form itself.
You have methods like confirm() in some of the payment extensions. But most of these extensions are dedicated to exporting the data to someone else's website in EDI fashion. All my attempts to keep the data here and store it are flummoxed by what is, to me, an overly complicated system.
Sorry for the bad review of OpenCart but I just felt you ought to know what it's like to use it as a long-time developer.
I imagine that the first question you'll ask is what version of OpenCart I have. Unfortunately I have inherited all this mess from an outsourced project from India. There doesn't appear to be version information written anywhere throughout. I actually had to google some of the error messages to deduce that it is OpenCart. Suggestion: Couldn't you just write the OpenCart version information into the META tags in the header like other developers do?