5. Action

조회 수 723 추천 수 0 2011.01.17 12:43:50
SMaker *.22.160.57

Action 소개

XpressEngine의 모든 입력과 출력은 index.php를 통해서 이루어집니다.

입력된 요청을 분석후 대상 Module을 찾은 후 그 Module의 어떤 동작을 해야 하는지 결정하는 것이 Action입니다.
보통 이 동작을 결정하는 Action은 Request Argument의 $act 변수값을 이용합니다..

이 Action에 대한 선언은 모듈의 ./conf/module.xml에 정의되어 있습니다.

Action 명세

<?xml version="1.0" encoding="utf-8"?>
<modules>
    <grants />
    <permissions />
    <actions>
        <action name="dispFileAdminList" type="view" admin_index="true" standalone="true" />
        <action name="dispFileAdminConfig" type="view" standalone="true" />
        <action name="procFileUpload" type="controller" standalone="true" />
        <action name="procFileDownload" type="controller" standalone="true" />
        <action name="procFileAdminDeleteChecked" type="controller" standalone="true" />
        <action name="procFileAdminInsertConfig" type="controller" standalone="true" />
    </actions>
</modules>
  • <action ... /> - Action의 선언
    • name
      • Action의 이름이며 이 이름은 해당 모듈의 method 이름이기도 합니다.
      • Action 이름에 Admin이라는 문자열이 포함되어 있으면 관리 권한이 있어야 동작하게 됩니다.
    • type
      • 모듈을 구성하는 view, model, controller 중 어디에 선언되었는지를 정의합니다.
      • 이 type을 이용하여 모듈.[type].php 파일에서 지정된 method를 호출합니다.
      • Action 이름에 Admin 문자열이 포함되어 있으면 모듈.admin.[type].php 파일에서 지정된 method를 호출합니다.
    • standalone
      • 별도의 mid를 요청 받지 않고 모듈 자체로도 실행 가능한지 선언할 수 있습니다.
      • 모든 모듈이 mid를 생성하지 않고 모듈 자체적으로 동작할 수도 있는데 이럴 경우 mid 없이 사용해도 된다는 것을 알립니다.
      • standalone이 false로 되어 있고 mid를 요청 받지 못한 경우 모듈 실행 시 에러를 출력하게 됩니다.
    • index
      • 특정 모듈이 요청될 때 $act 값이 없거나 선언된 $act에 속하는 것이 없을 때 기본 Action으로 지정한다는 것입니다.
      • 하나의 Action만 적용됩니다.
    • admin_index
      • Admin 모듈에서 특정 모듈의 관리자 view를 표시할 때 기본 관리자 view를 찾을 때 사용됩니다.
    • setup_index
      • 모듈의 설정 페이지로 사용됩니다. (실제로 사용되고 있는지 알 수 없습니다)
  • <permission ... /> - Permission의 선언
    • action
      • 모듈 실행 권한을 지정할 Action의 이름입니다.
    • target
      • 모듈 실행 권한을 지정할 수 있습니다.
        • member : 회원
        • manager : 관리자

Action 이용

Action은 $act 라는 변수를 통해서 호출할 수 있습니다.

호출은 GET/ POST/ JSON/ XMLRPC 어떤 경우에도 act라는 이름을 이용하게 됩니다.

예) editor 모듈의 dispEditorPopup() 호출 (./modules/editor/editor.view.php)

?module=editor&act=dispEditorPopup&editor_sequence=1&component=image_editor

Action Forward

일반적으로 XE의 Action은 모듈에 귀속됩니다.

즉 별다른 지시가 없을 경우 $act 변수에 의해 Action이 호출되면 현재 동작중인 모듈의 Action으로 인정이 되어 실행됩니다.

하지만 경우에 따라서 현재 동작중인 모듈이 아닌 다른 모듈의 Action이 호출될 경우가 있습니다.

 

대표적인 예가 RSS 모듈입니다.

rss라는 Action은 게시판 모듈에서 정의된 Action이 아니지만 Action Forward 기능을 통해 호출되어 실행이 됩니다.

?mid=board&act=rss

Action Forward는 모듈 독립적인 기능을 수행하기를 원할때 사용할 수 있습니다.

