템플릿 문법 v2에서는 과거의 이런 filter를 못 사용합니다.

@unload('filters/cancel_charge.xml')
@unload('filters/approve_charge.xml')

unload 해주거나 해당 줄을 삭제하면 됩니다.


오래된 모듈 중에 하나인 pointcharge 모듈을 수정하고 있는데요. 

(남의 코드 분석하는게 시간이 좀 걸리는 일인데

개인적으로는 곧 AI로 이런 일을 손쉽게 할 수 있을거라 생각됩니다.

요즘 이온디에서는 AI를 활용한 코딩을 적극 권장하고 있습니다.

그 전에 분석해서 어떻게 동작되고 있는지까지는 아직 전체 소스 구조를 파악해야하기 때문에

온라인에서 제공되는 ChatGPT나 Claude 등의 채팅 AI에서는 어렵고

커서나 windsurf 는 써본 적이 없어서 잘 모르겠습니다. (돈을 좀 벌면 써보겠습니다.ㅠㅠ)

저는 phpstorm을 사용하는데, AI플러그인으로 copilot이나 AI Assistant가 있습니다.

Copliot은 한달에 약간의 크레딧을 무료로 제공하고 있습니다. 가끔 모를 때 물어보는 용도로 씁니다.)


사설이 길었는데, 이런 이유로 분석부터 해야합니다. 

코드를 역추적하는 시스템입니다. 순서는 1,2,3으로 썼지만, 3,2,1 순으로 추적해서 찾아가는 식입니다.


기존 방식


1. modules/pointcharge/pointcharge.admin.view.php
class pointchargeAdminView extends pointcharge {
Context::addJsFile($this->module_path.'tpl/js/pointcharge_admin.js');
}
pointcharge.admin.view.php에서 충전승인 js 코드 불러옴


2. pointcharge_admin.js
/* 충전승인*/
function doApproveCharge(charge_srl) {
console.log('충전승인');
var fo_obj = xGetElementById('fo_charge');
fo_obj.charge_srl.value = charge_srl;
    procFilter(fo_obj, approve_charge);

}

 /* 충전취소*/
function doCancelCharge(charge_srl) {
var fo_obj = xGetElementById('fo_charge');
fo_obj.charge_srl.value = charge_srl;
    procFilter(fo_obj, cancel_charge);

}
설명 : procFilter()를 사용하고 있음. 이 방식은 구 방식이므로 변경해야함


3. modules/pointcharge/tpl/standby_list.html
<a href="#" onclick="doApproveCharge('{$val->charge_srl}');return false;" title="{$lang->approve_charge}">{$lang->approve_charge}</a>
<a href="#" onclick="doCancelCharge('{$val->charge_srl}');return false;" title="{$lang->charge_cancel}">{$lang->charge_cancel}</a>

관리자 충전승인/승인취소화면에서 doApproveCharge(), doCancelCharge() 함수를 실행하고 있음.



AI를 활용하면 이런 구조를 설명한 뒤에

[프롬프트] .. 를 하면 됩니다만,


그 전에 라이믹스가 어떤 식으로 동작되는지를 알려주어야 할지도 모르겠군요. AI모델에 따라서 학습이 필요할 수도 있습니다.

이 정도는 LLM을 사용하거나 RAG로 알려주는게 아니라도 간단하게 방법을 설명하는게 도움이 됩니다. 


[프롬프트1] 'XML JS 필터 로딩은 지원하지 않습니다. 템플릿 문법 v2를 사용하여 제작하는 신규 자료에서는 룰셋(ruleset)이나 XML JS 필터를 사용하는 것을 권장하지 않습니다.'


[프롬프트2] (코드구조설명) 코드 수정


답변1. Copilot의 답변

`procFilter`를 사용하는 기존 방식을 AJAX 요청으로 변경하여 더 현대적인 방식으로 수정할 수 있습니다. 다음은 그 방법입니다.

1. `modules/pointcharge/pointcharge.admin.view.php` 파일에서 JavaScript 파일을 추가하는 부분은 그대로 유지합니다.

2. `pointcharge_admin.js` 파일에서 `doApproveCharge`와 `doCancelCharge` 함수를 AJAX 요청으로 변경합니다.

3. `modules/pointcharge/tpl/standby_list.html` 파일에서 링크를 클릭할 때 AJAX 요청을 실행하도록 합니다.

### 1. `modules/pointcharge/pointcharge.admin.view.php`
이 부분은 변경할 필요가 없습니다.

