จะแทนที่คลาสหลักได้อย่างไร


20

บางครั้งมีความจำเป็นต้องแทนที่คลาสหลักเพื่อรับฟังก์ชั่นเพิ่มเติมหรือเพื่อให้ฟังก์ชั่นหลักบางอย่างทำงานในอีกทางหนึ่ง มีวิธีการแทนที่คลาสหลักหรือไม่? ถ้าเป็นไปได้แล้วปัญหาอะไรที่ฉันสามารถแก้ไขได้ด้วยการเอาชนะพวกเขา?


1
มันจะดีถ้าคุณสามารถปรับแต่งคำถามของคุณเพื่อให้เจาะจงมากขึ้นหรืออธิบายปัญหาที่ชัดเจน
Valentin Despa

สำหรับผู้ใช้ Joomla 3 - ตรวจสอบสิ่งเหล่านี้ มันจะช่วยคุณ joomla.stackexchange.com/questions/5449/…ปลั๊กอิน - github.com/ghazal/plg_mvcoverrideขอขอบคุณjoomla.stackexchange.com/users/270/ghazal
cha

คำตอบ:


16

ใช่มันเป็นไปได้

คุณสามารถใช้ปลั๊กอินระบบเพื่อแทนที่การเรียนโปรดอ่านการเชื่อมโยงและนี้และนี้

ปัญหาสองข้อที่คุณจะเผชิญ:

  1. คุณต้องลบล้างทั้งคลาส (ไม่ใช่แค่บางส่วน)

  2. หากแกนกลางได้รับการอัปเดตและคลาสนั้นได้รับการปรับปรุง / เปลี่ยนแปลงคุณต้องอัปเดตการแทนที่ของคุณ (หากจำเป็น)


4
มันจะมีประโยชน์ถ้าคุณสามารถวางขั้นตอนที่เกี่ยวข้องจากลิงก์ที่ให้ไว้หรืออย่างน้อยก็ให้คำอธิบายเกี่ยวกับลิงก์ในกรณีที่มันย้ายหรือเปลี่ยนแปลง
เข้ารหัสรหัส

10

ฉันสร้างปลั๊กอินเมื่อไม่นานมานี้ที่ช่วยให้คุณสามารถแทนที่คลาสหลัก แต่ก็ยังคงตกเป็นเหยื่อของปัญหาที่ @jackJoe ชี้ให้เห็นในคำตอบของเขา อย่างไรก็ตามมันช่วยให้คุณสามารถแทนที่ได้อย่างหมดจด

https://gist.github.com/dongilbert/3237387


7
แค่อยากจะบอกว่าวิธีนี้ใช้งานได้อย่างสวยงามและดอนก็เป็นวิญญาณที่แท้จริงของโอเพ่นซอร์ส - ปิดเขาและงานของเขา !!!
GDP

มีปัญหามากมายกับสคริปต์แบบธรรมดาของคุณคือไม่โหลดองค์ประกอบล่วงหน้า ดังนั้นหากคุณแทนที่ส่วนประกอบมันไม่ได้ผลกับส่วนประกอบส่วนใหญ่ (เช่นคอมโพเนนต์ com_content) ใช้งานได้ดี แต่จะต้องโหลดส่วนประกอบล่วงหน้าเพื่อให้สามารถแทนที่ได้ (คุณยังไม่สามารถแทนที่สิ่งที่ยังไม่ได้ประกาศ) โอ้และคุณต้องใช้ onAfterRoute แทนที่จะทำทุกอย่างใน Constructor components/com_content/models/articles.phpถ้าคุณต้องการที่จะรู้ว่าสิ่งที่ผมหมายถึงความคิดเห็นนี้แล้วลองเอาชนะ
itoctopus


4

ฉันอยู่ที่นี่นานมากและสัญญากับดอนว่าเมื่อฉันทำเสร็จแล้วจะให้รายละเอียดเพิ่มเติมเกี่ยวกับมัน

ฉันต้องการแทนที่ Joomla MVC สำหรับส่วนประกอบต่างๆและบอก Joomla ให้มองหาการแทนที่ในโฟลเดอร์ html plugin ของฉันด้วยไม่ใช่เฉพาะในโฟลเดอร์ html เทมเพลต

สิ่งที่ฉันไม่ชอบคือเมื่อนักพัฒนาใช้คลาสเริ่มต้น Joomla จริงและยุ่งกับมันดังนั้นฉันจึงควรขยายคลาสนั้นถ้าฉันสามารถทำได้แทนที่จะเบรกบางอย่าง

กระบวนการของฉันทำตาม

  1. รับคลาสที่ฉันต้องการแทนที่
  2. อ่านแทนที่ชื่อคลาสสร้างไฟล์ใหม่ในโฟลเดอร์คลาส temp ของฉัน
  3. โหลดคลาสของฉันรุ่น
  4. โหลดคลาส Joomla
  5. ลงทะเบียนวิธีการขยายของฉันซึ่งขยายฟังก์ชั่น loadTemplate เพื่อค้นหาการแทนที่ในปลั๊กอินของฉัน, กว่าเทมเพลต joomla และส่วนประกอบ 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.