위와 같은 요청의 경우 board 라는 mid를 찾게 되고 이 mid가 게시판 모듈의 mid일 경우 rss라는 Action이 없습니다.

이럴 경우 XE는 Action Forward 등록된 것중에 rss라는 것이 있는지 찾게 됩니다.

rss라는 Action은 RSS모듈의 View type으로 DB에 등록이 되어 있어서 XE는 board라는 mid의 정보를 모두 설정하고 나서 RSS 모듈의 View 객체를 생성해서 rss method를 실행하게 됩니다.

 

이 Action Forward는 현재 요청된 모듈의 레이아웃이나 정보를 유지한채 다른 동작을 원할 경우 필요합니다.

다른 예로 친구 목록을 보는 Action은 Communication 모듈의 dispCommunicationFriend 라는 Action으로 동작을 합니다.

이 Action은 현재 보고 있는 모듈의 레이아웃등을 그대로 유지한채 내용을 친구 목록으로 대체합니다.

 

즉 컨텐츠 영역을 약속된 Action에 따라서 바꾸어서 출력할 수도 있고 요청된 모듈의 정보를 바탕으로 다른 결과를 유도할 수도 있는 기능입니다.

 

  • Action Forward의 등록
    보통 Action Forward는 모듈.class.php 에서 moduleInstall() 시에 저장이 됩니다.
    아래와 같이 등록할 수가 있습니다.

    1. $oModuleController = &getController('module');
      $oMdouleController->insertActionForward('모듈명','타입','Action이름');
  • Action Forward의 검증
    Action Forward가 잘 등록되었는지는 아래와 같은 코드로 확인할 수가 있고 보통 모듈.class.php의 checkUpdate() method에서 이용됩니다.

    1. $oModuleModel = &getModel('module');
      if($oModuleModel->getActionForward('Action이름')) ...
  • Action Forward의 삭제
    Action Forward가 필요 없을 경우 삭제하기 위한 용도로 이용됩니다.

    1. $oModuleModel = &getModel('module');
      $oModuleModel = &getController('module');
      if($oModuleModel->getActionForward('Action이름'))
          $oModuleController->deleteActionForward('모듈명','타입','Action이름');

그 외 Action의 이름이 (disp|proc|get)모듈 이름과 같이 이루어진 경우가 아닐 경우 Action Forward를 등록해야 합니다.

 


guny

2010.07.03 17:30:49
*.125.154.45

permissions설명이 빠졋어요...

추가해주세요...

SMaker

2010.07.03 18:23:33
*.22.160.31

추가했어요 :)

guny

2010.07.04 01:54:21
*.125.21.160

추천
1
비추천
0

와..고맙습니다..

그니까...저 설명을 풀이하면 ..반드시 권한이 부여되어야 할 액션이라는 얘기네요..맞나요?

st.june

2011.01.16 21:04:54
*.39.176.17

코드 부분에 <module 이 아니라 <modules>가 되어야 하지 않나요?

상식적으로 생각하면 그런데 제가 xml은 잘 몰라서 ..; 제가 잘못 알고 있는 거면 어째서 <module로 표시하는지 누가 좀 알려주세요~

SMaker

2011.01.17 12:43:07
*.22.160.57

지적 감사합니다.


오타 수정하였습니다 :)

st.june

2011.01.16 21:08:06
*.39.176.17

standalone

  • 별도의 mid를 요청 받지 않고 모듈 자체로도 실행 가능한지 선언할 수 있습니다.
  • 모든 모듈이 mid를 생성하지 않고 모듈 자체적으로 동작할 수도 있는데 이럴 경우 mid 없이 사용해도 된다는 것을 알립니다.
  • standalone이 true로 되어 있고 mid를 요청 받지 못한 경우 모듈 실행 시 에러를 출력하게 됩니다.

셋째 줄 standalone이 false로 되어 있어야 mid가 없을 때 에러가 출력되는 게 아닐까요?


이런 기초적인 걸 공부해야 하는 건 저뿐인가; 아무도 댓글을 안다시네..,; 아니면 이것도 혹시 제가 틀린건가요 ㄱ-...


+ 만약 제가 틀린거라 하더라도 그렇다면 저거 바꿔야 하지 않나요.. standalone이 true면 mid에 독립할 수 있는 걸로 보는게 더 시멘틱한데 말입니다,??