it-swarm-id.com

Bagaimana cara mengganti kelas inti?

Terkadang ada kebutuhan untuk menimpa kelas inti untuk mendapatkan lebih banyak fungsi atau untuk membuat beberapa fungsi inti bekerja dengan cara lain. Apakah ada cara bagaimana menimpa kelas inti? Jika mungkin maka masalah apa yang bisa saya hadapi dengan mengesampingkannya?

20
Dmitry Rekun

Ya itu mungkin.

Anda dapat menggunakan plugin sistem untuk mengganti kelas, harap baca ini tautan dan ini dan ini

Dua masalah yang akan Anda hadapi:

  1. anda perlu mengganti seluruh kelas (bukan hanya sebagian saja)

  2. jika inti diperbarui dan kelas juga diperbarui/diubah, Anda perlu memperbarui penggantian Anda (jika perlu).

16
jackJoe

Saya membuat sebuah plugin beberapa waktu lalu yang memungkinkan Anda untuk menimpa kelas inti, tetapi masih menjadi mangsa masalah yang @jackJoe tunjukkan dalam jawabannya. Namun, ini memungkinkan Anda untuk melakukan penggantian dengan bersih.

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

10
Don Gilbert
5
cha

Saya sudah membahas hal ini untuk waktu yang sangat lama dan berjanji kepada Don bahwa setelah saya selesai akan memberikan rincian lebih lanjut tentang hal itu.

Saya perlu mengganti komponen Joomla MVC dan memberitahu Joomla untuk mencari pengganti dalam folder html plugin saya juga, tidak hanya di dalam folder template html.

Apa yang tidak pernah saya sukai adalah ketika para pengembang benar-benar mengambil kelas default Joomla dan mengacaukannya, jadi saya lebih suka memperpanjang kelas itu jika saya bisa, alih-alih mengerem sesuatu.

Proses saya memang mengikuti.

  1. Dapatkan kelas yang harus saya timpa
  2. Baca, ganti nama kelas, buat file baru di folder kelas temp saya
  3. Muat versi kelas saya
  4. Muat kelas Joomla
  5. Daftarkan metode extended saya yang memperluas fungsi loadTemplate untuk mencari override di plugin saya, daripada template joomla dan komponen joomla terakhir

di sini adalah gambarnya agak http://prntscr.com/3d9syq

Bagian pertama dalam cuplikan di bawah ini adalah memeriksa di mana pengguna berada, jika ia akan memperbarui Joomla saya menghapus file kelas temp yang dibuat untuk memastikan bahwa kami mendapatkan yang baru ketika pembaruan selesai yang daripada menangani nomor 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);
4
Dan