web-dev-qa-db-fra.com

Le chemin de remplacement de la vue dans le contrôleur ne fonctionne que partiellement

Dans mon contrôleur principal, j'intègre avec succès un chemin personnalisé pour le modèle , mais il me manque quelque chose pour le chemin personnalisé vers le Voir .

Le chemin du composant est:

\components
    \com_meetings
        \models
            \meetings
                meetings.php          (Joomla Default)
            \custom
                \meetings
                    meetings.php      (My custom override that works)
        \views
            \meetings                 (Joomla Default)
                \tmpl
                view.html.php          
            \custom                   (My Custom views Folder)
                \meetings             (Customized View)
                    \tmpl             (This folder is ignored)
                    view.html.php     (This DOES load)

Donc, avec le code ci-dessous, Joomla charge correctement le modèle personnalisé mais uniquement partiellement charge la vue personnalisée. (Mon view.html.php Est chargé, mais le dossier \tmpl Correspondant est ignoré et il revient à la valeur par défaut \tmpl.

com_meetings\controller.php: (Joomla 3.6.2)

defined('_JEXEC') or die;
jimport('joomla.application.component.controller');
class MeetingsController extends JControllerLegacy {
    public function __construct($config = array()) {
        $this->input = JFactory::getApplication()->input;

        // Begin Custom Model and View Paths
        $view_name          = $this->input->getCmd('view', $this->default_view);
        // Custom Model Path
        $custom_model_path  = JPATH_COMPONENT.'/models/custom/';
        $custom_model       = $custom_model_path.$view_name.'.php';
        if(is_dir( $custom_model_path )){
            if(file_exists( $custom_model )){
                $config['model_path'] = $custom_model_path;
            }
        }
        // Custom View Path
        $custom_view_path   = JPATH_COMPONENT.'/views/custom/';
        if(is_dir( $custom_view_path )){
            $custom_view_path   .= $view_name;
            if(is_dir( $custom_view_path )){
                $custom_view        = $custom_view_path.'/view.html.php';
                if(file_exists( $custom_view )){
                    $config['view_path'] = JPATH_COMPONENT.'/views/custom';
                }
            }
        }
        // End Custom View Path

        parent::__construct($config);
    }

Les chemins ci-dessus SONT pris en compte dans la méthode __construct() de libraries\fof\controller\controller.php Autour des lignes 594 et 617 et charge mon view.html.php, Mais comme mentionné le relatif \tmpl dossier est ignoré.

Line 594   if (array_key_exists('model_path', $config))....
Line 617   if (array_key_exists('view_path', $config))

vues\custom\meetings\view.html.php

class MeetingsViewMeetings extends JViewLegacy {
public function display($tpl = null)
{
    $app = JFactory::getApplication();
    if (count($errors = $this->get('Errors'))) {
        throw new Exception(implode("\n", $errors));
    }

    $this->_prepareDocument();
    \\ The override gets this far;
    parent::display($tpl);
}

Je ne peux pas suivre où cela est vérifié, et je ne peux pas voir ce que j'ai mal fait. Toutes les suggestions sont les bienvenues ~

P.S., je sais que je peux insérer des vues de remplacement dans le modèle, mais je souhaite implémenter le chemin personnalisé de Joomla au niveau du composant pour conserver les personnalisations, quel que soit le modèle actif.

ADDITONAL UPDATE En regardant la vue $, je vois qu'elle a résolu les chemins à vérifier. Donc, je suppose que la question est de savoir comment obtenir mon chemin personnalisé entre ces 2:

[_path:protected] => Array (
        [template] => Array (
                [0] => C:\www\commission\templates\protostar\html\com_meetings\meetings\
                [1] => C:\www\commission\components\com_meetings\views\meetings\tmpl\
            )
    )
[_template:protected] => C:\www\commission\components\com_meetings\views\meetings\tmpl\default.php
1
GDP

Je pense que vous devez aussi trouver le chemin 'template_path' dans la configuration. Probablement quelque chose comme

$config['template_path'] = array(
    JPATH_COMPONENT.'/views/tmpl',
    $custom_view_path.'/tmpl',
    /* maybe other override place here like the template */
); 

Je ne pense pas qu'aucun des chemins générés automatiquement corresponde à la structure de votre fichier (lignes 2703 à 2725).

    if (!array_key_exists('template_path', $config))
    {
        $config['template_path'][] = $componentPaths['main'] . '/views/' . FOFInflector::pluralize($config['view']) . '/tmpl';

        if ($templateOverridePath)
        {
            $config['template_path'][] = $templateOverridePath . '/' . FOFInflector::pluralize($config['view']);
        }

        $config['template_path'][] = $componentPaths['main'] . '/views/' . FOFInflector::singularize($config['view']) . '/tmpl';

        if ($templateOverridePath)
        {
            $config['template_path'][] = $templateOverridePath . '/' . FOFInflector::singularize($config['view']);
        }

        $config['template_path'][] = $componentPaths['main'] . '/views/' . $config['view'] . '/tmpl';

        if ($templateOverridePath)
        {
            $config['template_path'][] = $templateOverridePath . '/' . $config['view'];
        }
    }
1
David Hayes