* 자료공유가 아니라 작업기입니다ㅋ
드디어 (쓸데없이 만들어보는 습작) 회원탐색기 모듈을 (얼추) 완성했습니다. (얼쑤)
작업의 애초 목적은 닉네임 등을 한글 자소 분리한 뒤 DB에 담아둬서 좀 더 빠른 닉네임 자동완성을 해보려던 것이었습니다 :)
기진곰님의 모듈생성기로부터 시작해서,
기존에 제가 만들었던 회원소개 위젯과 회원검색 위젯을 기반으로,
개발해보쟈님의 사용자검색 모듈, 그리고 구름이님과 람보님의 썸씽 모듈을 살짝 참조했습니다.
엿보기 : https://bit.ly/2nMCn09 (엇? 근데 비회원도 볼 수 있게 돼 있는 거 맞죠?)
검색창에서 검색어를 입력하면 회원 프로필 이미지와 함께 닉네임이 자동완성 됩니다.
최대 5개의 회원정보를 불러오는데 exec_json 처리 속도가 0.08초가 조금 넘네요.
전체 회원수가 많은 사이트에서는 어떻게 될지... 는 아직 잘 모르겠습니다만, 기존의 사용자검색 모듈에 비해서는 속도가 빨라진 느낌이에요.
검색어를 입력하면 아래와 같은 액션?을 호출해서 자동완성으로 뿌려주게 됩니다.
function getUsers() { $vars = Context::getRequestVars(); $search_target = $vars->search_target; $search_keyword = $vars->search_keyword; $db_info = Context::getDBInfo(); $prefix = $db_info->master_db['db_table_prefix']; $DB = DB::getInstance(); $query = $DB->_query("SELECT *, (LENGTH(". $search_target .") - LENGTH((REPLACE(". $search_target .", '". $search_keyword ."', '')))) / LENGTH('". $search_keyword ."') AS score, INSTR(". $search_target .",'". $search_keyword ."') AS strpos FROM ". $prefix ."user WHERE ". $search_target ." LIKE '%". $search_keyword ."%' ORDER BY score DESC, strpos ASC, ". $search_target ." ASC LIMIT 0, 5"); $result = $DB->_fetch($query); if ( !is_array($result) ) { $result = array($result); } $user_list = array(); if ( count($result) ) { foreach ( $result as $key => $val ) { $val->image = getModel('member')->getProfileImage($val->member_srl)->src; $user_list[$key] = $val; } } $this->add('user_list', $user_list); }
검색어와의 유사도순으로 목록을 가져오려다보니 DB 쿼리가 조금 복잡하긴 합니다ㅎ
아직 완전히 구현하진 않았지만, 사용자정의 회원정보로도 자동완성을 구현하는 것도 무리가 없을 것 같습니다.
(현재 그냥 일반 검색 정도는 가능하게 해놨어요)
기진곰님 말씀으로는 글자 입력 때마다 작동을 하다보니 오버헤드가 발생할 수 있다고 하는데, 그건 좀 더 지켜봐야 할 것 같습니다.
jQuery UI의 자동완성 플러그인 자체적으로 시간 지연이 있어서인지 아직은 문제가 있는지 잘 모르겠더라구요.
... 모듈이 자리를 잡았으니, 여기서 생성한 DB 자료를 활용할 위젯을 만들어야겠네요.
이건 뭐, 기존에 만들었던 위젯이 있으니 금방 되겠죠?ㅎ
이제 자야겠습니다. 내일 일찍 일어나야 하는데ㅜㅜ