web-dev-qa-db-fra.com

Utiliser JRoute dans le backend? Presque compris, aide nécessaire

J’avais besoin que JRoute fonctionne dans le backend pour pouvoir créer un événement avec mon composant d’événement et envoyer un courrier électronique contenant l’URL de SEF. Après des recherches, j'ai trouvé quelques astuces concernant la configuration de l'instance de l'application sur le site, appelez JRoute, puis définissez l'application sur admin. Cependant, pendant que je reçois l'URL SEF, quelque chose ne va pas pendant la redirection après la création de l'événement.

Voici comment je fais cela, qui est fondamentalement une copie d'un post plus ancien que j'ai trouvé:

$live_site = substr(JURI::root(), 0, -1);
    if(JPATH_BASE == JPATH_ADMINISTRATOR) {
        // In the back end we need to set the application to the site app instead in order for JRoute to work
        JFactory::$application = JApplication::getInstance('site');
    }

    // Create the URL
    $url = $live_site . JRoute::_('index.php?option=com_icagenda&view=list&layout=event&id=' . $id . '&Itemid=' . $Itemid);

    // Check if we are in the backend again
    if(JPATH_BASE == JPATH_ADMINISTRATOR) {
         // In backend we need to remove administrator from URL as it is added even though we've set the application to the site app
        $eventLink= str_replace($live_site .'/administrator', $live_site, $url);
        // Set the appilcation back to the administartor app
        JFactory::$application = JApplication::getInstance('administrator');
    }               

Ce qui précède semble fonctionner, mais le problème survient lors de la redirection, après la création de l'événement et l'envoi du courrier électronique. Normalement, la page d'affichage d'événements de l'administrateur contient ce type d'URL:

administrateur/index.php? option = com_icagenda & layout = edit & id = 23

Mais à cause de l'activité JApplication :: getInstance, l'URL de redirection est foirée et je reçois une erreur 500. L'URL foiré a cette forme

administrateur/index.php/composant/icagenda /? view = événement & mise en page = modifier & id = 23

Je pense que la solution que j'ai collée provenait de Joomla 1.5 et que je devrais peut-être faire quelque chose de différent dans 3?

Des idées?

Merci!

3
Brian

JRoute n'est pas fiable sur le backend. Votre approche peut fonctionner sur une installation simple, mais si vous avez un plug-in SEF tiers, ou même un routage légèrement non orthodoxe dans des composants tiers, cela échouera misérablement.

Je ne vais donc pas répondre à la question de savoir comment se débarrasser de l'erreur 500. Mais propose une solution alternative.

Dans une extension SEF populaire, ACEsef si mes souvenirs sont exacts, ils ont utilisé l'approche la plus simple et la plus efficace: faire un appel ajax à un composant frontal (ou un plugin, votre choix) et le laisser exécuter JRoute à partir du real = frontend.

3
Riccardo Zorn

Voici comment j'ai fini par le faire fonctionner:

$live_site = substr(JURI::root(), 0, -1);
$app    = JApplication::getInstance('site');
$router = &$app->getRouter();
$url = $router->build($live_site.'/index.php?option=com_icagenda&view=list&layout=event&id=' . $id . '&Itemid=' . $Itemid);
$url= $url->toString();
$eventLink= str_replace($live_site .'/administrator', $live_site, $url);

Je ne sais pas bien ce que je devrais faire avec cette $ app par la suite ...

3
Brian