web-dev-qa-db-fra.com

Paramètres dans la vue de liste de composants personnalisés

Joomla est relativement nouveau et je développe mon premier composant. J'ai fini le backend et je travaille sur le frontend. La plupart des fonctionnalités ont été déterminées, mais je ne vois pas comment afficher l'en-tête de page à afficher à partir des paramètres de l'élément de menu.

J'ai regardé tout autour mais je n'arrive pas à afficher le mien. J'ai examiné le composant Article à titre indicatif, mais cela ne fonctionne pas.

Je l'ai copié directement à partir du composant Article, mais après le débogage, j'ai remarqué que params est null:

<?php if ($this->params->get('show_page_heading',1)) : ?>
    <h1><?php echo  $this->params->get('page_heading') ? $this->params->get('page_heading') : JFactory::getApplication()->getMenu()->getActive()->title; ?></h1>
<?php endif; ?>

Alors je me suis dit que je devais ajouter du code à la view.html.php fichier. J'ai donc apporté quelques modifications à ma méthode d'affichage afin qu'elles correspondent à celles du composant Article. Cette fois, le message d’erreur suivant s’affiche lorsque j’essaie d’attribuer params à $this:

Fatal error: Call to a member function get() on null

Je pense que c'est peut-être parce que je travaille sur une vue de liste et que le code d'article est destiné à une vue d'élément unique.

Toute aide serait appréciée.

Voici le code que j'ai dans mon fichier view.html.php:

class LibraryViewItems extends JViewLegacy {

    protected $items;
    protected $params;
    protected $state;

    public function display($tpl = null) {          
        $this->items = $this->get('Items');
        $state      = $this->get('State');
        $this->params = $this->state->get('params');

        if (count($errors = $this->get('Errors'))) {
            JError::raiseError(500, implode("\n", $errors));
            return false;
        }

        parent::display($tpl);
    }


}
1
chavab_1

On dirait que vous essayez d’obtenir les paramètres de menu pour votre menu actif actuel. Essayez le code suivant, cela n’a pas été testé, je vous donne cette référence de mémoire.

$app = JFactory::getApplication();
$params = $app->getMenu()->getActive()->getParams();

Cela peut fonctionner pour les paramètres de menu actifs actuels. Sinon, vous devrez peut-être passer le Itemid actuel dans get params pour obtenir ce tableau. Dans ce cas, essayez ce qui suit:

$app = JFactory::getApplication();
$Itemid = $app->getMenu()->getActive()->id;
$params = $menu->getParams($Itemid);

Peut-être qu'une de ces 2 solutions fonctionnera pour vous. Si vous le mettez dans votre fichier view.html.php, vous pouvez affecter les variables à $ this afin qu’il passe dans votre fichier de modèle pour le composant. ($ this-> Itemid, etc etc)

1
Terry Carter

Vous obtenez $params de $state

 $state = $this->get('State');

Cela signifie que l'État doit avoir $params peuplé dans votre modèle. Vérifiez si vous remplissez le $state avec $params dans la fonction populateState de votre modèle

protected function populateState($ordering = null, $direction = null) {
    $params = JComponentHelper::getParams('com_mycomponent');
    $this->setState('params', $params);

    parent::populateState($ordering, $direction);
}
1
Nagarjun

Addendum:

OP veut que les paramètres de l'élément de menu soient accessibles dans la vue, mais il tente de remplacer le paramètre params var ($ this-> params) par l'élément de menu params objet/classe. Ce qui est inutile compliqué. Dans le composant principal de l'article, les paramètres du composant et de l'élément de menu sont fusionnés (dans le fichier view.html.php), ce qui est pratique si vous essayez de remplacer certaines données. La bonne réponse à sa question est d'utiliser $ params = JFactory :: getApplication () -> getMenu () -> getActive () -> getParams (); dans le default.php de la vue. Ce qui permet: $ params-> get ('page_heading'); (SI cette vue est appelée via un élément de menu.)

Obtenir les paramètres d'élément de menu:

    $app = JFactory::getApplication();
    $menu = $app->getMenu()->getActive();
    $params = $menu->getParams();

Obtenir les paramètres du composant:

$this->params = $this->state->get('params');

Fusionnez-les dans le view.html.php -> fonction d'affichage (tiré du view.html.php de la vue de l'article):

    $this->params = $this->state->get('params');
    $active       = $app->getMenu()->getActive();
    $temp         = clone $this->params;

if ($active)
        {
            $currentLink = $active->link;

            // If the current view is the active item and an article view for this article, then the menu item params take priority
            if (strpos($currentLink, 'view=article') && strpos($currentLink, '&id=' . (string) $item->id))
            {
                // Load layout from active query (in case it is an alternative menu item)
                if (isset($active->query['layout']))
                {
                    $this->setLayout($active->query['layout']);
                }
                // Check for alternative layout of article
                elseif ($layout = $item->params->get('article_layout'))
                {
                    $this->setLayout($layout);
                }

                // $item->params are the article params, $temp are the menu item params
                // Merge so that the menu item params take priority
                $item->params->merge($temp);
            }
            else
            {
                // Current view is not a single article, so the article params take priority here
                // Merge the menu item params with the article params so that the article params take priority
                $temp->merge($item->params);
                $item->params = $temp;

                // Check for alternative layouts (since we are not in a single-article menu item)
                // Single-article menu item layout takes priority over alt layout for an article
                if ($layout = $item->params->get('article_layout'))
                {
                    $this->setLayout($layout);
                }
            }
        }
        else
        {
            // Merge so that article params take priority
            $temp->merge($item->params);
            $item->params = $temp;

            // Check for alternative layouts (since we are not in a single-article menu item)
            // Single-article menu item layout takes priority over alt layout for an article
            if ($layout = $item->params->get('article_layout'))
            {
                $this->setLayout($layout);
            }
        }
1
Dennis Heiden