web-dev-qa-db-fra.com

Mise en cache de la sortie d'un composant en fonction de variables d'état utilisateur

J'ai des problèmes avec la mise en cache de la sortie de mon composant, car les variables d'état de l'utilisateur semblent être ignorées. Je les ai ajoutées à mon contrôleur comme suit, ce qui fonctionne bien lorsque vous soumettez le formulaire de filtre au serveur frontal. Ce n'est pas vraiment le cas lorsque vous cliquez sur le prochain élément de pagination. la demande).

public function display($cachable = true, $urlparams = array()) {
    $app = JFactory::getApplication();
    $input = $app->input;
    $view = $input->getCmd('view', 'foo');
    $input->set('view', $view);

    $context = 'com_foobar.'.$view;
    if($list = $app->getUserStateFromRequest($context.'.list', 'list')) $urlparams['list'] = $list;
    if($filter = $app->getUserStateFromRequest($context.'.filter', 'filter')) $urlparams['filter'] = $filter;

    parent::display($cachable, $urlparams);

    return $this;
}

Comment faire en sorte que mon composant affiche la sortie en cache correcte, en tenant compte des variables d'état?

Merci!

1
Adam B

Vous devriez passer à $urlparams Un tableau où les clés sont des noms de variables et les valeurs sont les filtres correspondants de ces variables. Par exemple:

$urlparams = array(
    'catid' => 'INT',
    'id' => 'INT',
    'cid' => 'ARRAY',
    'year' => 'INT',
    'month' => 'INT',
    'limit' => 'UINT',
    'limitstart' => 'UINT',
    'showall' => 'INT',
    'return' => 'BASE64',
    'filter' => 'STRING',
    'filter_order' => 'CMD',
    'filter_order_Dir' => 'CMD',
    'filter-search' => 'STRING',
    'print' => 'BOOLEAN',
    'lang' => 'CMD',
    'Itemid' => 'INT'
);

Ce tableau est utilisé pour construire le cache dans la méthode display() du contrôleur parent:

/libraries/legacy/controller/legacy.php

// Display the view
if ($cachable && $viewType != 'feed' && $conf->get('caching') >= 1)
{
    $option = $this->input->get('option');
    $cache = JFactory::getCache($option, 'view');

    if (is_array($urlparams))
    {
        $app = JFactory::getApplication();

        if (!empty($app->registeredurlparams))
        {
            $registeredurlparams = $app->registeredurlparams;
        }
        else
        {
            $registeredurlparams = new stdClass;
        }

        foreach ($urlparams as $key => $value)
        {
            // Add your safe url parameters with variable type as value {@see JFilterInput::clean()}.
            $registeredurlparams->$key = $value;
        }

        $app->registeredurlparams = $registeredurlparams;
    }

    $cache->get($view, 'display');
}
else
{
    $view->display();
}

Comme vous pouvez le constater, il est utilisé dans $app->registeredurlparams, Qui est utilisé dans la classe JCache pour créer l'identifiant unique du cache dans la méthode makeId():

/libraries/joomla/cache/cache.php

/**
 * Create safe id for cached data from url parameters set by plugins and framework
 *
 * @return  string   md5 encoded cacheid
 *
 * @since   11.1
 */
public static function makeId()
{
    $app = JFactory::getApplication();

    $registeredurlparams = new stdClass;

    // Get url parameters set by plugins
    if (!empty($app->registeredurlparams))
    {
        $registeredurlparams = $app->registeredurlparams;
    }

    // Platform defaults
    $defaulturlparams = array(
        'format'    => 'Word',
        'option'    => 'Word',
        'view'      => 'Word',
        'layout'    => 'Word',
        'tpl'       => 'CMD',
        'id'        => 'INT'
    );

    // Use platform defaults if parameter doesn't already exist.
    foreach ($defaulturlparams as $param => $type)
    {
        if (!property_exists($registeredurlparams, $param))
        {
            $registeredurlparams->$param = $type;
        }
    }

    $safeuriaddon = new stdClass;

    foreach ($registeredurlparams as $key => $value)
    {
        $safeuriaddon->$key = $app->input->get($key, null, $value);
    }

    return md5(serialize($safeuriaddon));
}

Ce bel article vous en dira plus sur le cache Joomla.

3
Dmitry Rekun