web-dev-qa-db-fra.com

Requête de base de données pour sélectionner une année spécifique

J'essaie de convertir un petit script php en un composant pour Joomla. Jusqu'ici, il fonctionne bien. Mais je voudrais faire quelques ajustements.

La vue affiche les données dans un tableau de chiffres de dates spécifiques au cours des 10 dernières années. J'ai ajouté le tri de colonne pour permettre le tri de certaines colonnes, mais je me demande s'il existe une méthode permettant de sélectionner des années spécifiques par défaut. Je voudrais qu'il montre l'année en cours et ensuite une liste déroulante pour sélectionner les années précédentes comme le script d'origine.

C’est la requête de mon modèle. Toutes les suggestions sur la manière d’y parvenir seraient appréciées. Steve

$db    = $this->getDbo();
        $query = $db->getQuery(true);

        // Select the required fields from the table.
        $query
            ->select(
                $this->getState(
                    'list.select', 'DISTINCT a.*'
                )
            );

        $query->from('`#__fts` AS a');

        // Join over the users for the checked out user.
        $query->select('uc.name AS uEditor');
        $query->join('LEFT', '#__users AS uc ON uc.id=a.checked_out');

        // Join over the created by field 'created_by'
        $query->join('LEFT', '#__users AS created_by ON created_by.id = a.created_by');

        if (!JFactory::getUser()->authorise('core.edit', 'com_fts'))
        {
            $query->where('a.state = 1');
        }

        // Filter by search in title
        $search = $this->getState('filter.search');

        if (!empty($search))
        {
            if (stripos($search, 'id:') === 0)
            {
                $query->where('a.id = ' . (int) substr($search, 3));
            }
            else
            {
                $search = $db->Quote('%' . $db->escape($search, true) . '%');
            }
        }


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

        if ($orderCol && $orderDirn)
        {
            $query->order($db->escape($orderCol . ' ' . $orderDirn));
        }

        return $query;
    }
1
Steve C.

Vous pouvez obtenir les données directement à partir de la demande, en définissant l'année en cours comme valeur par défaut:

$app = JFactory::getApplication();
$year = (int) $app->input->getInt( 'yearInput' , date('Y') );
$query->where( 'a.yearColumn = ' . $year );

Ou vous pouvez utiliser la méthode $this->state->getState();:

$year = $this->state->getState('filter.year');
$query->where( 'a.yearColumn = ' . $year );

Comment vous assurez-vous que filter.year Est rempli? Si votre classe de modèle s'étend JModelList, vous pouvez remplacer populateState() pour remplir filter.year.

protected function populateState($ordering = 'ordering', $direction = 'ASC')
{
    $app = JFactory::getApplication();

    $value = (int) $app->input->getInt('yearInput', date('Y'));
    $this->setState('filter.year', $value);

    // Set additional state variables or call parent::populateState($ordering, $direction)
}

populateState() sera appelé la première fois que vous utiliserez $this->getState(); il n'est donc pas nécessaire de l'appeler explicitement.

Quelqu'un peut me corriger si je me trompe, mais je crois que si vous définissez le nom de champ de votre champ de saisie sur filter.year, Vous n'aurez même pas besoin de remplacer populateState(), car ce sera rempli automatiquement. Dans ce cas, vous pouvez simplement appeler $year = (int) $this->getState('filter.year', date('Y'));. Vous devez vous assurer que $ this-> contexte est la vérité avant que la première $this->getState() ne soit appelée (sinon aucun état ne sera rempli à l'exception de list.start Et de list.limit Et ils ' Tous les deux seront réglés sur 0).

Pour les éléments internes de JModelList (ou ListModel), voir https://github.com/joomla/joomla-cms/blob/staging/libraries/src/MVC/Model/ ListModel.php

1
Drew G