제(sejin7940) 나름 수정한 menu 모듈 올려드립니다.
현재 XE 1.7.3 의 메뉴체계 에 불만이 있으신 분들만 써보세요
어떤 문제가 생길지 모르니 (저만 테스트한거기에.. ^^;)
실제 사이트에는 아직 적용하지 마시고, 테스트 사이트 등을 운영하시는 분들만 한번 깔아서 사용해보세요
(실제 사이트는, 추후 이걸 적용해보신 분들이 버그 없다고 할때... 반응 보고 하시길.. 책임 안 집니다 ^^;)
XE 1.7.3 기반의 메뉴 기능을 개선해보았습니다.
1) 메뉴 삭제와 모듈 삭제를 분리
-> 메뉴가 삭제될때 원본 모듈(게시판/위젯/페이지 등) 이 삭제 안 되도록 해두었습니다.
그러면, 메뉴 삭제 후 다른 메뉴에서 이 생성되어있는 모듈을 연결할 수 있어야겠죠?
또한 게시판에서 모듈을 복사해서 생성한 뒤에, 메뉴에서 연결할 방법이 있어야겠죠?
2) 바로가기를 통해 미리 생성된 게시판/모듈등을 메뉴에 바로 연결 가능 (두가지형태로)
-> 메뉴추가 / 바로가기 한 다음에
utl 링크탭의 주소란의 http:// 를 지우고, 그냥 mid 값을 기재하시면 되는데..
이 때, '모듈 설정과 직접 연결 ' 에 체크를 해두면, 마치 메뉴추가에서 직접 게시판 생성한 것처럼 게시판과 연결이 되고
(바로가기가 아니라 생성과 같은 형태가 되기에 아이콘도 바로가기 아이콘이 안 나올겁니다.
모듈 설정과 연결되기에 메뉴수정에서 메뉴ID 를 바꾸면 모듈의 id 도 같이 바뀌게 되겠죠. )
'모듈 설정과 직접 연결' 를 체크 안 하고 mid 를 기재하면, 바로가기 로 연결이 걸립니다.
(바로가기가 아닌 경우.. 수정시 모듈자체에 영향은 안 줍니다)
추후 관리 원하는 방식에 맞춰서 '모듈 설정과 직접 연결 ' 를 체크하시면 됩니다.
(물론 어느 경우든 메뉴 삭제시 모듈이 같이 삭제되진 않습니다. 관리의 편이를 생각해서 결정하시면 됩니다.
3) 홈페이지 첫페이지 설정 메뉴 도 삭제 가능
-> 홈 아이콘이 있는 메뉴도 삭제 가능합니다.
물론 재연결도 가능합니다.
설치 방법 :
moduls/menu 를 지우지 마시고.. (제가 올리는 수정모듈에 흠이 있을수도 있으니 ^^;;)
기존 걸 menu_bk 로 폴더명을 변경하신 후에
첨부파일 중에, menu.zip 을 압축풀고, modules/ 폴더 안에, 첨부한 menu 폴더를 올려보세요
참고로 수정내용은 txt 파일로 같이 첨부해드립니다.
다운로드:menu.zip
혹시나 이거 적용후, 사이트가 박살나면...
새로 올린 menu 폴더 지우고, menu_bk 를 menu 로 변경해서 복원하시면 될겁니다 ^^;;
(혹시나의 상황에 대해 절대 책임지지 않습니다 ^^;)
테스트해보시고,
잘 되면 잘된다... 고 의견 남겨주시고 (다른 분들도 도전해보시도록.. 피해자를 늘려야죠 ^^;; )
문제가 있거나 어떤 문제가 있는지 댓글 달아주세요 ^^; ( 보완하고, 정 못 쓸정도가 되면 이 글 지워버리게요 ^^;;;)
참고로, 게시판 1.7 에 게시판 신규생성 버튼 넣는 방법은
modules/board/tpl/index.html 에서..
<a class="x_btn modalAnchor x_pull-right _manage_selected" href="#manageSelectedModule">{$lang->cmd_manage_selected_board}</a>
로 된 코드 밑에 아래의 1번 코드를 추가해주시면 됩니다.
<a class="x_btn x_pull-right" style="margin-right:10px" href="{getUrl('act','dispBoardAdminInsertBoard','module_srl','')}">{$lang->cmd_create_board}</a>
또는 다른방법으론
<span class="x_btn-gruop x_pull-right"><a class="btn" href="{getUrl('act','dispBoardAdminInsertBoard', 'selected_var_idx', '', 'type', '')}">{$lang->cmd_create_board}</a> <a class="x_btn modalAnchor x_pull-right _manage_selected" href="#manageSelectedModule">{$lang->cmd_manage_selected_board}</a></span>
와 같이 해도 됩니다.
그러면 아래 그림처럼 게시판등록 버튼이 생깁니다.
참고2. XE 1.7 의 페이지 모듈에서 페이지 생성하는 방법 은
http://joinjobs.net/xe/jj_xetip/3717 에 적어두었습니다 ^^
ps. 현재 XE 1.7.3 자체의 몇가지 하자는 이 개선에서는 그냥 무시합니다. ^^;;
예를들어, 모듈 연결된 설정의 메뉴ID 를 변경하면, 바로가기 링크걸린 다른 메뉴의 ID 값은 같이 변경 안 된다든지 등..
=======================================
1. 1차수정 (130316 20:35)
1) 기존에는 바로가기로 생성된 mid 만 연결가능하게 했었는데 (없으면 에러뜨게)
사이트맵을 먼저 생성 후 게시판을 복사할 수도 있으니 생성되지 않은 게시판들에 대해서도
사이트맵에서 먼저 메뉴 생성하고 지정가능하게 변경
2) 메뉴 수정시 이상한 alert 창 하나 뜨던거 삭제
2.수정방법
function deleteMenu 안에서
// Delete modules
$output = executeQueryArray('menu.getMenuItems', $args);
if(!$output->toBool())
{
return $output;
}
$oModuleController = getController('module');
$oModuleModel = &getModel('module');
foreach($output->data as $itemInfo)
{
if($itemInfo->is_shortcut != 'Y' && !preg_match('/^http/i',$itemInfo->url))
{
$moduleInfo = $oModuleModel->getModuleInfoByMid($itemInfo->url, $menuInfo->site_srl);
if($moduleInfo->module_srl)
{
$output = $oModuleController->onlyDeleteModule($moduleInfo->module_srl);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
}
}
}
전체를 주석처리
private function _deleteMenuItem 에서
$moduleInfo = $oModuleModel->getModuleInfoByMid($node['url'], $menuInfo->site_srl);
if($moduleInfo->module_srl)
{
$output = $oModuleController->onlyDeleteModule($moduleInfo->module_srl);
if(!$output->toBool())
{
$oDB->rollback();
return $output;
}
}
부분 삭제 또는 주석처리
2. 시작메뉴 삭제방법
1)
modules/menu/menu.admin.controller.php 에서
function procMenuAdminDelete() 함수에서
if($isStartmenuInclude)
{
return new Object(-1, 'msg_cannot_delete_homemenu');
}
를 삭제하거나 주석처리
2)
modules/menu/menu.admin.controller.php 에서
public function deleteItem 함수에서
if($isStartmenuInclude)
{
return new Object(-1, 'msg_cannot_delete_homemenu');
}
를 삭제하거나 주석처리
3)
3. 메뉴 바로가기에서 바로가기 를 mid 로 연결하는 방법
modules/menu/menu.admin.model.php 에서
1) private function _insertShortcut 함수에서
// empty target shortcut
else
위에다가 아래 항목 추가
// 게시판 모듈 mid 지정시 (sejin7940)
elseif($request->shortcut_target) {
$args = new stdClass();
$args->menu_srl = $request->menu_srl;
$args->name = $request->menu_name;
$args->parent_srl = $request->parent_srl;
if($request->shortcut_link_module) {
$args->is_shortcut = 'N';
}
else {
$args->is_shortcut = 'Y';
}
/*
// check already created module instance
$oModuleModel = &getModel('module');
// if not exist module, return error
$moduleInfo = $oModuleModel->getModuleInfoByMid($request->shortcut_target);
if(!$moduleInfo)
{
// return new Object(-1, 'msg_module_is_not_exists');
// $args->is_shortcut = 'Y';
}
*/
$args->url = $request->shortcut_target;
}
2) public function procMenuAdminUpdateItem() 함수에서
// type is module short cut
else if(is_numeric($request->shortcut_target))
{
// Get new original information
$newItemInfo = $oMenuAdminModel->getMenuItemInfo($request->shortcut_target);
if(!$newItemInfo->menu_item_srl)
{
return new Object(-1, 'msg_invalid_request');
}
$args->url = $newItemInfo->url;
$args->is_shortcut = 'Y';
}
아래쪽에다가 아래 문구 통째로 추가
// 게시판 모듈 mid 지정시 (sejin7940)
elseif($request->shortcut_target) {
// check already created module instance
$oModuleModel = &getModel('module');
if($request->shortcut_link_module) {
$args->is_shortcut = 'N';
}
else {
$args->is_shortcut = 'Y';
}
/*
// if not exist module, return error
$moduleInfo = $oModuleModel->getModuleInfoByMid($request->shortcut_target);
if(!$moduleInfo)
{
// return new Object(-1, 'msg_module_is_not_exists');
// $args->is_shortcut = 'Y';
}
*/
$args->url = $request->shortcut_target;
}
3. modules/menu/tpl/sitemap.html 에서
1)
sMID = $('#default ._url_link').val();
아래에다가 추가
params['shortcut_link_module'] = $('#default ._url_link_module').attr("checked"); // sejin7940 (모듈과 직접 설정 링크 값 전달)
2)
1834번째줄 즈음의
params[sTargetKey] = sUrl; 아래에다가 추가
if(isShortCut=='Y') params['shortcut_link_module'] = $('#add_menu .x_active ._url_link_module').attr("checked"); // sejin7940 (모듈과 직접 설정 링크 값 전달)
3)
<input type="url" class="_linkUrl" required title="{$lang->url_link}" />
아래에다가 추가
<br><input type="checkbox" class="_url_link_module">모듈 설정과 직접 연결 <!-- sejin7940 -->
4)
<input type="text" class="_url_link" title="{$lang->url_link}" />
아래에다가 추가
<br><input type="checkbox" class="_url_link_module">모듈 설정과 직접 연결 <!-- sejin7940 -->
4) 대략 1884번째줄 즈음의
if(htInfo.href !== htInfo.url){
// Menu shortcut
$(this).find('a[href="#fix_linkMenu"]').click();
//$(this).find('._menu_link').val();
showMenuSelector($(this).find('._menuSelector_menuTreeContainer'), htInfo.url);
}else{
// URL shortcut
$(this).find('a[href="#fix_linkUrl"]').click();
$(this).find('._url_link').val(htInfo.url);
showMenuSelector($(this).find('._menuSelector_menuTreeContainer'));
}*/
주석처리하고 그 아래에다가 기재
// sejin7940 - 메뉴링크 대신 무조건 URL 링크가 기본이 되도록 ( 메뉴링크에 해당되어도 현재 어떤 메뉴인지 표시도 안 되어서 의미가 적은듯)
// URL shortcut
$(this).find('a[href="#fix_linkUrl"]').click();
$(this).find('._url_link').val(htInfo.url);
showMenuSelector($(this).find('._menuSelector_menuTreeContainer'));