효율적인 코드 조언 좀 부탁드립니다
CMS/프레임워크 | Rhymix 1.9 |
---|---|
개발 언어 | PHP 7.0 |
막상 올려놓고보니 별로 인기는 없는데요ㅋ
https://xetown.com/point_contents/1370824
회원가입시 확장변수 지정값에 따라 초기 회원그룹이 자동 지정되는 애드온을 만들었었습니다.
사실 addTriggerFunction 이라는 함수도 좀 사용해보고 싶었구요.
근데 회원정보 변경시에 해당 확장변수값 수정에 따라 회원그룹이 변경되는 것도 기능에 포함되면 좋겠더라구요.
그래서 아래처럼 코드를 짰고 일단 동작은 잘 됩니다.
다만 코드가 뭔가 아름답지가 않잖아요ㅜㅜ
그렇다고 따로 함수만 담은 php 만들어서 require_once로 불러오는 건 뭔가 일이 커지는 것 같구요.
암튼 현재 코드는 이런데요. 어떻게 다듬으면 좋을지 조언 좀 부탁드립니다;;;
<?php
if ( !defined('RX_BASEDIR') ) return;
if ( $called_position !== 'before_module_proc' ) return;
if ( !$addon_info->extra_key ) return;
$run = array(0 => 'insertMember', 1 => 'updateMember');
foreach ( $run as $trigger )
{
$oModuleController = getController('module');
$oModuleController->addTriggerFunction('member.' . $trigger, 'before', function($args)
{
$oAddonModel = getAdminModel('addon');
$addon_info = $oAddonModel->getAddonInfoXml('ap_group_select');
$gid = $addon_info->extra_vars[0]->value;
$obj = Context::getRequestVars();
$oMemberModel = getModel('member');
$groups = $oMemberModel->getGroups();
$selected_group_list = array();
if ( !is_array($obj->$gid) )
{
$selected_group_list[0] = $obj->$gid;
}
else
{
$selected_group_list = $obj->$gid;
}
$group_srl_list = array();
foreach ( $groups as $group )
{
if ( $group->is_admin !== 'Y' && in_array($group->title, $selected_group_list) )
{
$group_srl_list[] = $group->group_srl;
}
}
if ( empty($group_srl_list) ) return;
$args->group_srl_list = $group_srl_list;
return $args;
});
}
?>
if ( !defined('RX_BASEDIR') ) return;
if ( $called_position !== 'before_module_proc' ) return;
if ( !$addon_info->extra_key ) return;
$run = array(0 => 'insertMember', 1 => 'updateMember');
foreach ( $run as $trigger )
{
$oModuleController = getController('module');
$oModuleController->addTriggerFunction('member.' . $trigger, 'before', function($args)
{
$oAddonModel = getAdminModel('addon');
$addon_info = $oAddonModel->getAddonInfoXml('ap_group_select');
$gid = $addon_info->extra_vars[0]->value;
$obj = Context::getRequestVars();
$oMemberModel = getModel('member');
$groups = $oMemberModel->getGroups();
$selected_group_list = array();
if ( !is_array($obj->$gid) )
{
$selected_group_list[0] = $obj->$gid;
}
else
{
$selected_group_list = $obj->$gid;
}
$group_srl_list = array();
foreach ( $groups as $group )
{
if ( $group->is_admin !== 'Y' && in_array($group->title, $selected_group_list) )
{
$group_srl_list[] = $group->group_srl;
}
}
if ( empty($group_srl_list) ) return;
$args->group_srl_list = $group_srl_list;
return $args;
});
}
?>

윤삼
Lv. 19
아무래도 중급 초반 수준의 코딩 오타쿠인 것 같습니다.
댓글 15
{
function wstAddonNameTrigger($args)
{
// Code
}
}
$oModuleController = getController('module');
$oModuleController->addTriggerFunction('member.insertMember', 'before', 'wstAddonNameTrigger);
$oModuleController->addTriggerFunction('member.updateMember', 'before', 'wstAddonNameTrigger);
함수 존재여부를 체크하는 함수를 활용하면 될 것 같네요.
function_exists / 자매품 class_exists 도 있어요.
(알림이 뜨지 않는 것 같은 건 기분 탓인가...)
덕분에 코드가 한결 전문가스러워졌어요ㅋㅋㅋ
그런데 함수 앞에 꼭 function_exists를 두거나, class 선언하기 전에 자매품ㅋ class_exists로 확인해야 하는 건가요?
아까 이것저것 해보다가 안 됐던 게 addTriggerFunction 안에 콜백함수 적을 때 따옴표를 안쳐서인지, 아니면 함수를 트리거 실행보다 아래쪽에 놔서인지, 아니면 function_exists로 함수 확인을 안해서인지 잘 이해가 되지 않아요;;;
$called_position 마다 한번씩 호출되지요.
PHP에서는 함수 오버라이딩이 안됩니다.
기존 함수에 다른 로직을 덮어씌우는 행위가 안되는거죠.
function_exists 를 통한 함수 존재여부 확인을 하지 않을 경우, 총 4번의 함수 선언이 될거고...
1번 재선언도 안되는데 3번이나 재선언해서 마포대교가 무너지고, 한강이 황폐화되고... 읍..
물론 지금 코드에서는 호출 사이클을 모듈 실행 전으로 고정해 두었으니, 결과적으로 코드 실행은 1회 뿐이겠지만요.
아마 기존에 안되었던 이유는 따옴표를 안 넣으셔서 그럴겁니다.
$funcName = 'var_dump';
$funcName($parameter);
addTriggerFunction 함수가 위 방식(문자열을 통한 호출)을 통한 동적 함수호출을 사용하는 방식일텐데,
따옴표가 없으면 문자열로 인식을 못하고 실제 함수로 인식할테니, '야! 괄호 어디갓숴!' 하고 오류를 뿜는거겠지요.
애드온 특성상 주의해야 할 부분이군요.
아까는 정말 괄호 안 친 것만으로 사이트 전체가 백지였었어요ㅋㅋ
감사합니다~!
회원 가입 -> 분류 -> 정보입력창
식으로 미리 분류해서 가입받게하는거까지 포함시키시는건 어떠신가요?!
흔히 깡페24 쇼핑몰에 많이사용되는 회원가입방식요
실수요가 좀 있을 수 있겠네요!
윤삼님 화이팅임다
js 작업도 해야 하고,
왠지 확장변수 세트별로 변수들의 필수/선택 옵션도 조작해야 할 것 같고...
너무 큰 일이에요ㅜㅜㅜ
음.. 곧 사용해야만 할 일이 있을거 같습니다. ㅎㅎ