web-dev-qa-db-fra.com

Mettre à jour le plugin de recherche de Joomla 2.5 à Joomla 3.x

J'ai un plugin de recherche, qui a été développé pour Joomla 2.5, le code dans le search.php est le suivant:

    <?php

    //To prevent accessing the document directly, enter this code:
    // no direct access

    defined( '_JEXEC' ) or die( 'Restricted access' );

    $mainframe->registerEvent( 'onSearch', 'plgSearchHotels' );

    JPlugin::loadLanguage( 'plg_search_hotels' );

    function &plgSearchHotelsAreas()
    {
            static $areas = array(
                    'hotels' => 'Hotels'
            );
            return $areas;
    } 

    function plgSearchHotels ( $searchdate, $airport, $resort, $numadults, $numchild, $numinfants, $ordering='' )
    {
            $db    =& JFactory::getDBO();
            $user  =& JFactory::getUser(); 

            $plugin =& JPluginHelper::getPlugin('search', 'hotels');

            $searchdate = trim( $searchdate );
            $numpassengers = $numadults + $numchild;

            if ($searchdate == '') {
                return array();
            }


            switch ( $ordering ) {
    //alphabetic, ascending
                    case 'alpha':
                            $order = 'a.name ASC';
                            break;
    //oldest first
                    case 'oldest':
    //popular first
                    case 'popular':
    //newest first
                    case 'newest':
    //default setting: alphabetic, ascending
                    default:
                            $order = 'a.name ASC';
            }

            $searchHotels = JText::_( 'Hotels' );

            $query = 'SELECT mykey, hotelName, resortName, dep, startDate, sellingPrice FROM Availability WHERE startDate = "'.$searchdate.'" AND available = "Y"';
            if($airport !== "A") $query .= ' AND dep = "'.$airport.'"';
            if($resort !== "A") $query .= ' AND resortCode = "'.$resort.'"';
            $query .= ' AND seats >= '.$numpassengers;
            $query .= ' AND beds >= '.$numpassengers.' ORDER BY sellingPrice ASC';

            $db->setQuery( $query, 0, $limit );
            $rows = $db->loadObjectList();

            return $rows;
    }
    ?>

Cependant, lorsque j'essaie d'utiliser ce code sur Joomla 3.3, il ne fonctionne pas correctement. Des idées que je fais mal?

3
RustyJoomla

Les lectures suggérées sont " Adaptation d'une extension Joomla 1.5 à Joomla 2.5 " et l'article "Création d'un plugin de recherche" sur Joomla Docs .

En fait, ce code ressemble à un Joomla! 1.5 ère recherche plugin. Cependant, il ne s'agit pas d'une forme standard… la deuxième méthode que vous avez plgSearchHotels() suit la convention de dénomination de Joomla 1.5 mais les variables qui lui sont transmises ne correspondent pas, par exemple. Voici la signature d'un plugin de recherche de contenu standard à partir de 1.5:

plgSearchContent( $text, $phrase='', $ordering='', $areas=null )

De toute évidence, le composant Hotels fait quelque chose d'unique.

Le cadeau, re: Joomla 1.5, est le $mainframe Qui était obsolète dans la ligne 1.6/2.5, il n’existe pas et n’est pas requis dans un nouveau plugin. Donc, tout d’abord, vous devez supprimer cette ligne.

Un plugin de style Joomla 1.6+ (de tout type) étend la classe de JPlugin, par exemple le plugin standard Search pour Contenu dans 2.5/3.x + est défini comme suit:

class plgSearchContent extends JPlugin
{
}

Heureusement, l'implémentation de la classe n'a pas rendu le travail trop dur, et bien que les noms de fonctions précédents aient été modifiés en noms de méthodes pour la nouvelle classe et aient été renommés, ils sont par ailleurs assez similaires.

Votre function &plgSearchHotelsAreas() deviendra function onContentSearchAreas(). C’était simple… normalement, la deuxième méthode est celle décrite ci-dessus et elle serait renommée onContentSearch(); sans que rien ne se passe, je ne saurais vraiment vous en dire plus sur cette méthode et sur la façon de la résoudre. .

Donc, la prochaine chose à faire est d’envelopper votre functions renommé dans la classe appropriée, c’est généralement un portmanteu de type plugin ( Search ) et le nom de base du composant (c.-à-d. Hotels ), je vais donc deviner que votre code sera:

class plgSearchHotels extends JPlugin
{
}

Cela devrait vous aider à démarrer… une fois que vous avez lu la documentation, mis à jour le plugin et trouvé quelques bugs, je vous suggère de poser des questions spécifiques sur tous les problèmes que vous rencontrez par la suite.

7
Craig