Ние използваме плъгини да се наложи над базовия клас

Можем да използваме съществуващите рамкови приставки да замени повечето от Joomla основните класове. И вие можете да бъдете сигурни, че това е доста лесно да се направи.

Под формата на добавки

В статията "Обща информация за плъгини", ние говорихме за това какво да се обадите на приставката е използвана за първи път JPluginHelper :: importPlugin (), за да включите класове и методи в работната памет. Ако погледнем към това как работи този метод, ще видим, че кода (който свързва) се намира в частен метод за внос () на класа JPluginHelper (библиотеки / Joomla / плъгин / helper.php):

Първият ред проверява дали е добавен специален плъгин. Променливата долара пътеки е асоциативен масив, съдържащ всички приставки, които вече са свързани. Ключът е пълния път до приставката е файл, а стойността е името на класа. Използвайки функцията PHP Isset (), ние проверяваме дали има елемент в масива. Ако не е, като се използва require_once свържете този файл. На последно място, стойността на този пост е настроен на логически вярно. Това гарантира, че елементът на настройка в масива. Затова require_once вече няма да се нарича за един и същи файл.

Необходимо е да се разбере две важни неща:

Както товарни класове Joomla

Сега ние трябва да разберем важното е как да се зарежда Joomla базов клас в работната памет. Ако се вгледаме в jimport на функция. който често се използва, за да изтеглите Joomla основните класове, ние виждаме, че това е просто функция на библиотеки / loader.php файл. Обърнете внимание на факта, че тя е независима функция, а не метод клас. Ето защо той се нарича само от името на функцията и без име на класа. Това е кодът на тази функция:

Той просто призовава метод JLoader :: внос (). Първите редове на метод JLoader :: вноса (), както следва:

Това е тест - дали този клас е свързан или не. Частично самостоятелно :: $ внесени статичен асоциативен масив с ключа (променлива ключ $), равна на аргумента, приет през JImport (например, "joomla.plugin.plugin"), и на стойност, равна на една логическа истина или лъжа. Когато е свързан клас, елемент добавя към масива и стойност се задава така. Ако връзката е успешна, и невярно. ако неуспешно. Ето защо, веднага след като класът е бил свързан, Joomla няма да се опита да го свържете отново.

Методи JLoader :: натоварване (). JLoader :: регистър () също се проверява за товарене на класовете, че не е дали този клас се зарежда по-рано. И тук ние правим едно важно заключение: ако класът вече съществува (е заредена в работната памет), ние пропуснете зареждането на този клас. Методът просто връща верни и изходи. Нито един от методите на Joomla не зарежда класа отново.

Това означава, че можем да използваме плъгина да се зареди класа на работната памет, преди да бъде натоварен основни програми Joomla. Ако правим това, тогава методи нашия клас ще бъдат използвани вместо методите на базовия клас.

Системни плъгини се зареждат много рано в работната памет в Joomla цикъл на изпълнение по-рано от повечето (но не всички) Joomla базови класове. Това ще ни помогне да се постигне желания резултат.

Пример: повторно определяне на клас JTableNested

Нека да направим един бърз пример за илюстрация на горното. Ние предефиниране на базовия клас JTableNested. Този клас е класа родител за всички класове вложени таблици в Joomla (например, JTableCategory за #__categories таблици). В този пример, ние ще демонстрира как да се замени този клас, но да оставите на читателя, за да разбера какъв код и биха искали да се промени поведението.

Това са стъпките, за да се вземат:

  1. Създаване на нова папка плъгини / система / myclasses в инсталационната директория на Joomla и да копирате файлове библиотеки / Joomla / база данни / tablenested.php. В резултат на това, можете да получите на плъгини / система / myclasses / tablenested.php файл (не забравяйте да добавите index.html файл за всички нови папки).
  2. Редактиране на нов файл и да замени съществуващия метод за възстановяване () следния код:
  • Сега ние трябва да добавите плъгин за зареждане на нашия клас вместо базовия клас. Ще се обадим "myclasses" плъгин. За да направите това, създайте нов файл с име myclasses.php в плъгини / система / myclasses папка.
  • Новият файл (плъгини / система / myclasses / myclasses.php) добавете следния код:

    Имайте предвид, че този код не обяви клас. Това е просто един скрипт, така че ще бъде изпълнена по време на системните връзка плъгини, преди първото събитие система. Той включва само нашата нова tablenested.php файл.

  • Създаване на явна XML-файл за този плъгин (плъгини / система / myclasses / myclasses.xml) със следния код:

    Тази техника позволява да замени почти всеки клас. с изключение на тези, които са качени на системните връзка плъгини.

    Ако е така подтискате класа, че не е нужно да се притеснявате за това, което ще бъде подменен при актуализиране на Joomla. Ето защо, тази техника е много по-добре от един прост хак файлове на ядрото. Въпреки това е необходимо, за да предупреди за следващия - ако има е фиксиран бъг в един клас, които сте предефинирани, ще трябва да се провери дали тази корекция се отнася за вашата класа. Ако е така, тогава ще трябва да направите, за да направи тази корекция ръчно. Това ще бъде особено важно, ако корекцията на грешки се отнася до уязвимости в сигурността.

    А в края на статията един малък трик. Можете да добавите следния код в началото на плъг-ин за да разберете какви класове вече са заредени и не могат да бъдат заменени с помощта на метода, описан в статията:

    Успех в развитието!