### 2. `pointcharge_admin.js`
```javascript
/* 충전승인 */
function doApproveCharge(charge_srl) {
console.log('충전승인');
$.ajax({
url: './',
type: 'POST',
data: {
act: 'procPointchargeAdminApproveCharge',
charge_srl: charge_srl
},
success: function(response) {
alert(response.message);
if (response.error == 0) {
location.reload();
}
},
error: function() {
alert('Error occurred while approving charge.');
}
});
}

/* 충전취소 */
function doCancelCharge(charge_srl) {
$.ajax({
url: './',
type: 'POST',
data: {
act: 'procPointchargeAdminCancelCharge',
charge_srl: charge_srl
},
success: function(response) {
alert(response.message);
if (response.error == 0) {
location.reload();
}
},
error: function() {
alert('Error occurred while canceling charge.');
}
});
}
```

### 3. `modules/pointcharge/tpl/standby_list.html`
```html
<td class="nowr"><a href="#" onclick="doApproveCharge('{$val->charge_srl}');return false;" title="{$lang->approve_charge}">{$lang->approve_charge}</a></td>
<td class="nowr"><a href="#" onclick="doCancelCharge('{$val->charge_srl}');return false;" title="{$lang->charge_cancel}">{$lang->charge_cancel}</a></td>
```

이렇게 하면 `doApproveCharge`와 `doCancelCharge` 함수가 AJAX 요청을 사용하여 충전 승인 및 취소를 처리하게 됩니다.


답변2. ChatGPT의 답변


 

기존 방식 분석

  • pointcharge.admin.view.php에서 pointcharge_admin.js를 불러옴.
  • pointcharge_admin.js에서 procFilter()를 사용하여 충전 승인 및 취소 처리.
  • standby_list.html에서 doApproveCharge()doCancelCharge() 함수가 호출됨.
  • 문제점: procFilter()는 구 방식이므로 Rhymix 템플릿 v2에서는 사용할 수 없음.

변경 방향

  1. XML 필터 제거 및 AJAX 요청 처리
  2. procFilter() 제거 후 jQuery 기반 AJAX로 변경
  3. 기존 standby_list.html의 onclick 이벤트 수정

수정 코드

1. pointcharge_admin.js 수정 (AJAX 기반)

```

jQuery(function($) {

    function sendChargeRequest(action, charge_srl) {

        if (!charge_srl || isNaN(charge_srl)) {

            alert('올바른 충전 번호를 입력하세요.');

            return;

        }


        let confirmMessage = (action === 'approve') ? '정말 승인하시겠습니까?' : '정말 취소하시겠습니까?';

        if (!confirm(confirmMessage)) return;


        $.post(

            "./",  // Rhymix는 기본적으로 현재 모듈 URL을 처리하므로 "./" 사용 가능

            {

                act: (action === 'approve') ? 'procPointchargeAdminApproveCharge' : 'procPointchargeAdminCancelCharge',

                charge_srl: charge_srl

            },

            function(response) {

                if (response.error) {

                    alert(response.message);

                } else {

                    alert((action === 'approve') ? '충전이 승인되었습니다.' : '충전이 취소되었습니다.');

                    location.reload(); // 새로고침하여 변경사항 반영

                }

            },

            'json'

        );

    }


    window.doApproveCharge = function(charge_srl) {

        sendChargeRequest('approve', charge_srl);

    };


    window.doCancelCharge = function(charge_srl) {

        sendChargeRequest('cancel', charge_srl);

    };

});


```

2. standby_list.html 수정 (onclick -> 새로운 함수 연결)

```

<a href="#" onclick="doApproveCharge({$val->charge_srl}); return false;" title="{$lang->approve_charge}">{$lang->approve_charge}</a>

<a href="#" onclick="doCancelCharge({$val->charge_srl}); return false;" title="{$lang->charge_cancel}">{$lang->charge_cancel}</a>


```

변경 사항 없음 → 기존의 doApproveCharge()doCancelCharge() 함수 이름 유지하여, 기존 템플릿을 수정할 필요 없음.


3. pointcharge.admin.view.php에서 JS 파일 불러오는 코드 유지

class pointchargeAdminView extends pointcharge {

    function init() {

        Context::addJsFile($this->module_path . 'tpl/js/pointcharge_admin.js');

    }

}


변경 사항 없음 → 기존 방식 유지.

정리

procFilter()를 제거하고 AJAX 요청 방식으로 변경
standby_list.html의 onclick 이벤트 기존 함수명 유지
pointcharge_admin.js에서 기능을 sendChargeRequest()로 통합
pointcharge.admin.view.php는 기존 방식 유지

이제 템플릿 v2에서도 정상적으로 충전 승인 및 취소 기능을 사용할 수 있습니다. 🚀