Skip to main content

Joomla! 2.5: Table sorting / The MVC problem.

Well, I feel kind of embarrassed that I need to write about this topic... I always thought I kind of understood MVC architecture. But this one drove me nuts:

I am working on a custom article management system for my front end users. I know that there might be (for sure) extensions to accomplish this, but you know how it is... you want to do it yourself. Everything worked out fine, until I got to the point of sorting the article table (alphabetically, chronologically etc.). This, too, could be done with extensions or existing jquery / other techniques. Could be.

Well, I decided to do it with the traditional Javascript / Ajax / PHP approach. Jacvascript function triggers AJAX request, AJAX request goes to controller, controller queries the database and creates an array that can be handled by the view.

So far so good. But how do I get the view to reload without refreshing the entire page (which would obviously loose the sort order)? I made it as far as updating the model, but I couldn't manage an update of the view - yes, it reloaded, but the array with the data for the table seemed to be empty, even though I set it. I was about to do copy and paste... but I am very reluctant to redundancy.

Eventually, my controller calls a custom view method and passes the array (without using the model), then the controller calls a custom display method. And voilà, it works.

The code:

controller.php
                ...
        $db->setQuery($query);
        $result = $db->loadObjectList();

        $view = $this->getView(<viewname>, 'html');
        $view->setMyArticles($result);
        $view->mydisplay();


If your view class name is "MyviewViewSpecialname", then viewname would be "specialname" (lowercase). This is important if you have multiple views.

view.html.php
     // Overwriting JView display method
     function display($tpl = null)
        {
             // Assign data to the view
             $this->msg = $this->get('Msg');

             $this->myarticles = $this->get('MyArticles');
                     
              // Check for errors.
              if (count($errors = $this->get('Errors')))
              {

              JError::raiseError(500, implode('<br />', $errors));
              return false;
        }
        // Display the view
        parent::display($tpl);
    }

    public function mydisplay($tpl = null){
        parent::display($tpl);
    }
    public function setMyArticles($array){
        $this->myarticles = $array;
    }


This is it! This cost me about 20 hours to figure it out... Hope it can help you, too!

Comments

Popular posts from this blog

Joomla! 2.5: Multiple views, one model

Here goes MVC again: I was a bit confused that every time I created a second or third view for a component, I had to create a separate model for it. Did not make sense to me - I had the necessary algorithms in the model for the first view, did I really need to do copy & paste? I hate it! Redundancy, redundancy, redundancy. That case occurred in my current project - I created user profiles and needed an "edit" view. The data is the same, but I need to have the data in editable text fields instead of fixed labels, and maybe some other buttons here and there...  Well, some time later I realized that I just did not quite understand what Joomla! acutally means by "view".  And that there is something called "layout". Long story short: If you have a model that provides all necessary information and you just want to have a different presentation of it, just add a new .php file to your views/<yourviewname>/tmpl folder - let's call it "layo

Joomla / Eclipse: Use Eclipse to edit files

Even though I could use any Editor or Notepad, after some days of Joomla! I was yearning for some syntax highlighting and maybe even automatic code completion... I did some Java programming in the past, and I am really used to the Eclipse IDE. Eclipse IDE for JavaScript Web Developers seemed to be a good deal for what I was up to do, so I gave it a try. I feel kind of stupid even posting about this, but upon starting up Eclipse, I started to wonder how I would do that - being that Eclipse works with projects, and I didn't want to put all of my components into an Eclipse workspace, and I didn't want to put up a subversioning system. Turns out it is quite simple: Right-click somewhere in the package explorer,  select 'New', 'Project...'. In the dialog, open the folder 'General' and select 'Project'. Click 'Next'. For the name, I usually put the com_componentname / mod_modulename, as in my file system. But I don't think it matters.

Creating a Joomla! Module Position

I know how it works. At least I did, once... I tend to forget, thus I'll write it down once and for all. Step 1: Adding the position to the correct xml file Go to your template's root folder (usually <Joomla-Root>/templates/<your-template> ) and open templateDetails.xml in a text editor. Scroll down 'til  you find <position> -tags. At the end of the row of position tags, add another one (just clone the last tag and increase the number by 1). Save. before after Step 2: Check if what you just did worked Go to your Joomla! backend. Open Extensions > Module Manager. Select a module (open the module item by clicking on it). Click "Select Position". Does the position you just created appear in the table? Good! Step 3: Name your position (optional) Now you can give your position a name. The name is what appears in brackets in the position table. Go to the <Joomla-Root>/administrator/language/<your-language> fo