람보님과 기진곰님의 도움으로 lnag를 변경하는 생에 첫 번째 애드온을 제작 하였습니다.

(이건 조금만 더 테스트 해보고 내일 업로드 하겠습니다.)

 

/modules/member/lang/ko.php

의 $lang->cmd_view_saved_document = '저장함 보기';

가 지정되어있고

 

애드온을 제작하여 

 

저장함으로 임의로 변경하였습니다.

lang변경.PNG

 

위처럼 페이지의 내부의 제목은 변경 되었으나

저 탭 제목은 변경되지 않았습니다. 결국  /modules/member/lang/ko.php 를 고쳐야지 변경이되네요 ㅠㅠ

 

 

혹시 모듈  /modules/member/lang/ko.php 보다 더 높게 사용자 지정의 lang를 불러오는 방법은 없을까요?

 

애드온의 포지션은 if($called_position == 'after_module_proc' && Context::get('module') != 'admin') 입니다.

 

제작한 애드온 설정은 아래와 같습니다.

 

lang_애드온.PNG

 

감사합니다.

  • profile
    확실하게 출력하는 단계에 포지션을 쓰는게 맞겠네요.

    $called_position == 'before_display_content'

    으로 바꿔보시기 바랍니다.
  • profile profile
    앗 컴퓨터껏는데 다시 켜겠습니다!ㅎㅎ
  • profile profile
    늦은시간 답변 감사합니다.
    해당 포지션은 작동하지 않는 것 같습니다. RXE 포지션에대해서 조금 더 찾아보겠습니다.
  • profile profile
    해당포지션은 디스플레이 핸들러에서 작동하는 포지션인데요;;

    작동이 어덯게 안되던가요?

    if($called_position == 'after_module_proc' && Context::get('module') != 'admin')



    if($called_position == 'before_display_content' && Context::get('module') != 'admin')

    으로 수정하셔서 테스트 하신게 맞으실까요?
  • profile profile
    지금은 컴퓨터를껏지만 넵 그렇게했었습니다! 그렇게 하니 아예 변경이안되어
    다시 after_module_proc로 변경해둔상태입니다!
  • profile
    https://xetown.com/tips/465218
    이글 토대로 (function() use($addon_info, $called_position, &$output) { 를 써도
    카테고리 타이틀은 안바뀌네요 ㅠㅠ
  • profile profile

    위팁은 필요가 없습니다;;

     

    정확하게 말씀드리자면.. 저 팁은 그냥 애드온의 특성상 다른 애드온에서 사용되는 변수명을 그대로 사용하는 경우 문제가 발생될 수 있는 사황을 고쳐주는 역할일뿐이고..

     

    여기에서 변수명을 따로 쓰시고 계신다면 저런 메소드 콜백은 필요가 없다는 뜻입니다.

     

    결과적으로 앞서 알려드린 lang함수를 사용하여 선언하는것이 가장 큰 핵심이니, 콜백위치가 좀 더 일찍 호출하고 잇는게 아닌지 의심해봐야할 문제인듯합니다.

  • profile

    지금의 라이믹스 구조대로면 완벽하게 처리하기 힘들다고 보셔야 할 것 같습니다.

     

    라이프 사이클이 before_display_content 까지 도달했을때는 이미 템플릿이 컴파일이 완료된 상태이기 때문에

    (/classes/display/DisplayHandler.class.php L82에서 컴파일을 완료한 뒤, L85에서 display:before 트리거를 호출함.)

    $lang 데이터를 바꾸어 보아야 아무런 의미가 없습니다.

     

    after_module_proc 에서 처리하는 것이 올바른 방법입니다.

     

    다만, 현재 변경하신 내용이 업데이트 되지 않은 문제는...

    회원 메뉴 명칭은 after_module_proc 이 실행되기 전에 언어코드를 실제 문자열로 바꾸어 사용합니다.

    /modules/member/member.controller.php L2441의 addMemberMenu() 메서드를 실행해 각 모듈에서 회원 메뉴를 추가하는데, L2450에서 전달받은 메뉴명을 미리 실제 문자열로 변경해 저장해 버립니다.

     

    스킨단에서 해당 메뉴를 출력할 때 lang()으로 한번 감싸주지 않으면 언어코드가 그대로 출력될거라,

    기존 스킨들과의 하위호환을 위해 그렇게 처리한 것 같은데...

     

    아무튼, 대부분의 상황에서는 after_module_proc 에 실행하는 것으로 충분합니다만,

    위와 같은 상황에서는 실제 모듈이 실행되기 전에 (before_module_proc) 에서 실행해 주어야 업데이트가 될 것이구요.

    이마저도 회원 모듈에 속하지 않은 메뉴(커뮤니케이션, 알림센터 등)는 변경하기 힘들 것으로 보입니다.

  • profile

    위 내용은 애드온을 통해 다국어 데이터를 덮어쓰는 방식으로 처리할 때의 이야기이구요.

     

    단순히 회원 메뉴명만 바꿔야 하는 상황이라면,

    라이프 사이클이 after_module_proc 일 때, $logged_info->menu_list 의 값을 덮어씌우는 것으로 충분해 보입니다.

     

    $menu_list 는 array<string $act, string $name> 형태이므로,

    저장함 보기 기준으로 아래 코드를 사용하면 원하시는 기능을 구현할 수 있습니다.

     

    $logged_info = Context::get('logged_info');

    $logged_info->menu_list['dispMemberSavedDocument'] = '저장함';

     

    또는

     

    $this->user->menu_list['dispMemberSavedDocument'] = '저장함';

  • profile profile

    정말 친절하고 세세한 답변감사합니다,
    이해가 잘가도록 적어주셨네요ㅠㅠ 감사합니다

    애드온을 배포할계획으로 알림센터 등도 모두 찾아 넣어 주고싶습니다
    멤버모듈의
    $this->user->menu_list 를 찾아내는 방법이있을까요

    저도 찾아보겠지만

    마찬가지로 알림센터의

    $this->xxxxxx->xxxxxx 를 찾아내어서
    저 방법만 제가 숙지한다면 사용하면서 안뜨는 것 찾아내서 직접 추가가가능할것 같습니다

  • profile profile

    $logged_info = Context::get('logged_info');

    $logged_info->menu_list['dispMemberSavedDocument'] = '저장함';
    해당 방법을 사용하였는데

    추가노출.PNG

     

    메뉴가 중복되어 노출되네요

    menu_list가 메뉴를 지칭 하는것 같아요 

  • profile

    언어코드를 바꿔치기했는데 적용이 안 된다는 것은 내가 바꿔치기하기 전에 이미 다른 모듈이 그 코드를 썼다는 뜻이니, 다른 모듈이 그 코드를 쓰기 전에 더 빨리 바꿔치기하는 것이 해결책입니다.
     

    애드온이 끼어들 수 있는 시점은 순서대로 4개가 있습니다.

    1. before_module_init

    2. before_module_proc

    3. after_module_proc

    4. before_display_content

     

    3번에서 언어코드를 바꿔치기했는데 안 된다고 4번으로 바꾸면 더욱 안 되겠지요. 언어코드를 바꿔치기하기에 4번은 너무 늦어서 아무 의미가 없고, 3번도 좀 늦은 감이 있습니다. 이럴 때는 윗분 댓글처럼 2번을 시도해 봐야 합니다. 정 안되면 1~3번 시점에 모두 작동하도록 하는 것도 나쁘지 않겠고요.

     

    적절한 시점에 실행되는 가장 간단하고 정석적인 코드가 가장 올바른 코드입니다. 남이 이미 만들어놓은 자료구조를 파고 들어가서 일일이 땜빵하려고 하는 것은 복잡할뿐더러, 해당 모듈의 구조가 변경될 경우 언제라도 깨질 수 있는 불안정한 코드입니다.

  • profile profile

    다만, 이 경우는 무려 Context::init() 단에서 호출되는 경우라 일반적인 방법으로는 안되는 듯 합니다.
    Context::init() → MemberController::getInstance()->setSessionInfo() → $this->addMemberMenu(...) → lang($str)

  • profile profile
    이건 코어에서 불러오는 시점을 늦춰야겠군요.
  • profile profile
    코어 불러오는 시점을 바꾸면 모듈에 설정했는데 왜 다른 애드온이 참견해서 다른단어가 나오지 하는 상황이 벌어질 수는 있긴하겠네요
    애드온과 모듈의 전쟁같은일이랄까?
    반영이 된다면 저야 너무좋을것 같은데
    우선 깃허브에 올려두겠습니다. 감사합니다.
    저도 1번 before_module_init로 변경 해 두었습니다. 감사합니다.