Vitathatatlanul a Joomla! 1.5 egyik legjobb képessége a kimenetként létrejött HTML elemek felülírása. A legtöbb ember azonban nem tudja, hogy ugyanezt megtehetjük az összes komponens osztályaival is. Felülírhatjuk a vezérlőt, a modellt és a nézetet! Ez mit jelent számunkra? Szinte soha sem kell a Joomla! alapfájljait módosítani! Mindössze egy beépülő modulra van szükségünk a vezérlő, modell vagy sablon felülírásához!
Tartalomjegyzék |
Nos, közvetlenül felülírhatjuk a vezérlőt, a modellt és a nézetet (a nézetet ebben a formában nem írhatjuk felül, de megtehetjük a sablont használva). Ez egy problémához vezet, mit tehetünk az útválasztóval? Nos, módosíthatjuk a létrehozó és az értelmező szabályokat. Tehát röviden, a Joomlában mindent felülírhatunk, kivéve az alkalmazás osztályait (JSite, JAdministrator stb.), a beépülő modulokat, modulokat és néhány beágyazott fájlt, amelyek az első beépülő meghívása előtt hajtódnak végre (ami az onAfterInitialize esemény előtt történik). Minden más felülírható!
Nagyon egyszerű. Ha megnézzük a JControllert és JModelt, láthatjuk, hogy a kód amely meghívja a vezérlőt, a modellt és a nézetet egy if(!class_exists($class)) feltétellel van körülvéve a megfelelő osztály meghívásához. Ez azt jelenti, hogy ha meghívjuk a saját osztályunkat (ugyanazzal a névvel), akkor azt fogja használni az alapértelmezett helyett. Vegyük észre a lehetőséget!
Ha még nem tudtuk, komponensekhez hozzáadhatunk nézeteket is egyszerűen hozzáadva a komponenshez a megfelelő nézet könyvtárát (és fájljait). Kombinálva az új nézetek hozzáadását és a meglévők felülírását, minden módosíthatunk egy komponensben! Tehát a rendszer hihetetlenül rugalmas!
Ahhoz, hogy hasonló teljesítményt érjünk el, csak akkor hívjuk meg az osztályt, ha használni is fogjuk. Mivel a kód require-t használ az osztály betöltéséhez, a jimport nem fog működni. Tehát hogyan határozzuk meg, hogy használni fogjuk? Egyszerűen vizsgáljuk meg az option változót az onAfterRoute eseményben. Itt egy alap kód (a com_content vezérlőjét írja felül):
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__).DS.'comcontentoverride'.DS.'my_content_controller.php');
} }}Igen. Sajnos nincs mód az osztály csak bizonyos részeinek a felülírására. A teljes osztályt felül kell írnunk. Ez azt jelenti, hogy át kell másolnunk a teljes osztályt. De legyünk tudatában annak, hogy minden későbbi Joomla! verzióban esedékes változást össze kell vonni a felülírással (ha van egy biztonsági javítás az adott fájlban, akkor a javítás felül lesz írva mindaddig, amíg nem javítjuk a felülírásban is).