Как переопределить структуру МВК компонента в ядре системы Joomla!

From Joomla! Documentation

This page is a translated version of the page How to override the component mvc from the Joomla! core and the translation is 93% complete.

Outdated translations are marked like this.
Other languages:
English • ‎español • ‎français • ‎русский

ПРИМЕЧАНИЕ

Этот метод действует только если Вы установите и включите сторонний МВК плагин "joomla-override", который можно найти в GitHub или примените свой собственный его эквивалент. Это подходит для опытных разработчиков, просто имейте в виду что этот [плагин] не входит в [состав] ядра [системы] Joomla!.

Резюме

Иногда возникает необходимость, когда Вам нужно переопределить МВК компонент [системы] Joomla! чтобы добавить новый функционал или чтобы полностью индивидуально подстроить этот компонент. МВК компонент может быть полностью переопределен использованием тех же названий классов, которые используются в этом компоненте. Это достигается загрузкой какого-либо системного плагина прежде чем приложение отправляет этот компонент.

Для выполнения этого Вы можете создать свой собственный плагин.

class plgSystemComContentOverride extends JPlugin {
      public function __construct(&$subject, $config = array()) {
         parent::__construct($subject, $config);
     }

     public function onAfterRoute() {
         $app = JFactory::getApplication();
         if('com_content' == JRequest::getCMD('option') && !$app->isAdmin()) {
             require_once(dirname(__FILE__) . '/comcontentoverride/my_content_controller.php');
         }
     } 
}



Another alternative is a modern plugin MVC Override which uses similar (but a little changed) logic and is much improved. MVC Override implements this tutorial approach but has wider possibilities. (At least by 2016-08-04 it's not listed at JED)



Смелое начало переопределений

Вы можете переопределять шаблонизацией или размером приложения (передняя часть/административная часть)

Использование метода шаблонизации

Переопределите контроллер главного компонента

TEMPLATE_NAME/code/COMPONENT_NAME/CONTROLLER.php

Переопределите контроллер другого компонента

TEMPLATE_NAME/code/COMPONENT_NAME/controllers/CONTROLLER_NAME.php

Переопределите модели

TEMPLATE_NAME/code/COMPONENT_NAME/models/MODEL_NAME.php

Переопределите виды

TEMPLATE_NAME/code/COMPONENT_NAME/views/VIEW_NAME/VIEW_NAME(.FORMAT).php

Использование метода размера приложения

Вы можете переопределить создавая папку code в главном пути приложения.

Примечание: этот метод эксперементален. Прочитайте, пожалуйста, https://groups.google.com/forum/?fromgroups=#!searchin/joomla-dev-cms/override/joomla-dev-cms/_vVxbHsXm20/JdsBRP8xrPAJ и это http://joomlacode.org/gf/project/joomla/tracker/?action=TrackerItemEdit&tracker_item_id=29031

Общее переопределение веб-сайта

code/COMPONENT_NAME/CONTROLLER.php

Переопределите контроллер другого компонента

code/COMPONENT_NAME/controllers/CONTROLLER_NAME.php

Переопределите модели

code/COMPONENT_NAME/models/MODEL_NAME.php

Переопределите виды

code/COMPONENT_NAME/views/VIEW_NAME/VIEW_NAME(.FORMAT).php

Общее переопределение администратора

administrator/code/COMPONENT_NAME/CONTROLLER.php

Переопределите контроллер другого компонента

administrator/code/COMPONENT_NAME/controllers/CONTROLLER_NAME.php

Переопределите модели

administrator/code/COMPONENT_NAME/models/MODEL_NAME.php

Переопределите виды

administrator/code/COMPONENT_NAME/views/VIEW_NAME/VIEW_NAME(.FORMAT).php

Расширение класса по умолчанию

если Вы включите функционал переопределения класса, то Вы можете расширить классы и переопределить свои произвольные методы.

Познакомтесь с этим примером с контроллером баннера.

файл: administrator/code/com_banners/controller.php

/**
 * @copyright   Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 */
// No direct access
defined('_JEXEC') or die;
/**
 * Banners master display controller.
 *
 * @package             Joomla.Administrator
 * @subpackage  com_banners
 * @since               1.6
 */
class BannersController extends BannersControllerDefault
{
//your custom methods here
}