ti-enxame.com

Paginação personalizada: $ this na função "pagination_item_active" não está no contexto do objeto?

Joomla 3

Eu estava tentando modificar a saída de paginação do Joomla. Após este documentação , crio o arquivo mytemplate/html/pagination.php E começo a modificá-lo. De acordo com o documento, eu posso escrever 4 funções no novo arquivo de paginação, na verdade, só quero reescrever _list_render() e _item_active(). No entanto, em libraries/cms/pagination/pagination.php A partir da linha 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;
        }
    }

Isso significa que só posso fazer com que o CMS use minha função se existirem apenas pagination_item_active() e pagination_item_inactive(). Mas eu não tenho meu próprio pagination_item_active(), então copio o conteúdo de _item_active() no pagination.php do CMS para o meu arquivo de substituição para que fique assim no meu 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>';
  }

}

O problema é que, quando executo o PHP, recebo esta mensagem de erro:

Usando $ this quando não estiver no contexto do objeto em

/home/w/public_html/templates/rt_photon/html/pagination.php na linha 56

O que eu não entendo é que meu pagination.php deve ser incluído no do CMS, onde há um "contexto de objeto", por que ele está dando essa mensagem de erro? E como supero esse dillema?

4
shenkwen

O libraries/cms/pagination/pagination.php define a classe JPagination e não sei exatamente como as substituições são mescladas nessa classe. De qualquer forma, você pode pegar um exemplo de paginação em modelo padrão do protostar que, como você vê, não usa nenhum referência ao objeto JPagination principal e usa apenas o $item nos parâmetros:

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

Eu não sou um especialista em PHP, mas vou ) tentar dar uma pequena explicação técnica razão para o que acredito ser o problema no seu caso.

$this->app->isAdmin() está causando o erro porque o único objeto que está sendo passado pela função é JPagination, que é o $item variável, não $this.

Portanto, para obter o objeto JApplication, você precisará defini-lo manualmente da seguinte forma:

$app = JFactory::getApplication();

Em seguida, faça sua verificação, da seguinte maneira:

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