web-dev-qa-db-ja.com

JHtmlコア関数select.radiolistをオーバーライドする

Select radiolistの出力を上書きしたい。コアをハックすることはできますが、更新に関してそれを行うことはあまり好きではありません。

そこで、システムプラグインをチェックアウトして、JHTMLselectクラスをオーバーライドしました。しかし、それを実装する方法にこだわっています。

私はこのトピックを見つけました: コアクラスをオーバーライドする方法?

しかし、それはもはや適切に機能していないようです。また、プラグインをアップロードできません。エラーが発生します。上記のプラグインと同じコードを持っています。

これはオーバーライドのための私のコードです:

<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.Overrides
 *
 * @copyright   Copyright (C) 2012 Don Gilbert. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */

defined('JPATH_BASE') or die;

/**
 * System plugin to override core classes terms.
 *
 * @package     Joomla.Plugin
 * @subpackage  System.Overrides
 * @since       2.5
 */
class PlgSystemOverrides extends JPlugin
{
    /* We do our thing in the __construct method
     * so that our overridden classes will be
     * available everywhere
     */
    public function __construct(&$subject, $config)
    {
        parent::__construct($subject, $config);

        include_once 'config.php';
    }
}

それが私のメインのphpファイルです。これは私の設定ファイルです

<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  System.Overrides
 *
 * @copyright   Copyright (C) 2012 Don Gilbert. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE
 */
define('OVERRIDES', dirname(__FILE__).'/overrides');

// Use JLoader to register all the classes you want to override
JLoader::register('JHtmlSelect', OVERRIDES.'/select.php', true);

私のselect.phpファイルは基本的に/libraries/cms/html/select.phpにあるselect.phpファイル全体であり、ラジオリストが少し変更されています

1
Huub S

私はあなたが上に持っているものからほんの少しの変更でこれは大丈夫です。プラグインをインストールできない場合は、ファイル名またはフォルダが正しくない可能性があります。 Joomlaはそれらについて非常にうるさいです!

すべてをplg_system_overridesという名前のフォルダーに入れ、ここにファイルがあります。

overrides.xml

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.2" type="plugin" group="system" method="upgrade">
    <name>plg_system_overrides</name>
    <description>Plugin to override html radio select</description>
    <files>
        <filename plugin="overrides">overrides.php</filename>
        <filename>config.php</filename>
        <folder>overrides</folder>
    </files>
</extension>

overrides.php-他の回答で説明されているように、ここではonAfterInitialiseを使用するのが最適だと思います

<?php
defined('JPATH_BASE') or die;
class PlgSystemOverrides extends JPlugin
{
    public function onAfterInitialise()
    {
        include_once 'config.php';
    }
}

私のconfig.phpはあなたのものとまったく同じです。joomlaライブラリselect.phpoverridesフォルダーにコピーし、genericlist関数のhtml出力に小さな変更を加えました。

plg_system_overridesフォルダをplg_system_overrides.Zipに圧縮してインストールしました。プラグインをインストールした後、表示されるはずのすべてのファイルがJoomla plugins/systemフォルダーにあることを確認することは価値があります。

Admin/pluginsページからプラグインを有効にすることを忘れないでください!

ランダムなサイトコンポーネントレイアウトファイルに挿入してテストしました

<?php echo JHtml::_('select.genericlist', array('a', 'b', 'c'), 'testselect'); ?>

また、ブラウザーのdevtoolsを使用してhtmlを検査すると、変化がわかりました。

2
Robbie Jackson

JHtml::register()を使用して、特定のメソッドをオーバーライドできます。

defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Plugin\CMSPlugin;

class PlgSystemOverrides extends CMSPlugin
{
    public function onAfterInitialise()
    {
        if (!HTMLHelper::isRegistered('select.radiolist'))
        {
            HTMLHelper::register('select.radiolist', array(__CLASS__, 'radiolist'));
        }
    }

    public static function radiolist()
    {
        // Your custom function here.
    }
}
2
Sharky