애드온에서 레이아웃 변수를 조작하려면
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.0 |
레이아웃에서 출력하는 메뉴 리스트를 동적으로 조작하고 싶습니다.
애드온 호출시점들에서 레이아웃 변수를 제어하지 못한다는 것은 알고 있었습니다.
그러다 어쩌다, 모듈 핸들러의 displayContent 함수에서 레이아웃 처리를 한다는 걸 알게 됐는데요.
그렇다면 여기 함수에서 트리거를 제공한다면 애드온에서 레이아웃 변수를 조작하는 게 가능해지는 건가요?
혹시 트리거 없이도 가능한 방법이 있을까요?

윤삼
Lv. 19
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
댓글 4
뭐 그게 굳이 아니더라도 제 개인적인 필요 때문에라도 이걸 꼭 했으면 좋겠어요ㅎㅎ
ModuleHandler->displayContent() 이후의 실행 순서는 대충 아래와 같습니다.
moduleHandler.proc (after) 트리거 호출
모듈 설정에 따라 레이아웃을 선택하고, 레이아웃 설정을 layout_info라는 이름으로 Context에 세팅 [1]
DisplayHandler->printContent() 메소드로 넘김
HTMLDisplayHandler->toDoc() 메소드에서 레이아웃 템플릿 처리 [2]
display (before) 트리거 호출
before_display_content 애드온 호출 시점
HTMLDisplayHandler->prepareToPrint() 메소드에서 경로 변환 등 마무리 작업
display (after) 트리거 호출
HTML 내용 출력 및 디버그 정보 정리
Context::close()
레이아웃에서 출력하는 HTML을 직접 수정하려면 before_display_content 애드온 호출 시점이나 display (after) 트리거를 사용하면 될 텐데, 레이아웃 설정을 조작하려면 좀 애매합니다. layout_info 변수가 세팅되는 시점[1]과 레이아웃 템플릿이 처리되는 시점[2] 사이에 끼어들 수 있는 시점이 없기 때문입니다.
코어 수정 없이 처리하려면 [1]을 하기 전의 적당한 트리거에서 LayoutModel->getLayout()을 먼저 하고 설정을 조작한 후 캐시에 다시 저장하여, 코어에서 [1]을 할 때 님이 조작한 정보를 캐시에서 불러오도록 하는 방법이 있겠는데요... 라이믹스가 업데이트되면서 언제 망가질지 모르는 꼼수인데다가 캐시를 잘못 건드리면 동일 레이아웃을 사용하는 다른 페이지에도 영향을 줄 수 있기 때문에 권장하지는 않겠습니다.
DisplayHandler 클래스에 생성자(__construct)가 없으니, 부모 클래스가 autoload되기 전에 생성자가 있는 버전을 미리 로딩해 버리면 DisplayHandler 클래스가 로딩될 때 자동으로 생성자 함수가 호출되므로 [1]과 [2] 사이에 끼어들 여지가 생깁니다만... (고급 메일 발송 모듈에서 코어의 Mail 클래스를 이런 식으로 대체하고 있습니다) DisplayHandler의 부모 클래스는 Handler이고, ModuleHandler의 부모 클래스도 Handler이기 때문에 애드온을 실행할 수 있는 타이밍이 되면 이미 로딩되어서 대체가 불가능하겠네요.
이쯤 되면 코어에 트리거를 추가하는 수밖에요.
잘 따라가다가 마지막 문단에 가서 털썩, 했네요.
알 수 없는 세계예요 @v@ ㅋㅋㅋ
어쨌든 "여지가 생깁니다만, 불가능하겠네요"라고 읽었습니다.
트리거 추가를 요청하는 이슈를
올릴까요?올렸습니다ㅋ