web-dev-qa-db-ja.com

検索プラグインをJoomla 2.5からJoomla 3.xに更新します

Joomla 2.5用に開発された検索プラグインを入手しました。search.phpのコードは次のとおりです。

    <?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;
    }
    ?>

ただし、Joomla 3.3でこのコードを使用しようとすると、正しく機能しません。私が間違っていることはありますか?

3
RustyJoomla

推奨される読み物は、「 Joomla 2.5へのJoomla 1.5拡張機能の適応 」とJoomla Docsの "Creating A Search Plugin"記事 です。

実際、そのコードはJoomlaのように見えます! 1.5時代の検索プラグイン。ただし、これは標準形式ではありません... plgSearchHotels()を使用する2番目のメソッドは、Joomla 1.5の命名規則に従いますが、それに渡される変数が一致しません。これは、1.5の標準コンテンツ検索プラグインのシグネチャです。

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

明らかにHotelsコンポーネントは何かユニークなことをしています。

プレゼント、re:Joomla 1.5は、1.6/2.5行で廃止された_$mainframe_であり、存在せず、新しいプラグインでは必要ありません。したがって、最初にその行を削除する必要があります。

Joomla 1.6+スタイルのプラグイン(任意のタイプ)は、JPluginのクラスを拡張します。たとえば、標準のSearchプラグイン2.5/3.x +のコンテンツは次のように定義されます。

_class plgSearchContent extends JPlugin
{
}
_

幸い、クラスの実装によって作業が難しくなりませんでした。以前の関数名は新しいクラスのメソッド名に変更され、ラベルが付け直されましたが、それ以外はかなり似ています。

あなたのfunction &plgSearchHotelsAreas()function onContentSearchAreas()になります。これは単純な方法でした。通常、2番目の方法は上記のとおりで、名前はonContentSearch()に変更されます-他に何が起こっているかを知らずに、この特定の方法とそれを修正する方法についてこれ以上アドバイスすることはできません。

したがって、次のことは、名前を変更したfunctionsを適切なクラスでラップすることです。これは通常、プラグインタイプのポートマントです(Search )とコンポーネントのコア名(つまりHotels)なので、コードを続けると、次のようになります。

_class plgSearchHotels extends JPlugin
{
}
_

それであなたは始められるはずです...ドキュメントを読み、プラグインを更新していくつかのバグにぶつかったら、あなたがぶつかったその後の問題について特定の質問を開くことをお勧めします。

7
Craig