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


20

Đô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?


1
Sẽ thật tuyệt nếu bạn có thể tinh chỉnh câu hỏi của mình để làm cho nó cụ thể hơn một chút hoặc để mô tả một vấn đề rõ ràng.
Valentin Despa

Đối với người dùng Joomla 3 - hãy kiểm tra những điều này. Nó sẽ giúp bạn. j Joomla.stackexchange.com/questions/5449/ Plugin Plugin - github.com/ghazal/plg_mvcoverride Cảm ơn j Joomla.stackexchange.com/users/270/ghazal
cha

Câu trả lời:


16

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

Bạn có thể sử dụng một plugin hệ để ghi đè lên các lớp học, vui lòng đọc này liên kếtnàynày

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).


4
Sẽ hữu ích nếu bạn có thể dán các bước thích hợp từ các liên kết được cung cấp hoặc ít nhất là đưa ra mô tả về các liên kết, trong trường hợp chúng di chuyển hoặc thay đổi.
mã hóa

10

Tôi đã tạo một plugin cách đây một thời gian 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


7
Chỉ muốn nói rằng giải pháp này hoạt động rất hay, và Don là một tinh thần tốt bụng thực sự của Nguồn mở - ngả mũ với anh ấy và công việc của anh ấy !!!
GDP

Có một vấn đề đáng kể với tập lệnh đơn giản của bạn, đó là nó không tải trước các thành phần. Vì vậy, nếu bạn ghi đè các thành phần, nó thực sự không hoạt động đối với hầu hết chúng (ví dụ: thành phần com_content). Nó hoạt động tốt, nhưng nó phải tải trước thành phần để nó có thể ghi đè lên chúng (bạn không thể ghi đè lên thứ gì đó chưa được khai báo). Ồ, và bạn phải sử dụng onAfterRoute thay vì thực hiện toàn bộ công việc trong hàm tạo. Nếu bạn muốn biết ý của tôi về bình luận này thì hãy thử ghi đè components/com_content/models/articles.php.
itoctopus


4

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ứ không phải 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.