1

I'm creating a new component and have followed the Joomla 3 MVC tutorial (details) but cannot get pagination to work. Interestingly, when I implement the HelloWorld component linked in that tutorial, its pagination doesn't work either - so I know I haven't missed something.

I can get the pagination footer to display at the bottom of the page, but when I click next/end/an actual page number, it just displays all records and then removes the pagination footer. What am I missing?

models/danceregs.php

class DanceRegModelDanceRegs extends JModelList
{
/**
 * Constructor.
 *
 * @param   array  $config  An optional associative array of configuration settings.
 *
 * @see     JController
 * @since   1.6
 */
public function __construct($config = array())
{
    if (empty($config['filter_fields']))
    {
        $config['filter_fields'] = array(
            'dancer_id','d.dancer_id',
            'dancer_name','d.dancer_name',
            'studio', 'd.studio_id',
            'current_age','d.current_age',
            'published','d.published'
        );
    }

    parent::__construct($config);
}

/**
 * Method to build an SQL query to load the list data.
 *
 * @return      string  An SQL query
 */
protected function getListQuery()
{
    // Initialize variables.
    $db    = JFactory::getDbo();
    $query = $db->getQuery(true);

    // Create the base select statement.
    $query->select('*, (YEAR(CURDATE())-YEAR(dancer_birthdate)) - (RIGHT(CURDATE(),5)<RIGHT(dancer_birthdate,5)) AS current_age')
          ->from($db->quoteName('#__registration_dancers'));

    // Filter: like / search
    $search = $this->getState('filter.search');

    if (!empty($search))
    {
        $like = $db->quote('%' . $search . '%');
        $query->where('dancer_name LIKE ' . $like);
    }

    // Filter by studio name
    $studio_id = $this->getState('filter.studio_id');

    if (is_numeric($studio_id))
    {
        $query->where('studio_id = ' . (int) $studio_id);
    }
    elseif ($studio_id === '')
    {
        //$query->where('(published IN (0, 1))');
    }

    // Filter by published state
    $published = $this->getState('filter.published');

    if (is_numeric($published))
    {
        $query->where('published = ' . (int) $published);
    }
    elseif ($published === '')
    {
        $query->where('(published IN (0, 1))');
    }

    // Add the list ordering clause.
    $orderCol   = $this->state->get('list.ordering', 'dancer_id');
    $orderDirn  = $this->state->get('list.direction', 'desc');

    $query->order($db->escape($orderCol) . ' ' . $db->escape($orderDirn));

    return $query;
}
}

views/danceregs/tmpl/default.php

<form action="index.php?option=com_dancereg&view=danceregs" method="post" id="adminForm" name="adminForm">
<div class="row-fluid">
    <div class="span6">
        <?php echo JText::_('COM_DANCEREG_DANCEREGS_FILTER'); ?>
        <?php
            echo JLayoutHelper::render(
                'joomla.searchtools.default',
                array('view' => $this)
            );
        ?>
    </div>
</div>
<table class="table table-striped table-hover">
    <thead>
    <tr>
        <th width="2%"><?php echo JText::_('COM_DANCEREG_NUM'); ?></th>
        <th width="2%">
            <?php echo JHtml::_('grid.checkall'); ?>
        </th>
        <th width="30%">
            <?php echo JHtml::_('grid.sort', 'COM_DANCEREG_DANCEREGS_NAME', 'dancer_name', $listDirn, $listOrder); ?>
        </th>
        <th width="35%">
            <?php echo JHtml::_('grid.sort', 'COM_DANCEREG_STUDIO_NAME', 'studio_id', $listDirn, $listOrder); ?>
        </th>
        <th width="10%">
            <?php echo JHtml::_('grid.sort', 'DOB_AGE', 'current_age', $listDirn, $listOrder); ?>
        </th>
        <th width="10%">
            <?php echo JText::_('AGE'); ?>
        </th>
        <th width="5%">
            <?php echo JHtml::_('grid.sort', 'COM_DANCEREG_PUBLISHED', 'published', $listDirn, $listOrder); ?>
        </th>
        <th width="7%">
            <?php echo JHtml::_('grid.sort', 'COM_DANCEREG_ID', 'dancer_id', $listDirn, $listOrder); ?>
        </th>
    </tr>
    </thead>
    <tfoot>
        <tr>
            <td colspan="5">
                <?php echo $this->pagination->getListFooter(); ?>
            </td>
        </tr>
    </tfoot>
    <tbody>
        <?php if (!empty($this->items)) : ?>
            <?php foreach ($this->items as $i => $row) :
                //$link = JRoute::_('index.php?option=com_dancereg&task=dancereg.edit&id=' . $row->dancer_id);
                $link = JRoute::_('index.php?option=com_dancereg&view=dancereg&layout=edit&dancer_id=' . $row->dancer_id);
                $studio_link = JRoute::_('index.php?option=com_comprofiler&view=edit&cid=' . $row->studio_id . '#cbtabpane11');
            ?>
                <tr>
                    <td><?php echo $this->pagination->getRowOffset($i); ?></td>
                    <td>
                        <?php echo JHtml::_('grid.id', $i, $row->dancer_id); ?>
                    </td>
                    <td>
                        <a href="<?php echo $link; ?>" title="<?php echo JText::_('COM_DANCEREG_EDIT_DANCEREG'); ?>">
                            <?php echo $row->dancer_name; ?>
                        </a>
                    </td>
                    <td>
                        <a href="<?php echo $studio_link; ?>" title="<?php echo JText::_('COM_DANCEREG_EDIT_STUDIO'); ?>">
                            <?php echo $studdets[$row->studio_id]; ?>
                        </a>
                    </td>
                    <td align="center">
                        <?php echo $row->current_age; ?>
                    </td>
                    <td align="center">
                        <?php echo $DB_sitekore->getAge($row->dancer_birthdate); ?>
                    </td>
                    <td align="center">
                        <?php echo JHtml::_('jgrid.published', $row->published, $i, 'danceregs.', true, 'cb'); ?>
                    </td>
                    <td align="center">
                        <?php echo $row->dancer_id; ?>
                    </td>
                </tr>

                <?
                $clean_dancers = str_replace(',',' ',$row->dancer_name);
                $clean_studio = str_replace(',',' ',$studdets[$row->studio_id]);

                // used for generating our CSV file for Excel
                $csv_output .= $row->dancer_id.",".$clean_dancers.",".$clean_studio.",".$row->current_age.",".$DB_sitekore->getAge($row->dancer_birthdate)
                .",".$row->datemodified."\n";
                ?>
            <?php endforeach; ?>
        <?php endif; ?>
    </tbody>
