web-dev-qa-db-fra.com

Pagination personnalisée: $ this dans la fonction "pagination_item_active" n'est pas dans le contexte de l'objet?

Joomla 3

J'essayais de modifier la sortie de pagination de Joomla. Suite à cela documentation , je crée le fichier mytemplate/html/pagination.php Et commence à le modifier. Selon le document, je peux écrire 4 fonctions dans le nouveau fichier de pagination, je veux juste réécrire _list_render() et _item_active(). Cependant, dans libraries/cms/pagination/pagination.php À partir de la ligne 327

    $chromePath = JPATH_THEMES . '/' . $this->app->getTemplate() . '/html/pagination.php';

    if (file_exists($chromePath))
    {
        include_once $chromePath;

        if (function_exists('pagination_item_active') && function_exists('pagination_item_inactive'))
        {
            $itemOverride = true;
        }

        if (function_exists('pagination_list_render'))
        {
            $listOverride = true;
        }
    }

Cela signifie que je ne peux faire utiliser ma fonction au CMS que s'il existe à la fois pagination_item_active() et pagination_item_inactive(). Mais comme je n'ai pas ma propre pagination_item_active(), je copie donc le contenu de _item_active() dans le fichier pagination.php du système de gestion de contenu dans mon fichier de substitution afin qu'il ressemble à ceci dans mon fichier pagination.php.

......
function pagination_item_active(JPaginationObject $item){
  $title = '';
  $class = '';

  if (!is_numeric($item->text))
  {
    JHtml::_('bootstrap.tooltip');
    $title = ' title="' . $item->text . '"';
    $class = 'hasTooltip ';
  }

  if ($this->app->isAdmin())
  {
    return '<a' . $title . ' href="#" onclick="document.adminForm.' . $this->prefix
    . 'limitstart.value=' . ($item->base > 0 ? $item->base : '0') . '; Joomla.submitform();return false;">' . $item->text . '</a>';
  }
  else
  {
    return '<a' . $title . ' href="' . $item->link . '" class="' . $class . 'pagenav">' . $item->text . '</a>';
  }

}

Le problème est que, lorsque je lance PHP, je reçois ce message d'erreur:

Utilisation de $ this en dehors du contexte de l'objet dans

/home/w/public_html/templates/rt_photon/html/pagination.php à la ligne 56

Ce que je ne comprends pas, c'est que mon pagination.php est censé être inclus dans celui du CMS, où il y a un "contexte d'objet", pourquoi donne-t-il alors ce message d'erreur? Et comment surmonter ce dillema?

4
shenkwen

Le libraries/cms/pagination/pagination.php définit la classe JPagination et je ne sais pas exactement comment les substitutions sont fusionnées dans cette classe. De toute façon, vous pourriez prendre un exemple de pagination dans modèle par défaut protostar qui, comme vous le voyez, n’utilise aucun référence à l'objet principal JPagination et utilise uniquement le $item en paramètres:

function pagination_item_active(&$item){
    $class = '';

    // Check for "Start" item
    if ($item->text == JText::_('JLIB_HTML_START')){
        $display = '<span class="icon-first"></span>';
    }

    // Check for "Prev" item
    if ($item->text == JText::_('JPREV')){
        $display = '<span class="icon-previous"></span>';
    }

    // Check for "Next" item
    if ($item->text == JText::_('JNEXT')){
        $display = '<span class="icon-next"></span>';
    }

    // Check for "End" item
    if ($item->text == JText::_('JLIB_HTML_END')){
        $display = '<span class="icon-last"></span>';
    }

    // If the display object isn't set already, just render the item with its text
    if (!isset($display)){
        $display = $item->text;
        $class   = ' class="hidden-phone"';
    }

    return '<li' . $class . '><a title="' . $item->text . '" href="' . $item->link . '" class="pagenav">' . $display . '</a></li>';
}
1
Kitase88

Je ne suis pas PHP expert mais je vais essayer) == pour donner une petite raison technique quant à ce que je pense que le problème est dans ton cas.

$this->app->isAdmin() est à l'origine de l'erreur car le seul objet transmis par la fonction est JPagination, qui est le $item variable, pas $this.

Par conséquent, pour obtenir l'objet JApplication, vous devez le définir manuellement comme suit:

$app = JFactory::getApplication();

Ensuite, effectuez votre vérification, comme suit:

if ($app->isAdmin())
{
    // Your code
}
1
Lodder