2013-06-13 1 views
0

J'écris un composant personnalisé. J'ai la vue employees. Sous cette vue, j'ai deux mises en page, default et modal.Erreur 500 "Affichage introuvable" lors de l'utilisation de SEF et de la réécriture d'URL

J'ai un élément de menu dans le premier niveau du menu principal, Employees qui pointe à mon avis des employés:

index.php?option=com_mycomponent&view=employees qui décide de domain.com/joomla/employees et displayes la vue par défaut comme prévu.


Maintenant, dans mon élément, je veux créer un lien vers le point de vue modal, et je le fais en utilisant JRoute et cette url:

index.php?option=com_mycomponent&view=employees&layout=modal

qui décide de

domain.com/joomla/employees/modal

Et produit cette erreur:

500 - View not found [name, type, prefix]: modal, html, mycomponentView

Si je visite index.php en utilisant index.php?option=com_mycomponent&view=employees&layout=modal ma vue modale est affichée.

J'ai également constaté que la visite domain.com/joomla/employees/employees/modal affiche la disposition correcte. C'est comme si joomla oublie quelle vue est associée à l'élément de menu au /joomla/employees, et cherche plutôt la vue "modal" à moins que les "employés" supplémentaires soient fournis dans l'url.

À noter également, domain.com/joomla/employee?layout=modal fonctionne très bien aussi bien.


Voici ce que j'ai pour mon router.php. Ce fichier a été généré pour moi en utilisant le générateur de composants au j-cook.pro.

<?php 
defined('_JEXEC') or die; 

function MycomponentBuildRoute(&$query){ 

    $segments = array(); 
    if(isset($query['view'])) 
    { 
     $view = $query['view']; 
     $segments[] = $view; 
     unset($query['view']); 
    } 

    if(isset($query['layout'])) 
    { 
     $segments[] = $query['layout']; 
     unset($query['layout']); 
    } 


    if(isset($query['id'])) 
    { 
     if(in_array($view, array('edit','view','view','editfacility','view','edit','client','editclient','viewposition','editposition','edit','view','edit','view','view','edit','view','edit','view','edit','view','edit'))) 
     { 
      $segments[] = (is_array($query['id'])?implode(',', $query['id']):$query['id']); 
      unset($query['id']); 
     } 
    }; 


    return $segments; 
} 


function MycomponentParseRoute($segments) 
{ 
    $vars = array(); 


    $vars['view'] = $segments[0]; 

    $nextPos = 1; 
    if (isset($segments[$nextPos])) 
    { 
     $vars['layout'] = $segments[$nextPos]; 
     $nextPos++; 
    } 

    if(in_array($vars['view'], array('edit','view','view','editfacility','view','edit','client','editclient','viewposition','editposition','edit','view','edit','view','view','edit','view','edit','view','edit','view','edit')) 
     && isset($segments[$nextPos])) 
    { 
     $slug = $segments[$nextPos]; 
     $id = explode(':', $slug); 
     $vars['id'] = (int) $id[0]; 

     $nextPos++; 
    } 

    return $vars; 
} 
+1

Veuillez inclure une copie de votre routeur.php dans le répertoire racine du composant ('/ components/com_mycomponent/router.php'). Ce fichier gère l'analyse et la construction des URL SEF et doit être corrigé pour gérer ce cas! –

+0

Hey! Merci beaucoup! Je n'avais même pas regardé ce dossier jusqu'à maintenant. J'ai édité la question pour inclure le contenu. J'espère que cela me mettra sur la bonne voie pour le comprendre, mais j'apprécierais beaucoup plus de perspicacité que vous pouvez fournir. Merci encore. –

Répondre

1

Il est donc difficile de fournir une réponse exacte sans connaître toutes les différentes façons dont vous voulez avoir urls être analysés. Mais je vais essayer de donner un indice sur ce qui résoudra la présente situation (sans introduire trop de nouveaux problèmes!)

Le problème de base est que le côté BuildRoute n'a pas de valeur de vue, donc il n'est pas inclus dans le url. D'un côté, ce n'est pas nécessaire, parce que c'est dans le menu. Mais il fait un peu plus difficile à analyser, si la première option est de forcer qu'il y ait une vue si vous pouvez en changer la fonction haut pour démarrer:

function MycomponentBuildRoute(&$query){ 

    $segments = array(); 
    if(isset($query['view'])) 
    { 
     $view = $query['view']; 
     $segments[] = $view; 
     unset($query['view']); 
    } 
    else 
    { 
     $app = JFactory::getApplication(); 
     $menu = $app->getMenu(); 
     $active = $menu->getActive(); 
     if ($view = $active->query['view']) { 
     $segments[] = $view; 
     } 
    } 
... 

De cette façon, s'il y a un menu article pour cela et il a une vue, nous allons le virer. Cela devrait générer domain.com/joomla/employees/employees/modal.

Vous pourriez également probablement faire cette logique du côté de l'analyse. Cela irait au lieu de l'option ci-dessus:

function MycomponentParseRoute($segments) 
{ 
    $vars = array(); 

    $app = JFactory::getApplication(); 
    $menu = $app->getMenu(); 
    $active = $menu->getActive(); 
    if ($active->query['view']) { 
     $vars['layout'] = $segments[0]; 
     $nextPos = 1; 
    } else { 
     $vars['view'] = $segments[0]; 
     $nextPos = 1; 
     if (isset($segments[$nextPos])) 
     { 
      $vars['layout'] = $segments[$nextPos]; 
      $nextPos++; 
     } 
    } 

    ... continue with final check for id 

Je probablement utiliser la deuxième option, mais les deux sont une option. En passant, vous risquez également de rencontrer des problèmes si vous essayez d'utiliser un identifiant sans définir de mise en page.

+0

Je voulais juste souligner deux choses, pour tous ceux qui viendront après. Vous avez besoin de '$ app = JFactory :: getApplication();' avant d'utiliser '$ app', et l'instruction if doit être' if ($ active-> query ['view']) '(perd la! Negation). Cela fonctionne très bien. –

+0

Je l'ai mis à jour pour que les bugs ne soient plus là. Quelle option avez-vous utilisée? Je devine la seconde? –

+0

Oui, je suis allé avec la 2ème option. –

Questions connexes