질문/조언질답게시판
Extra Form
PHP PHP 7.0
CMS Rhymix

레이아웃에서 출력하는 메뉴 리스트를 동적으로 조작하고 싶습니다.

애드온 호출시점들에서 레이아웃 변수를 제어하지 못한다는 것은 알고 있었습니다.

 

그러다 어쩌다, 모듈 핸들러의 displayContent 함수에서 레이아웃 처리를 한다는 걸 알게 됐는데요.

그렇다면 여기 함수에서 트리거를 제공한다면 애드온에서 레이아웃 변수를 조작하는 게 가능해지는 건가요?

혹시 트리거 없이도 가능한 방법이 있을까요?

  • profile
    관리자 페이지가 아닌 곳에서도 레이아웃을 수정할 수 있으면 꽤 편리하겠네요ㅎㅎ 잘 됬으면 좋겠습니다.
  • profile profile
    네, 실제로 (상황에 따라 레이아웃을 하나하나 수동 설정하는 것보다) 특정 조건에 맞춰 레이아웃을 별개로 출력한다든지 하는 수요가 꽤 있었던 것 같아요.
    뭐 그게 굳이 아니더라도 제 개인적인 필요 때문에라도 이걸 꼭 했으면 좋겠어요ㅎㅎ
  • profile

    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이기 때문에 애드온을 실행할 수 있는 타이밍이 되면 이미 로딩되어서 대체가 불가능하겠네요.

     

    이쯤 되면 코어에 트리거를 추가하는 수밖에요.

  • profile profile

    잘 따라가다가 마지막 문단에 가서 털썩, 했네요.
    알 수 없는 세계예요 @[email protected] ㅋㅋㅋ
    어쨌든 "여지가 생깁니다만, 불가능하겠네요"라고 읽었습니다.
    트리거 추가를 요청하는 이슈를 올릴까요? 올렸습니다ㅋ