filter xml문서를 해석하여 js파일로 만듬 더 자세히 ...


Public 멤버 함수 | |
| XmlJsFilter ($path, $xml_file) | |
| constructor | |
| compile () | |
| 원 xml파일과 compiled된js파일의 시간 비교 및 유무 비교등을 처리 | |
| _compile () | |
| 실제 xml_file을 컴파일하여 js_file을 생성 | |
| _getCompiledFileName ($xml_file) | |
| $xml_file로 compiled_xml_file이름을 return | |
Public 속성 | |
| $compiled_path = './files/cache/js_filter_compiled/' | |
| 컴파일된 캐시 파일이 놓일 위치 | |
| $xml_file = NULL | |
| 대상 xml 파일 | |
| $js_file = NULL | |
| 컴파일된 js 파일 | |
filter xml문서를 해석하여 js파일로 만듬
xml filter 파일은 js script로 컴파일 되어 캐싱됨
<filter name="js function 이름" act="서버에 요청할 action 이름" confirm_msg_code="submit시에 prompt로 물어볼 메세지의 코드"> <form> <-- 폼 항목의 체크 <node target="name" required="true" minlength="1" maxlength="5" filter="email,userid,alpha,number" equalto="target"> </form> <parameter> <-- 폼 항목을 조합하여 key=val 의 js array로 return, act는 필수
| key | </parameter> <response callback_func="callback 받게 될 js function 이름 지정"> <-- 서버에 ajax로 전송하여 받을 결과값 <tag name="error"> <-- error이름의 결과값을 받겠다는 것 </response> </filter> |
XmlJsFilter.class.php 파일의 41 번째 라인에서 정의되었습니다.
| XmlJsFilter::_compile | ( | ) |
실제 xml_file을 컴파일하여 js_file을 생성
XmlJsFilter.class.php 파일의 68 번째 라인에서 정의되었습니다.
다음을 참조함 : XmlParser::$lang, getModel(), XmlParser::parse(), FileHandler::readFile().
다음에 의해서 참조됨 : compile().
00068 { 00069 global $lang; 00070 00071 // xml 파일을 읽음 00072 $buff = FileHandler::readFile($this->xml_file); 00073 00074 // xml parsing 00075 $xml_obj = parent::parse($buff); 00076 00077 // XmlJsFilter는 filter_name, field, parameter 3개의 데이터를 핸들링 00078 $filter_name = $xml_obj->filter->attrs->name; 00079 $confirm_msg_code = $xml_obj->filter->attrs->confirm_msg_code; 00080 $module = $xml_obj->filter->attrs->module; 00081 $act = $xml_obj->filter->attrs->act; 00082 $extend_filter = $xml_obj->filter->attrs->extend_filter; 00083 00084 $field_node = $xml_obj->filter->form->node; 00085 if($field_node && !is_array($field_node)) $field_node = array($field_node); 00086 00087 $parameter_param = $xml_obj->filter->parameter->param; 00088 if($parameter_param && !is_array($parameter_param)) $parameter_param = array($parameter_param); 00089 00090 $response_tag = $xml_obj->filter->response->tag; 00091 if($response_tag && !is_array($response_tag)) $response_tag = array($response_tag); 00092 00093 // extend_filter가 있을 경우 해당 method를 호출하여 결과를 받음 00094 if($extend_filter) { 00095 00096 // extend_filter가 있을 경우 캐시 사용을 못하도록 js 캐시 파일명을 변경 00097 $this->js_file .= '.nocache.js'; 00098 00099 // extend_filter는 module.method 로 지칭되어 이를 분리 00100 list($module_name, $method) = explode('.',$extend_filter); 00101 00102 // 모듈 이름과 method가 있을 경우 진행 00103 if($module_name&&$method) { 00104 // 해당 module의 model 객체를 받음 00105 $oExtendFilter = &getModel($module_name); 00106 00107 // method가 존재하면 실행 00108 if(method_exists($oExtendFilter, $method)) { 00109 // 결과를 받음 00110 //$extend_filter_list = call_user_method($method, $oExtendFilter, true); 00111 //$extend_filter_list = call_user_func(array($oExtendFilter, $method)); 00112 $extend_filter_list = $oExtendFilter->{$method}(true); 00113 $extend_filter_count = count($extend_filter_list); 00114 00115 // 결과에서 lang값을 이용 문서 변수에 적용 00116 for($i=0;$i<$extend_filter_count;$i++) { 00117 $name = $extend_filter_list[$i]->name; 00118 $lang_value = $extend_filter_list[$i]->lang; 00119 if($lang_value) $lang->{$name} = $lang_value; 00120 } 00121 } 00122 00123 } 00124 } 00125 00126 $callback_func = $xml_obj->filter->response->attrs->callback_func; 00127 if(!$callback_func) $callback_func = "filterAlertMessage"; 00128 00129 // 언어 입력을 위한 사용되는 필드 조사 00130 $target_list = array(); 00131 $target_type_list = array(); 00132 00133 // js function 을 만들기 시작 00134 $js_doc = sprintf("function %s(fo_obj) {\n", $filter_name); 00135 $js_doc .= sprintf("\tvar oFilter = new XmlJsFilter(fo_obj, \"%s\", \"%s\", %s);\n", $module, $act, $callback_func); 00136 00137 // field, 즉 체크항목의 script 생성 00138 $node_count = count($field_node); 00139 if($node_count) { 00140 foreach($field_node as $key =>$node) { 00141 $attrs = $node->attrs; 00142 $target = trim($attrs->target); 00143 if(!$target) continue; 00144 $required = $attrs->required=='true'?'true':'false'; 00145 $minlength = $attrs->minlength>0?$attrs->minlength:'0'; 00146 $maxlength = $attrs->maxlength>0?$attrs->maxlength:'0'; 00147 $equalto = trim($attrs->equalto); 00148 $filter = $attrs->filter; 00149 00150 $js_doc .= sprintf( 00151 "\toFilter.addFieldItem(\"%s\",%s,%s,%s,\"%s\",\"%s\");\n", 00152 $target, $required, $minlength, $maxlength, $equalto, $filter 00153 ); 00154 00155 if(!in_array($target, $target_list)) $target_list[] = $target; 00156 if(!$target_type_list[$target]) $target_type_list[$target] = $filter; 00157 } 00158 } 00159 00160 // extend_filter_item 체크 00161 for($i=0;$i<$extend_filter_count;$i++) { 00162 $filter_item = $extend_filter_list[$i]; 00163 $target = trim($filter_item->name); 00164 if(!$target) continue; 00165 $type = $filter_item->type; 00166 $required = $filter_item->required?'true':'false'; 00167 00168 // extend filter item의 type으로 filter를 구함 00169 switch($type) { 00170 case 'homepage' : 00171 $filter = 'homepage'; 00172 break; 00173 case 'email_address' : 00174 $filter = 'email'; 00175 break; 00176 default : 00177 $filter = ''; 00178 break; 00179 } 00180 00181 $js_doc .= sprintf( 00182 "\toFilter.addFieldItem(\"%s\",%s,%s,%s,\"%s\",\"%s\");\n", 00183 $target, $required, 0, 0, '', $filter 00184 ); 00185 00186 if(!in_array($target, $target_list)) $target_list[] = $target; 00187 if(!$target_type_list[$target]) $target_type_list[$target] = $type; 00188 00189 } 00190 00191 // 데이터를 만들기 위한 parameter script 생성 00192 $parameter_count = count($parameter_param); 00193 if($parameter_count) { 00194 // 기본 필터 내용의 parameter로 구성 00195 foreach($parameter_param as $key =>$param) { 00196 $attrs = $param->attrs; 00197 $name = trim($attrs->name); 00198 $target = trim($attrs->target); 00199 if(!$name || !$target) continue; 00200 $target = htmlentities($target,ENT_QUOTES); 00201 00202 $js_doc .= sprintf( 00203 "\toFilter.addParameterItem(\"%s\",\"%s\");\n", 00204 $name, $target 00205 ); 00206 if(!in_array($name, $target_list)) $target_list[] = $name; 00207 } 00208 00209 // extend_filter_item 체크 00210 for($i=0;$i<$extend_filter_count;$i++) { 00211 $filter_item = $extend_filter_list[$i]; 00212 $target = $name = trim($filter_item->name); 00213 if(!$name || !$target) continue; 00214 $target = htmlentities($target,ENT_QUOTES); 00215 00216 $js_doc .= sprintf( 00217 "\toFilter.addParameterItem(\"%s\",\"%s\");\n", 00218 $name, $target 00219 ); 00220 if(!in_array($name, $target_list)) $target_list[] = $name; 00221 } 00222 } 00223 00224 // response script 생성 00225 $response_count = count($response_tag); 00226 for($i=0;$i<$response_count;$i++) { 00227 $attrs = $response_tag[$i]->attrs; 00228 $name = $attrs->name; 00229 $js_doc .= sprintf("\toFilter.addResponseItem(\"%s\");\n", $name); 00230 } 00231 00232 if($confirm_msg_code) $js_doc .= sprintf("\treturn oFilter.proc(\"%s\");\n",str_replace('"','\"',$lang->{$confirm_msg_code})); 00233 else $js_doc .= sprintf("\treturn oFilter.proc();\n"); 00234 $js_doc .= "}\n"; 00235 00236 // form 필드 lang 값을 기록 00237 $target_count = count($target_list); 00238 for($i=0;$i<$target_count;$i++) { 00239 $target = $target_list[$i]; 00240 if(!$lang->{$target}) $lang->{$target} = $target; 00241 $js_doc .= sprintf("alertMsg[\"%s\"] = \"%s\";\n", $target, str_replace("\"","\\\"",$lang->{$target})); 00242 } 00243 00244 // target type을 기록 00245 $target_type_count = count($target_type_list); 00246 if($target_type_count) { 00247 foreach($target_type_list as $target => $type) { 00248 $js_doc .= sprintf("target_type_list[\"%s\"] = \"%s\";\n", $target, $type); 00249 } 00250 } 00251 00252 // 에러 메세지를 기록 00253 foreach($lang->filter as $key => $val) { 00254 if(!$val) $val = $key; 00255 $js_doc .= sprintf("alertMsg[\"%s\"] = \"%s\";\n", $key, str_replace("\"","\\\"",$val)); 00256 } 00257 00258 // js파일 생성 00259 FileHandler::writeFile($this->js_file, $js_doc); 00260 }

| XmlJsFilter::_getCompiledFileName | ( | $ | xml_file | ) |
$xml_file로 compiled_xml_file이름을 return
XmlJsFilter.class.php 파일의 265 번째 라인에서 정의되었습니다.
다음을 참조함 : Context::getLangType().
다음에 의해서 참조됨 : XmlJsFilter().
00265 { 00266 return sprintf('%s%s.%s.compiled.js',$this->compiled_path, md5($xml_file),Context::getLangType()); 00267 }

| XmlJsFilter::compile | ( | ) |
원 xml파일과 compiled된js파일의 시간 비교 및 유무 비교등을 처리
XmlJsFilter.class.php 파일의 58 번째 라인에서 정의되었습니다.
다음을 참조함 : _compile(), Context::addJsFile().
00058 { 00059 if(!file_exists($this->xml_file)) return; 00060 if(!file_exists($this->js_file)) $this->_compile(); 00061 else if(filemtime($this->xml_file)>filemtime($this->js_file)) $this->_compile(); 00062 Context::addJsFile($this->js_file); 00063 }

| XmlJsFilter::XmlJsFilter | ( | $ | path, | |
| $ | xml_file | |||
| ) |
constructor
XmlJsFilter.class.php 파일의 49 번째 라인에서 정의되었습니다.
다음을 참조함 : $xml_file, _getCompiledFileName().
00049 { 00050 if(substr($path,-1)!=='/') $path .= '/'; 00051 $this->xml_file = sprintf("%s%s",$path, $xml_file); 00052 $this->js_file = $this->_getCompiledFileName($this->xml_file); 00053 }

| XmlJsFilter::$compiled_path = './files/cache/js_filter_compiled/' |
컴파일된 캐시 파일이 놓일 위치
XmlJsFilter.class.php 파일의 42 번째 라인에서 정의되었습니다.
| XmlJsFilter::$js_file = NULL |
컴파일된 js 파일
XmlJsFilter.class.php 파일의 44 번째 라인에서 정의되었습니다.
| XmlJsFilter::$xml_file = NULL |
1.6.1