Bagaimana cara mengganti kelas inti?


20

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 menimpanya?


1
Akan lebih bagus jika Anda bisa memperbaiki pertanyaan Anda untuk membuatnya sedikit lebih spesifik atau untuk menggambarkan masalah yang jelas.
Valentin Despa

Untuk pengguna Joomla 3 - lihat ini. Itu akan membantumu. joomla.stackexchange.com/questions/5449/... Plugin - github.com/ghazal/plg_mvcoverride Terima kasih joomla.stackexchange.com/users/270/ghazal
cha

Jawaban:


16

Ya itu mungkin.

Anda dapat menggunakan sistem plugin untuk menimpa kelas, silahkan baca ini hubungan 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).


4
Akan bermanfaat jika Anda dapat menempelkan langkah-langkah terkait dari tautan yang disediakan, atau setidaknya memberikan deskripsi tautan, jika mereka bergerak atau berubah.
kode tangan

10

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


7
Hanya ingin mengatakan bahwa solusi ini bekerja dengan indah, dan bahwa Don adalah semangat asli Open Source yang bersahabat - lindungi dia dan karyanya !!!
PDB

Ada masalah besar dengan skrip sederhana Anda, yaitu skrip tidak preload komponen. Jadi, jika Anda mengganti komponen, itu benar-benar tidak berfungsi untuk sebagian besar dari mereka (misalnya komponen com_content). Ini bekerja dengan baik, tetapi harus memuat komponen agar dapat menimpanya (Anda tidak dapat menimpa sesuatu yang belum dideklarasikan). Oh, dan Anda harus menggunakan pada AfterRoute daripada melakukan semuanya di konstruktor. Jika Anda ingin tahu apa yang saya maksud dengan komentar ini, maka coba ganti components/com_content/models/articles.php.
itoctopus


4

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 bukan 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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.