Extra Form
PHP PHP 7.2
CMS Rhymix 2.x

member.insertMember

 

위와 같이 모듈명이 명시된 경우 명시된 모듈에서 제공하는 트리거호출 시점에 내가 만든 함수가 작동되도록 하겠다라는 의미로 해석이 됩니다.

 

그런데 모듈명이 없는 

 

display 와 같은 경우가 등장합니다. 

 

이해를 해보려고 검색을 하는 과정에서 발견한 문서가

 

https://xetown.com/tips/1556223

 

위 문서인데 여기에 설명에서 

 

\DisplayHandler->printContent()

 

의 부분이라고 되어 있던데요.

 

저 함수에서 전,후 트리거가 실행이 된다는 것인거죠??

 

실제로 저 함수를 찾아보니

/classes/display/DisplayHandler.class.php 

 

public function printContent(&$oModule)

 

이 부분이고 여기 함수 내 

        // call a trigger before display
        ModuleHandler::triggerCall('display', 'before', $output);

 

        // call a trigger after display
        self::$response_size = $this->content_size = strlen($output);
        ModuleHandler::triggerCall('display', 'after', $output);

 

부분이 등장하네요.

 

 

특정 모듈인 경우 해당모듈명.트리거명 

그렇지 않은 경우 트리겨명 

 

이렇게 된건로 보이는데 맞겠죠??

 

 

그럼 특정모듈이 아닌 곳에서 제공되는 트리거는 제가 위에 언급한 문서에 등장하는

 

moduleHandler.init - before
moduleHandler.init - after
moduleObject.proc - before
moduleObject.proc - after
layout - before
display - before
display - after

 

7가지 케이스가 전부인가요?

  • profile

    특정 모듈인 경우 해당모듈명.트리거명 
    그렇지 않은 경우 트리겨명

     

    이렇게 된건로 보이는데 맞겠죠??

    이름은 트리거와 아무 관련 없습니다. 마음만 먹으면 'asdfasdf1234' 같은 트리거명도 사용 가능합니다.

     

    다만 일부 케이스 제외 그렇게 하지 않는 이유는 모듈명을 붙이지 않는 경우 충돌이 생길수 있기 때문입니다.(덤으로 혼동이 생길 우려도 있습니다) 예를 들어 복권 모듈에서 lotto 트리거명을 사용했는데 댓글 랜덤추첨 모듈에서도 같은 트리거명을 사용한다면 복권 정보를 받는 자료가 갑자기 댓글 정보를 받게 되는 일이 생길수 있는 것입니다.

     

    참고로 트리거 동작 순서는 다음과 같습니다.

     

    자료에서 triggerCall로 특정 이름의 트리거 호출 -> 서드파티 자료에서 insertTrigger로 등록한 함수 순차 호출 -> 특성에 따라 반환값 확인후 진행 중단 혹은 계속

  • profile profile
    네. 제가 궁금했던건 네이밍의 규칙을 정하기 위해 저렇게 한 것 같은 추측이 들어서 질문을 하게 되었습니다. 말씀 하신 서드파티 자료들도 트리거를 제공하고 또 다른 서드파티에서 이용하고 할테니 겹치지 않기 위한 방법인 것 같네요.

    각각 자기 모듈명을 붙여서 정한다면 겹치지 않을테니까요.

    그런데 제가 처음 display 를 보고 앞에 왜 아무것도 없지? 라는 궁금증을 가졌던 것이 시간이 오래 흘러서 지금 시점에서는 이해가 가기 시작했는데요.

    코어에서 제공하는 트리거 중 이와 비슷한 케이스가 위 7가지 외에 더 있는지도 궁금하네요.
  • profile profile
    코어에 존재하는 모든 트리거는 소스코드에서 triggerCall을 검색하시면 아실수 있습니다. 즉 검색으로 나온게 7개가 끝이면 더이상 존재하지 않는겁니다.
  • profile profile

    전체를 검색해보면 되겠군요. 말씀 하신대로 검색을 해보니

    줄 79: ModuleHandler::triggerCall('layout', 'before', $oModule);
    줄 85: ModuleHandler::triggerCall('display', 'before', $output);
    줄 151: ModuleHandler::triggerCall('display', 'after', $output);
    줄 104: self::triggerCall('moduleHandler.init', 'before', $this);
    줄 286: $output = self::triggerCall('moduleHandler.init', 'after', $this->module_info);
    줄 962: $output = self::triggerCall('moduleHandler.proc', 'after', $oModule);
    줄 619: $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'before', $this);
    줄 718: $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'after', $this);
    줄 573: $output = \ModuleHandler::triggerCall('mail.send', 'before', $this);
    줄 590: $output = \ModuleHandler::triggerCall('mail.send', 'after', $this);
    줄 280: $output = \ModuleHandler::triggerCall('push.send', 'before', $this);
    줄 325: $output = \ModuleHandler::triggerCall('push.send', 'after', $this);
    줄 517: $output = \ModuleHandler::triggerCall('sms.send', 'before', $this);
    줄 556: $output = \ModuleHandler::triggerCall('sms.send', 'after', $this);


    총 14개 정도 나오는거 같네요.

    그동안 트리거 용법이나 작동에 관해 이해가 부족했는데 오늘로서 대략 용법과 작동하는 원리 등이 이해가 가는 것 같습니다.

    모듈을 만들어보기 위한 첫 걸림돌이 제거가 된거 같은 의미가 있는 날이네요.

    자세한 설명 감사했습니다.

  • profile

    모듈명.액션명으로 사용하는 것이 일반적인 관례이지만, 모듈이 아닌 코어에서 직접 호출하는 트리거는 이 규칙을 따를 수 없기 때문에 상황에 따라 적당히 만들어 씁니다.

     

    그래도 웬만하면 moduleHandler.init, moduleHandler.proc, sms.send처럼 클래스명.함수명으로 합니다. display는 XE에서 이상하게 만들어 놓은 건데 이제 와서 바꿀 수도 없으니...

  • profile profile
    네. 저와 같은 프로그래밍 언어에 학습이 덜된 초보자들이 트리거 등록부분을 보면 이거 무슨 용법인지 알기 쉽지 않더라구요. 거기서 막혀서 사실 모듈을 만들어보려는 것에 진도가 나가지 않았었네요.

    그런데 시간이 조금 더 지나서 다시 살펴보니 눈치가 없었구나 하면서 보이기 시작합니다.

    아마 이런 황당한 질문과 같은 문서들이 보인다면 php 라이믹스에 아직 많이 알지 못하는 사람들도 대략 이해할 수 있는 문서가 될 수 있을 것 같습니다.

    네이밍 규칙 이었을 뿐이라고 알고나서 보니 용법 자체가 명확하고 사용법 등이 이해가 가네요.