บางครั้งมีความจำเป็นต้องแทนที่คลาสหลักเพื่อรับฟังก์ชั่นเพิ่มเติมหรือเพื่อให้ฟังก์ชั่นหลักบางอย่างทำงานในอีกทางหนึ่ง มีวิธีการแทนที่คลาสหลักหรือไม่? ถ้าเป็นไปได้แล้วปัญหาอะไรที่ฉันสามารถแก้ไขได้ด้วยการเอาชนะพวกเขา?
บางครั้งมีความจำเป็นต้องแทนที่คลาสหลักเพื่อรับฟังก์ชั่นเพิ่มเติมหรือเพื่อให้ฟังก์ชั่นหลักบางอย่างทำงานในอีกทางหนึ่ง มีวิธีการแทนที่คลาสหลักหรือไม่? ถ้าเป็นไปได้แล้วปัญหาอะไรที่ฉันสามารถแก้ไขได้ด้วยการเอาชนะพวกเขา?
คำตอบ:
ใช่มันเป็นไปได้
คุณสามารถใช้ปลั๊กอินระบบเพื่อแทนที่การเรียนโปรดอ่านการเชื่อมโยงและนี้และนี้
ปัญหาสองข้อที่คุณจะเผชิญ:
คุณต้องลบล้างทั้งคลาส (ไม่ใช่แค่บางส่วน)
หากแกนกลางได้รับการอัปเดตและคลาสนั้นได้รับการปรับปรุง / เปลี่ยนแปลงคุณต้องอัปเดตการแทนที่ของคุณ (หากจำเป็น)
ฉันสร้างปลั๊กอินเมื่อไม่นานมานี้ที่ช่วยให้คุณสามารถแทนที่คลาสหลัก แต่ก็ยังคงตกเป็นเหยื่อของปัญหาที่ @jackJoe ชี้ให้เห็นในคำตอบของเขา อย่างไรก็ตามมันช่วยให้คุณสามารถแทนที่ได้อย่างหมดจด
components/com_content/models/articles.php
ถ้าคุณต้องการที่จะรู้ว่าสิ่งที่ผมหมายถึงความคิดเห็นนี้แล้วลองเอาชนะ
สำหรับผู้ใช้ Joomla 3 - ตรวจสอบสิ่งเหล่านี้ มันจะช่วยคุณ
ปลั๊กอิน - https://github.com/ghazal/plg_mvcoverride
http://docs.joomla.org/How_to_override_the_component_mvc_from_the_Joomla!_core
ฉันอยู่ที่นี่นานมากและสัญญากับดอนว่าเมื่อฉันทำเสร็จแล้วจะให้รายละเอียดเพิ่มเติมเกี่ยวกับมัน
ฉันต้องการแทนที่ Joomla MVC สำหรับส่วนประกอบต่างๆและบอก Joomla ให้มองหาการแทนที่ในโฟลเดอร์ html plugin ของฉันด้วยไม่ใช่เฉพาะในโฟลเดอร์ html เทมเพลต
สิ่งที่ฉันไม่ชอบคือเมื่อนักพัฒนาใช้คลาสเริ่มต้น Joomla จริงและยุ่งกับมันดังนั้นฉันจึงควรขยายคลาสนั้นถ้าฉันสามารถทำได้แทนที่จะเบรกบางอย่าง
กระบวนการของฉันทำตาม
นี่คือภาพแทน http://prntscr.com/3d9syq
ส่วนแรกในตัวอย่างด้านล่างคือการตรวจสอบว่าผู้ใช้อยู่ที่ไหนถ้าเขากำลังจะทำการปรับปรุง Joomla ฉันกำลังลบไฟล์คลาส temp ที่สร้างขึ้นเพื่อให้แน่ใจว่าเราได้รับไฟล์ใหม่เมื่อการอัปเดตเสร็จสมบูรณ์กว่าการดูแลหมายเลข JackJoe 2
if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {
JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
$indexContent = '';
JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}
$YjsgJViewDefaultRead = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";
//extend JView library class
if (!JFile::exists($YjsgJViewDefaultFile)) {
$YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
$YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
}
require_once($YjsgJViewDefaultFile);
jimport('joomla.application.component.view');
JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);