Noi folosim plugin-uri pentru a trece peste clasa de bază

Putem folosi plugin-urile cadru existente pentru a trece peste cele mai multe clase de bază Joomla. Și tu poți fi sigur că este destul de ușor de făcut.

Ca plug-in-uri

În articolul „Informații generale despre plug-in-uri,“ am discutat despre ce pentru a apela plugin-ul este folosit pentru prima JPluginHelper :: importPlugin () pentru a activa clasele și metode în memoria de lucru. Dacă ne uităm la modul în care funcționează această metodă, vom vedea că codul (care se conectează) se află într-o metodă de import privat () din clasa JPluginHelper (biblioteci / joomla / plugin / helper.php):

Prima linie verifică pentru a vedea dacă un plugin specific a fost adăugat. Variabila $ a căi este o matrice asociativă care conține toate plugin-urile care au fost deja conectate. Cheia este calea completă către fișierul plug-in, iar valoarea este numele clasei. Folosind funcția PHP isset (), vom verifica dacă există un element în matrice. Dacă nu, utilizați require_once conecta acest fișier. În cele din urmă, valoarea acestui intrare este setată la true logic. Acest lucru asigură faptul că elementul de setare în matrice. Prin urmare, require_once nu va mai fi numit pentru același fișier.

Este necesar să înțelegem două lucruri importante:

Ca clase de încărcare Joomla

Acum, avem nevoie să înțelegem mai important lucru este cum să Joomla încarcă o clasă de bază în memoria de lucru. Dacă ne uităm la jimport funcția. care este de obicei folosit pentru a descărca cursuri de bază Joomla, vom vedea că acest lucru este pur și simplu o funcție în biblioteci / fișier loader.php. Să acorde o atenție la faptul că acesta este o funcție independentă, nu este o metodă de clasă. Acesta este motivul pentru care este numit numai de numele funcției și nici un nume al clasei. Aici este codul acestei funcții:

El numește pur și simplu JLoader :: metoda de import (). Primele linii ale metodei JLoader :: import () după cum urmează:

Acesta este un test - dacă clasa este conectat sau nu. Parțial auto :: $ importate o matrice statică asociativ cu tasta (tasta $ variabila), egală cu argumentul trecut în JImport (de exemplu, „joomla.plugin.plugin“), și o valoare egală cu o adevărată logică sau fals. Atunci când o clasă este conectat, un element adăugat la matrice și valoarea este setată la true. În cazul în care conexiunea a fost de succes, și fals. în cazul în pretenții. Prin urmare, de îndată ce clasa a fost conectat, Joomla nu va încerca să-l conectați din nou.

Metode JLoader :: încărcare (). JLoader :: registru () este, de asemenea, verificată la clasa de încărcare, nu a fost dacă clasa este încărcată mai devreme. Și aici facem o concluzie importantă: dacă există deja clasa (este încărcat în memoria de lucru), vom sări peste încărcarea acestei clase. Metoda pur și simplu returnează true și ieșirile. Nici una dintre metodele de Joomla nu se incarca din nou clasa.

Acest lucru înseamnă că putem folosi plugin-ul pentru a încărca clasa în memoria de lucru înainte de a fi încărcat de programe de bază Joomla. Dacă vom face acest lucru, atunci metodele noastre de clasă vor fi utilizate în locul metodelor de clasă de bază.

Plugin-uri de sistem sunt încărcate foarte devreme în memoria de lucru în ciclul de execuție Joomla mai devreme de cele mai multe (dar nu toate) clasele de bază Joomla. Acest lucru ne va ajuta pentru a obține rezultatul dorit.

Exemplu: redefinirea clasei JTableNested

Hai să facem un scurt exemplu pentru a ilustra cele de mai sus. Noi redefinim clasa de bază JTableNested. Această clasă este clasa parinte pentru toate clasele de tabele imbricate în Joomla (de exemplu, JTableCategory pentru tabele #__categories). În acest exemplu, vom demonstra modul de a trece peste clasa, dar lasă cititorul să dau seama ce fel de cod și ar dori să schimbe comportamentul.

Iată pașii care trebuie luate:

  1. Creați un nou dosar plugins / sistem / myclasses în directorul de instalare Joomla și copiați biblioteci de fișiere / Joomla / date / tablenested.php. Ca rezultat, veți obține / sistem / myclasses / fișierul tablenested.php plugin-uri (nu uitați să adăugați un fișier index.html pentru toate dosarele noi).
  2. Editați fișierul și să înlocuiască metoda existentă de reconstrui () următorul cod:
  • Acum trebuie să adăugăm plugin-ul pentru a încărca clasa noastră în loc de clasa de bază. Vom numi „myclasses“ plugin. Pentru a face acest lucru, creați un nou fișier numit myclasses.php în plugin-uri / sistem / myclasses dosar.
  • Noul fișier (plugin-uri / sistem / myclasses / myclasses.php), adăugați următorul cod:

    Rețineți că acest cod nu declară clasa. Este doar un scenariu, asa ca va fi executat în timpul sistemului de conexiune plug-in-uri, înainte de primul eveniment de sistem. Acest cod include doar noul nostru fișier tablenested.php.

  • Creați un manifest fișier XML pentru acest plug-in (plugin-uri / sistem / myclasses / myclasses.xml), cu următorul cod:

    Această tehnică vă permite să suprascrie aproape orice clasă. cu excepția celor care au fost încărcate în sistemul de conectare plug-in-uri.

    Dacă astfel încât să suprascrie clasa, nu trebuie să vă faceți griji cu privire la ceea ce va fi suprascris la actualizarea Joomla. Prin urmare, această tehnică este mult mai bine decât un hack simplu fișierele kernel. Cu toate acestea, este necesar pentru a avertiza cu privire la următoarea - în cazul în care este fixat un bug într-o clasă pe care le-ați redefinit, va trebui să verificați dacă această remediere rapidă se aplică la clasa ta. Dacă da, atunci va trebui să faceți pentru a face manual această corecție. Acest lucru va fi deosebit de important în cazul în care corectarea erorilor se referă la vulnerabilități de securitate.

    Iar la sfârșitul articolului un mic truc. Puteți adăuga următorul cod la începutul plug-in pentru a afla ce clase sunt deja încărcate și nu pot fi înlocuite prin utilizarea metodei descrisă în articol:

    Mult noroc în dezvoltarea!