핵심 클래스를 재정의하는 방법?


20

더 많은 기능을 사용하거나 일부 핵심 기능을 다른 방식으로 작동 시키려면 핵심 클래스를 대체해야하는 경우가 있습니다. 핵심 클래스를 재정의하는 방법이 있습니까? 가능하다면 어떤 문제를 재정 의하여 직면 할 수 있습니까?


1
좀 더 구체적으로 만들거나 명확한 문제를 설명하기 위해 질문을 구체화 할 수 있다면 좋을 것입니다.
Valentin Despa

Joomla 3 사용자의 경우이를 확인하십시오. 도움이 될 것입니다. joomla.stackexchange.com/questions/5449/… 플러그인 -github.com/ghazal/plg_mvcoverride 감사합니다 joomla.stackexchange.com/users/270/ghazal
cha

답변:


16

네 가능합니다.

당신은 클래스를 오버라이드 (override) 시스템 플러그인을 사용할 수 있습니다,이 읽어 주시기 바랍니다 링크

직면하게 될 두 가지 문제 :

  1. 전체 클래스를 오버라이드해야합니다 (일부만이 아닌)

  2. 코어가 업데이트되고 클래스도 업데이트 / 변경되는 경우 재정의 (필요한 경우)를 업데이트해야합니다.


4
제공된 링크에서 관련 단계를 붙여 넣거나 링크가 이동하거나 변경 될 경우 링크에 대한 설명을 제공 할 수 있으면 유용합니다.
codinghands

10

얼마 전에 핵심 클래스를 재정의 할 수있는 플러그인을 만들었지 만 @jackJoe가 그의 대답에서 지적한 문제에 여전히 노출되어 있습니다. 그러나 재정의를 깔끔하게 수행 할 수 있습니다.

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


7
이 솔루션이 아름답게 작동하고 Don이 진정한 오픈 소스 정신이라고 말하고 싶습니다. 그와 그의 작품을 싫어합니다!
GDP

간단한 스크립트에는 구성 요소를 미리로드하지 않는다는 실질적인 문제가 있습니다. 따라서 구성 요소를 재정의하면 대부분의 구성 요소 (예 : com_content 구성 요소)에서 작동하지 않습니다. 잘 작동하지만 구성 요소를 재정의 할 수 있도록 구성 요소를 미리로드해야합니다 (아직 선언되지 않은 것을 재정의 할 수는 없습니다). 아, 그리고 생성자에서 모든 일을하는 대신 onAfterRoute를 사용해야합니다. 이 의견의 의미를 알고 싶다면 재정의를 시도하십시오 components/com_content/models/articles.php.
itoctopus


4

나는 이것에 아주 오랫동안 있었고 Don이 내가 한 번 완료되면 그것에 대해 더 많은 세부 사항을 줄 것이라고 약속했다.

구성 요소에 대해 Joomla MVC를 재정의하고 템플릿 html 폴더뿐만 아니라 플러그인 html 폴더에서도 재정의를 찾도록 Joomla에 지시해야했습니다.

내가 좋아하지 않은 것은 개발자가 실제로 Joomla 기본 클래스를 가져 와서 엉망으로 만드는 것이므로 가능한 경우 제동하는 대신 해당 클래스를 확장합니다.

내 프로세스는 다음과 같습니다.

  1. 재정의해야 할 수업을 받으십시오.
  2. 읽고 클래스 이름을 바꾸고 임시 클래스 폴더에 새 파일을 만듭니다.
  3. 수업 버전을로드합니다
  4. Joomla 클래스로드
  5. Joomla 템플릿 및 마지막 Joomla 구성 요소보다 플러그인에서 재정의를 찾기 위해 loadTemplate 함수를 확장하는 확장 메소드를 등록하십시오.

여기에 오히려 http://prntscr.com/3d9syq 이미지가 있습니다

아래 스 니펫의 첫 번째 부분은 사용자가 Joomla를 업데이트하려는 경우 업데이트가 완료 될 때 생성 된 임시 클래스 파일을 삭제하여 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.