it-swarm-vi.com

Làm thế nào để ghi đè các lớp lõi?

Đôi khi cần phải ghi đè các lớp lõi để có thêm chức năng hoặc để làm cho một số chức năng cốt lõi hoạt động theo cách khác. Có cách nào để ghi đè các lớp lõi? Nếu có thể thì vấn đề gì tôi có thể gặp phải bằng cách ghi đè chúng?

20
Dmitry Rekun

Vâng, nó là có thể.

Bạn có thể sử dụng plugin hệ thống để ghi đè các lớp, vui lòng đọc này linkthisthis

Hai vấn đề mà bạn sẽ phải đối mặt:

  1. bạn cần ghi đè cả lớp (không chỉ các phần của nó)

  2. nếu lõi được cập nhật và lớp cũng được cập nhật/thay đổi, bạn cần cập nhật ghi đè của mình (nếu cần).

16
jackJoe

Tôi đã tạo một plugin trước đây cho phép bạn ghi đè các lớp cốt lõi, nhưng nó vẫn trở thành con mồi cho các vấn đề mà @jackJoe đã chỉ ra trong câu trả lời của anh ấy. Tuy nhiên, nó cho phép bạn thực hiện ghi đè một cách sạch sẽ.

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

10
Don Gilbert
5
cha

Tôi đã ở trên cái này trong một thời gian rất dài và hứa với Don rằng một khi tôi đã hoàn thành sẽ cung cấp thêm chi tiết về nó.

Tôi cần ghi đè Joomla MVC cho các thành phần và bảo Joomla tìm kiếm ghi đè trong thư mục html plugin của tôi, không chỉ trong thư mục html mẫu.

Điều tôi không bao giờ thích là khi các nhà phát triển thực sự lấy lớp mặc định của Joomla và gây rối với nó, vì vậy tôi thà mở rộng lớp đó nếu có thể, thay vì phanh một cái gì đó.

Quá trình của tôi không theo sau.

  1. Nhận lớp tôi cần ghi đè
  2. Đọc nó, thay thế tên lớp, tạo tệp mới trong thư mục lớp tạm thời của tôi
  3. Tải phiên bản của lớp tôi
  4. Tải lớp Joomla
  5. Đăng ký phương thức mở rộng của tôi để mở rộng chức năng loadTemplate để tìm ghi đè trong plugin của tôi, hơn mẫu j Joomla và thành phần j Joomla cuối cùng

đây là hình ảnh chứ http://prntscr.com/3d9syq

Các phần đầu tiên trong đoạn trích dưới đây là kiểm tra xem người dùng đang ở đâu, nếu anh ta chuẩn bị cập nhật Joomla Tôi đang xóa các tệp lớp tạm thời được tạo để đảm bảo rằng chúng tôi nhận được các tệp mới khi cập nhật hoàn tất, không quan tâm đến số 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