</table>
<input type="hidden" name="task" value=""/>
<input type="hidden" name="boxchecked" value="0"/>
<input type="hidden" name="filter_order" value="<?php echo $listOrder; ?>"/>
<input type="hidden" name="filter_order_Dir" value="<?php echo $listDirn; ?>"/>
<?php echo JHtml::_('form.token'); ?>

views/danceregs/view.html.php

class DanceRegViewDanceRegs extends JViewLegacy
{
/**
 * Display the Dancer Registration view
 *
 * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
 *
 * @return  void
 */
function display($tpl = null)
{

    // Get application
    $app = JFactory::getApplication();
    $context = "dancereg.list.admin.dancereg";
    // Get data from the model
    $this->items        = $this->get('Items');
    $this->pagination   = $this->get('Pagination');
    $this->state        = $this->get('State');
    $this->filter_order = $app->getUserStateFromRequest($context.'filter_order', 'filter_order', 'dancer_id', 'cmd');
    $this->filter_order_Dir = $app->getUserStateFromRequest($context.'filter_order_Dir', 'filter_order_Dir', 'desc', 'cmd');
    $this->filterForm       = $this->get('FilterForm');
    $this->activeFilters    = $this->get('ActiveFilters');

    // What Access Permissions does this user have? What can (s)he do?
    $this->canDo = DanceRegHelper::getActions();

    // Check for errors.
    if (count($errors = $this->get('Errors')))
    {
        JError::raiseError(500, implode('<br />', $errors));

        return false;
    }

    // Set the submenu
    DanceRegHelper::addSubmenu('danceregs');

    // Set the toolbar and number of found items
    $this->addToolBar();

    // Display the template
    parent::display($tpl);

    // Set the document
    $this->setDocument();
}

/**
 * Add the page title and toolbar.
 *
 * @return  void
 *
 * @since   1.6
 */
protected function addToolBar()
{
    $title = JText::_('COM_DANCEREG_MANAGER_DANCEREGS');

    if ($this->pagination->total)
    {
        $title .= "<span style='font-size: 0.5em; vertical-align: middle;padding-left:5px;'>(" . $this->pagination->total . ")</span>";
    }

    JToolBarHelper::title($title, 'dancereg');

    if ($this->canDo->get('core.create')) 
    {
        JToolBarHelper::addNew('dancereg.add', 'JTOOLBAR_NEW');
    }
    if ($this->canDo->get('core.edit')) 
    {
        JToolBarHelper::editList('dancereg.edit', 'JTOOLBAR_EDIT');
    }
    if ($this->canDo->get('core.delete')) 
    {
        JToolBarHelper::deleteList('', 'danceregs.delete', 'JTOOLBAR_DELETE');
    }
    if ($this->canDo->get('core.admin')) 
    {
        JToolBarHelper::divider();
        JToolBarHelper::preferences('com_dancereg');
    }
}
/**
 * Method to set up the document properties
 *
 * @return void
 */
protected function setDocument() 
{
    $document = JFactory::getDocument();
    $document->setTitle(JText::_('COM_DANCEREG_ADMINISTRATION'));
}
}
1

Turns out what I was missing was the following from my \models\forms\filter_componentnames.xml:

<fields name="list">
    <field
        name="limit"
        type="limitbox"
        class="input-mini"
        default="25"
        label="COM_CONTENT_LIST_LIMIT"
        description="COM_CONTENT_LIST_LIMIT_DESC"
        onchange="this.form.submit();"
    />
</fields>

After adding this in, the pagination worked. Hope this helps someone!

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.