<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4107692362051888978</id><updated>2012-02-17T13:44:34.930+09:00</updated><category term='Javascript Library'/><category term='cakephp'/><category term='app_model.php'/><category term='jQuery'/><category term='css'/><category term='Tip'/><category term='blueprint'/><category term='generateList'/><title type='text'>var $cookie</title><subtitle type='html'>절대 포기하지 말자.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4107692362051888978.post-7448149183847720634</id><published>2009-02-03T02:41:00.000+09:00</published><updated>2011-01-30T13:05:21.019+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript Library'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>jQuery를 이용해서 멋지고 부드러운 팝업창 만들기</title><content type='html'>&lt;p&gt;원문 :&lt;a href="http://yensdesign.com/2008/09/how-to-create-a-stunning-and-smooth-popup-using-jquery/"&gt;http://yensdesign.com/2008/09/how-to-create-a-stunning-and-smooth-popup-using-jquery/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;개인적인 용도로 번역을 했기때문에 오역과 의역이 많을 수 있습니다.&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;오늘날 웹사이트들은 점점 더 풍부하고 사용자들과 상호작용을 하는 것이 점점 더 모든 웹사이트에서 꼭 필요한 것이 되어가고 있다. 보통 중요한 정보를 보여주기 위해 윈도우 팝업창을 사용하는데 jQuery를 이용해서 멋지고 훌륭한 윈도우 팝업창을 만드는 방법에 대해서 배워보도록 하자. 읽어보고 이해가 되지 않는 부분이 있으면 알려주기 바란다. 영어가 별로 신통치 못해서 그럴수도 있을것이다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://yensdesign.com/tutorials/popupjquery/" title="http://yensdesign.com/tutorials/popupjquery/" class="external"&gt;여기서&lt;/a&gt; 튜토리얼이 잘 작동하는지 테스트해 볼 수 있다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;테스트 된 브라우저들:&lt;/strong&gt; Firefox, Internet Explorer 6 &amp;amp; 7, Opera (old and 9.52) , Safari &amp;amp; Chrome.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;어떤것들이 필요한가?_What will We need?&lt;/h3&gt;&lt;p&gt;멋진 팝업을 만들기 위해서 아래와 같은 것들이 필요하다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;HTML&lt;/li&gt;&lt;li&gt;CSS&lt;/li&gt;&lt;li&gt;jQuery 라이브러리&lt;/li&gt;&lt;li&gt;배우고자 하는 열정 &lt;img class="wp-smiley" src="http://yensdesign.com/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.jquery.com/" title="jQuery official website"&gt;jQuery&lt;/a&gt;는 빠르고 안정적인 개발에 촛점을 맞춘 새로운 자바스크립트 라이브러리이다. 지난달에 "add magic"에 사용되기도 했다. 또한 http://www.plusdeporte.com 과 &lt;a href="http://www.plusmusica.com"&gt;http://www.plusmusica.com&lt;/a&gt; 등 몇몇 사이트에서 AJAX 를 구현하기 위해 사용되었다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;&lt;p class="section"&gt;&lt;a href="http://www.jquery.com/" title="jQuery official website"&gt;jQuery&lt;/a&gt; 는 빠르고 간결한 자바스크립트 라이브러리이다. jQuery는 빠른 웹 개발을 위한 HTML 문서 추적, 이벤트 핸들링, 애니메이션과 AJAX 통신등을 쉽게 구현할 수 있도록 해준다.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;1단계:무엇을 만들것인가?_Step 1: What We will do?&lt;/h3&gt;&lt;p&gt;사진 한장이 백마디 말보다 가치가 있다... 암튼 아래와 같은 결과가 나오도록 하는 방법을 배우게 될것이다.&lt;/p&gt;&lt;p&gt;&lt;img title="" class="attachment" src="http://yensdesign.com/tutorials/popupjquery/img1.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;보는것처럼 간단한 웹 사이트를 하나 만들것이다. 버튼을 누르면 멋지고 부드러운 팝업창이 뜨게 될것이다. 자 시작해 보자!&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;2단계:간단한 웹 페이지 만들기_Step 2: Setting up our simple webpage&lt;/h3&gt;&lt;p&gt;먼저 2개의 영역을 가지는 간단한 HTML 웹페이지가 필요하다. popup을 위한 &lt;strong&gt;popupContact&lt;/strong&gt; 과 helps our popup 을 위한 &lt;strong&gt;backgroundPopup&lt;/strong&gt; 이다.&lt;img class="wp-smiley" src="http://yensdesign.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" /&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" dir="ltr"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;yensdesign.com - How to create a stuning and smooth popup in jQuery&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="stylesheet" href="general.css" type="text/css" media="screen" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="popup.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;center&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="http://www.yensdesign.com"&amp;gt;&amp;lt;img src="logo.jpg" alt="Go to yensdesign.com"/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="button"&amp;gt;&amp;lt;input type="submit" value="Press me please!" /&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/center&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="popupContact"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a id="popupContactClose"&amp;gt;x&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;Title of our cool popup, yay!&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p id="contactArea"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Here we have a simple but interesting sample of our new stuning and smooth popup. As you can see jQuery and CSS does it easy...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; We can use it for popup-forms and more... just experiment!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Press ESCAPE, Click on X (right-top) or Click Out from the popup to close the popup!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="http://www.yensdesign.com"&amp;gt;&amp;lt;img src="logo.jpg" alt="Go to yensdesign.com"/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="backgroundPopup"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;&lt;strong&gt;주의:&lt;/strong&gt; &amp;lt;head&amp;gt; 섹션에 구글 사이트로부터 호스팅되는 jQuery를 인클루딩한 부분이 보인다. 몇몇 사람들은 jQuery 라이브러리를 캐시에 저장하기 위해서 이렇게 한다. 많은 웹 페이지가 같은 리소스를 가지게 됨으로 인해 불러오는 시간을 줄일 수 도 있다.&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;다음으로 CSS를 보도록 하자. HTML 에 스타일을 추가하고 무엇보다도 HTML&amp;nbsp; 메인 영역을 숨기기 위한 스타일을 CSS에 추가해 줘야 한다. "popup core"와 일치하는 &lt;strong&gt;popupContact&lt;/strong&gt; 와 &lt;strong&gt;backgroundPopup&lt;/strong&gt; 그리고 팝업이 시작될때 보이지 않았으면 하는 부분들오 있다.&amp;nbsp; &lt;img class="wp-smiley" src="http://yensdesign.com/wp-includes/images/smilies/icon_wink.gif" alt=";)" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em,&lt;br /&gt;font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody,&lt;br /&gt;tfoot, thead, tr, th, td {&lt;br /&gt;border:0pt none;&lt;br /&gt;font-family:inherit;&lt;br /&gt;font-size:100%;&lt;br /&gt;font-style:inherit;&lt;br /&gt;font-weight:inherit;&lt;br /&gt;margin:0pt;&lt;br /&gt;padding:0pt;&lt;br /&gt;vertical-align:baseline;&lt;br /&gt;}&lt;br /&gt;body{&lt;br /&gt;background:#fff none repeat scroll 0%;&lt;br /&gt;line-height:1;&lt;br /&gt;font-size: 12px;&lt;br /&gt;font-family:arial,sans-serif;&lt;br /&gt;margin:0pt;&lt;br /&gt;height:100%;&lt;br /&gt;}&lt;br /&gt;table {&lt;br /&gt;border-collapse:separate;&lt;br /&gt;border-spacing:0pt;&lt;br /&gt;}&lt;br /&gt;caption, th, td {&lt;br /&gt;font-weight:normal;&lt;br /&gt;text-align:left;&lt;br /&gt;}&lt;br /&gt;blockquote:before, blockquote:after, q:before, q:after {&lt;br /&gt;content:"";&lt;br /&gt;}&lt;br /&gt;blockquote, q {&lt;br /&gt;quotes:"" "";&lt;br /&gt;}&lt;br /&gt;a{&lt;br /&gt;cursor: pointer;&lt;br /&gt;text-decoration:none;&lt;br /&gt;}&lt;br /&gt;br.both{&lt;br /&gt;clear:both;&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;#backgroundPopup&lt;/strong&gt;{&lt;br /&gt;display:none;&lt;br /&gt;position:fixed;&lt;br /&gt;_position:absolute; /* hack for internet explorer 6*/&lt;br /&gt;height:100%;&lt;br /&gt;width:100%;&lt;br /&gt;top:0;&lt;br /&gt;left:0;&lt;br /&gt;background:#000000;&lt;br /&gt;border:1px solid #cecece;&lt;br /&gt;z-index:1;&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;#popupContact&lt;/strong&gt;{&lt;br /&gt;display:none;&lt;br /&gt;position:fixed;&lt;br /&gt;_position:absolute; /* hack for internet explorer 6*/&lt;br /&gt;height:384px;&lt;br /&gt;width:408px;&lt;br /&gt;background:#FFFFFF;&lt;br /&gt;border:2px solid #cecece;&lt;br /&gt;z-index:2;&lt;br /&gt;padding:12px;&lt;br /&gt;font-size:13px;&lt;br /&gt;}&lt;br /&gt;#popupContact h1{&lt;br /&gt;text-align:left;&lt;br /&gt;color:#6FA5FD;&lt;br /&gt;font-size:22px;&lt;br /&gt;font-weight:700;&lt;br /&gt;border-bottom:1px dotted #D3D3D3;&lt;br /&gt;padding-bottom:2px;&lt;br /&gt;margin-bottom:20px;&lt;br /&gt;}&lt;br /&gt;#popupContactClose{&lt;br /&gt;font-size:14px;&lt;br /&gt;line-height:14px;&lt;br /&gt;right:6px;&lt;br /&gt;top:4px;&lt;br /&gt;position:absolute;&lt;br /&gt;color:#6fa5fd;&lt;br /&gt;font-weight:700;&lt;br /&gt;display:block;&lt;br /&gt;}&lt;br /&gt;#button{&lt;br /&gt;text-align:center;&lt;br /&gt;margin:100px;&lt;br /&gt;}&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;CSS 코드는 &lt;strong&gt;CSS를 리셋&lt;/strong&gt;해주는 &lt;strong&gt;작은 CSS 조각&lt;/strong&gt;을 추가하기 위해 매번 사용해 왔던 것이다. 이 코드는 모든 웹 사이트에서 &lt;strong&gt;레이아웃을 잡을때&lt;/strong&gt; 많은 도움이 되었다. 암튼 모든 단계를 잘 따랐다면 아래와 같은 화면을 만나볼 수 있다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img title="" class="attachment" src="http://yensdesign.com/tutorials/popupjquery/img2.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;3단계: jQuery를 이용해서 팝업에 마술 걸기_Step 3: Adding magic to our popup with jQuery&lt;/h3&gt;&lt;p&gt;튜토리얼의 핵심 파일인 popup.js 파일에 팝업창을 멋지고 부드럽게 해주는 몇개의 함수를 추가해 주게 될 것이다. 하지만 먼저 팝업창의 &lt;strong&gt;상태&lt;/strong&gt;를 &lt;strong&gt;제어&lt;/strong&gt;하기 위해 &lt;strong&gt;popupStatus&lt;/strong&gt; &lt;strong&gt;변수를&lt;/strong&gt; 설정해줘야 한다.&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;//SETTING UP OUR POPUP&lt;br /&gt;//0은 비활성화된 상태; 1은 활성화된 상태를 의미한다. / 0 means disabled; 1 means enabled;&lt;br /&gt;var popupStatus = 0;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이제 팝업을 불러오기 위한 합수를 만들어보자.&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;//loading popup with jQuery magic!&lt;br /&gt;function loadPopup(){&lt;br /&gt;&amp;nbsp; //팝업은 popupStatus 가 비활성화되어 있을때만 불러진다. / loads popup only if it is disabled&lt;br /&gt;&amp;nbsp; if(popupStatus==0){&lt;br /&gt;&amp;nbsp; $("#backgroundPopup").css({&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;"opacity": "0.7"&lt;br /&gt;&amp;nbsp; &amp;nbsp;});&lt;br /&gt;&amp;nbsp; &amp;nbsp;$("#backgroundPopup").fadeIn("slow");&lt;br /&gt;&amp;nbsp; &amp;nbsp;$("#popupContact").fadeIn("slow");&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; popupStatus = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;팝업을 닫거나 비활성화시키기 위한 함수&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;//disabling popup with jQuery magic!&lt;br /&gt;function disablePopup(){&lt;br /&gt;//popupStatus 가 활성화 되어 있다면 비활성화 시키기 / disables popup only if it is enabled&lt;br /&gt;if(popupStatus==1){&lt;br /&gt;$("#backgroundPopup").fadeOut("slow");&lt;br /&gt;$("#popupContact").fadeOut("slow");&lt;br /&gt;popupStatus = 0;&lt;br /&gt;}&lt;br /&gt;}&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;팝업창이 화면 중앙에 나타나게 하는 부분 추가&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;//centering popup&lt;br /&gt;function centerPopup(){&lt;br /&gt;&amp;nbsp; //화면 중앙에 자리잡게 하기 위한 요청 / request data for centering&lt;br /&gt;&amp;nbsp; var windowWidth = document.documentElement.clientWidth;&lt;br /&gt;&amp;nbsp; var windowHeight = document.documentElement.clientHeight;&lt;br /&gt;&amp;nbsp; var popupHeight = $("#popupContact").height();&lt;br /&gt;&amp;nbsp; var popupWidth = $("#popupContact").width();&lt;br /&gt;&amp;nbsp; //중앙에 위치시키기 / centering&lt;br /&gt;&amp;nbsp; $("#popupContact").css({&lt;br /&gt;&amp;nbsp; &amp;nbsp; "position": "absolute",&lt;br /&gt;&amp;nbsp; &amp;nbsp; "top": windowHeight/2-popupHeight/2,&lt;br /&gt;&amp;nbsp; &amp;nbsp; "left": windowWidth/2-popupWidth/2&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&amp;nbsp; //IE6 을 위한 핵 / only need force for IE6&lt;br /&gt;&amp;nbsp; $("#backgroundPopup").css({&lt;br /&gt;&amp;nbsp; &amp;nbsp; "height": windowHeight&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;}&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;그래서 만약 &lt;strong&gt;팝업창을 제어&lt;/strong&gt;하기 위한 &lt;strong&gt;popupStatus&lt;/strong&gt; 변수를 가지고 있다면 &lt;strong&gt;$(document).ready&lt;/strong&gt; 함수 안에 jQuery 이벤트 제어를 사용해서 상호작용을 하기 위해 함수들이 필요하다.(&lt;strong&gt;loadPopup&lt;/strong&gt; - 불러오기, &lt;strong&gt;disablePopup&lt;/strong&gt; - 닫기/비활성화, centerPopup - 화면 가운데 위치시키기)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;모든 코드는 아래 함수 안에 들어가야 한다는 것을 기억하자.&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;$(document).ready(function(){&lt;br /&gt;//following code will be here&lt;br /&gt;});&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;아이디가 &lt;strong&gt;#button&lt;/strong&gt; 인 버튼을 눌렀을때 팝업이 활성화 되도록 하고 싶다. 그래서&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;//LOADING POPUP&lt;br /&gt;//Click the button event!&lt;br /&gt;$("#button").click(function(){&lt;br /&gt;//centering with css&lt;br /&gt;centerPopup();&lt;br /&gt;//load popup&lt;br /&gt;loadPopup();&lt;br /&gt;});&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;간단하지 않은가? 그럼 계속해서 이벤트를 닫는 부분들 살펴보도록 하자. 모두 &lt;strong&gt;3가지 다른 방식&lt;/strong&gt;으로 팝업이 닫히길 원한다. &lt;strong&gt;ESC 키를 누르거나&lt;/strong&gt;, &lt;strong&gt;팝업창에서 벗어나거나&lt;/strong&gt; &lt;strong&gt;X 버튼을 클릭&lt;/strong&gt;하는 것이다. 그래서 아래와 같이 해줬다.&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;//CLOSING POPUP&lt;br /&gt;//Click the x event!&lt;br /&gt;$("#popupContactClose").click(function(){&lt;br /&gt;&amp;nbsp; disablePopup();&lt;br /&gt;});&lt;br /&gt;//Click out event!&lt;br /&gt;$("#backgroundPopup").click(function(){&lt;br /&gt;&amp;nbsp; disablePopup();&lt;br /&gt;});&lt;br /&gt;//Press Escape event!&lt;br /&gt;$(document).keypress(function(e){&lt;br /&gt;&amp;nbsp; if(e.keyCode==27 &amp;amp;&amp;amp; popupStatus==1){&lt;br /&gt;&amp;nbsp; disablePopup();&lt;br /&gt;}&lt;br /&gt;});&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;h3&gt;4단계: jQuery를 이용한 멋지고 부드러운 팝업 테스트해보기_Step 4: Trying our stunning and smooth window popup in jQuery!&lt;/h3&gt;&lt;p&gt;이제 다 끝났다. 이 튜토리얼이 도움이 되었으면 좋겠다. &lt;a href="http://yensdesign.com/tutorials/popupjquery/" title="http://yensdesign.com/tutorials/popupjquery/" class="external"&gt;여기서&lt;/a&gt; 실제 작동하는 예제를 볼 수 있고 모든 소스는 &lt;a href="http://yensdesign.com/tutorials/popupjquery/popupjquery.rar" title="http://yensdesign.com/tutorials/popupjquery/popupjquery.rar" class="external"&gt;여기서 다운로드&lt;/a&gt; 할 수 있다. 그리고 여러개의 팝업창을 열기 위한 중요한 업데이트가 있다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;각각의 팝업을 위한 부분을 생성하지 않고 &lt;strong&gt;여러개의 팝업&lt;/strong&gt;을 띄우고 싶다면 &lt;strong&gt;자바스크립트 오브젝트를 생성&lt;/strong&gt;해줘야 한다. 그러면 &lt;strong&gt;팝업 오브젝트&lt;/strong&gt;에서 여러개의 &lt;strong&gt;인스턴스를 생성&lt;/strong&gt;해낼 수 있다.&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;만약 버그나 잘못된 영어 표현을 발견했거나 질문이나 하고 싶은 말이 있는 경우 코멘트를 달아달라. 다음 시간에 또 보도록 하자.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="text-align:right"&gt;이 글은 &lt;a href="http://whdrnr01.springnote.com/pages/2621432"&gt;스프링노트&lt;/a&gt;에서 작성되었습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107692362051888978-7448149183847720634?l=whdrnr01-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/7448149183847720634/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2009/02/jquery%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%A9%8B%EC%A7%80%EA%B3%A0-%EB%B6%80%EB%93%9C%EB%9F%AC%EC%9A%B4-%ED%8C%9D%EC%97%85%EC%B0%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0.html#comment-form' title='1개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/7448149183847720634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/7448149183847720634'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2009/02/jquery%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4%EC%84%9C-%EB%A9%8B%EC%A7%80%EA%B3%A0-%EB%B6%80%EB%93%9C%EB%9F%AC%EC%9A%B4-%ED%8C%9D%EC%97%85%EC%B0%BD-%EB%A7%8C%EB%93%A4%EA%B8%B0.html' title='jQuery를 이용해서 멋지고 부드러운 팝업창 만들기'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107692362051888978.post-1828472140113295956</id><published>2009-01-29T16:48:00.000+09:00</published><updated>2011-01-30T13:05:20.976+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CakePHP'/><title type='text'>CakePHP에서 jQuery를 이용해 자동완성 구현하기</title><content type='html'>&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;개인적인 목적으로 번역한 글이기 때문에 오역과 의역이 많습니다.&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;원문 -&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;a href="http://teknoid.wordpress.com/2008/05/07/jquery-autocomplete-in-cakephp/"&gt;http://teknoid.wordpress.com/2008/05/07/jquery-autocomplete-in-cakephp/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="color: rgb(51, 51, 51); font-family: 돋움,San-Serif; font-size: small;"&gt;이것은 CakePHP와 jQuery를 이용한 "필드 자동완성"을 설정하는 방법에 대한 빠른 예제이다.&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;Product 라는 모델과 products 콘트롤러가 있다고 가정해 보자. 여기서 목표는 사용자가 단어 몇개를 치면 autocomplete 기능을 이용해서 DB에서 매칭되는 제품 리스트를 보여주는 것이다. 먼저 해줘야 할 것은 jQuery 라이브러리를 인클루딩하는 것이다. 만약 $script_for_layout 을 사용한다면 뷰 파일은 아마도 아래와 같을 것이다.&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;$javascript-&amp;gt;link(’jquery/jquery.min’, false);&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;다음으로 autocomplete 플러그인을 인클루드해야 한다. 그런 플러인들은 몇 종류가 있다.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;&lt;p class="section" style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="section" style="font-family: 돋움,San-Serif; font-size: small;"&gt;이 플러그인이 조금 쓸만하다:&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;a href="http://www.pengoworks.com/workshop/jquery/autocomplete.htm" class="section" style="color: rgb(102, 153, 204); text-decoration: none;"&gt;http://www.pengoworks.com/workshop/jquery/autocomplete.htm&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="section" style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;(jQuery 자동완성이 어떻게 작동하는지에 대한 자세한 내용은 문서를 참고하라. 또한 적절한 CSS 파일과 로딩 이미지도 얻을 수 있다.)&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;JS 디렉토리 어딘가에 저장을 하고 난 후에(아마도 js/jquery/plugins 폴더가 될것이다.) 뷰에서 아래와 같이 반드시 인클루딩을 해줘야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;$javascript-&amp;gt;link(’jquery/plugins/autocomplete’, false);&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;이제 자동완성 필드로 사용될 폼 필드가 필요하다. 기본적으로 플러그인에서 id="autoComplete"인 필드명을 기대할 것이다. 그래서 폼의 일부분에 이런 부분을 명시해 줘야 한다.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&amp;lt;?php echo $form-&amp;gt;text('Product.name', array('size'=&amp;gt;'30', 'id'=&amp;gt;'autoComplete')); ?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;(여기서 Product 라는 모델명을 사용하기로 한것을 기억하자.)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;아직까진 나쁘지 않다. 자 그럼 이제부터 자바스크립트 코드를 작성해서 폼 엘리먼트에 실제 자동완성 기능을 붙이도록 해보자. 새로운 JS 파일을 만들고 파일명을 autocompleteAction.js 라고 하자.(뷰에서 인클루딩하는 것. 잊지 말자.) 코드는 아래와 같은 형태가 될 것이다.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;$(document).ready(function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $("#autoComplete").autocomplete("/products/autoComplete", {&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; minChars: 2,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lineSeparator: "^",&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cacheLength: 10,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; onItemSelect: selectItem,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; onFindValue: findValue,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; formatItem: formatItem,&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; autoFill: false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br /&gt;&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;function selectItem(li) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; findValue(li);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function findValue(li) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( li == null ) return alert("No match!"); // if coming from an AJAX call, let's use the product id as the value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if( !!li.extra ) var sValue = li.extra[0]; // otherwise, let's just display the value in the text box&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else var sValue = li.selectValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("The value you selected was: " + sValue);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function formatItem(row) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(row[1] == undefined) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return row[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return row[0] + " (id: " + row[1] + ")";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 돋움,San-Serif; font-size: small;"&gt;기본에서 다뤘던것처럼 위 액션은 폼 필드에 두글자 이상을 입력하게 되면 자동완성 기능을 통해서 알려주게 될 것이다.(최소 두글자 이상은 입력해야 한다.) lineSeparator:"^" 는 자동완성 플러그인에 글자를 세는 라인이 어디든지 간에 ^ 문자를 만나면 다음 줄로 건너 뛰라는 의미이다. 이 부분에 대해서는 조금 뒤에 설명하도록 하겠다. 이 기능은 새줄 입력하는 문자가 "\n"일 경우엔 의미가 없다. 하지만 CakePHP에서 이 개행문자열을 인식시킬 수 없었다. 그래서&lt;/span&gt; &lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 돋움,San-Serif; font-size: small;"&gt;제품명에 나타나지 않는&lt;/span&gt; &lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 돋움,San-Serif; font-size: small;"&gt;이런 애매한 문자 대신에 ^ 를 사용하기로&amp;nbsp;했다. 이것은 아주 좋은 해결책은 아니지만 나중에 다시 살펴보기로 했다.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;그래서 무슨일이 벌어졌는가? 자, 이제 자동완성은 어딘가에 있는 아이템(예제에서는 제품) 리스트를 가져올 필요가 있다. 그리고 이 코드는 바로 그 부분을 보여준다:&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;autocomplete(”/products/autoComplete”…&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif;"&gt;아마도 CakePHP의 규약에 따라 폴더명을 보고 products 콘트롤러와 autoComplete 액션이 필요할 것이라는 것을 알 수 있을 것이다. 이제 그 파일을 만들 때가 되었다. 코드는 아래와 같다.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;function autoComplete() {&lt;br /&gt;Configure::write('debug', 0);&lt;br /&gt;$this-&amp;gt;layout = 'ajax';&lt;br /&gt;$products = $this-&amp;gt;Product-&amp;gt;find('all', array(&lt;br /&gt;'conditions'=&amp;gt;array( 'Product.name'=&amp;gt; 'LIKE '.$this-&amp;gt;params['url']['q'].'%'),&lt;br /&gt;'fields'=&amp;gt;array( 'name', 'id')&lt;br /&gt;));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$this-&amp;gt;set('products', $products);&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 돋움,San-Serif; font-size: small;"&gt;자이 기본적으로 폼 필드에 입력한 최초의 두 글자와 매칭되는 제품명을 찾아볼 수 있게 되었다.&amp;nbsp;DB에서 제품 아이디와 제품명을 리턴받아왔다. $this-&amp;gt;params['url']['q'] 라고 되어 부분을 주목하자. 자동완성 플러그인은 GET 메서드를 사용해서 폼 데이터를 콘트롤러에 넘겨주게 된다. 여기서 q=&amp;lt;문자열&amp;gt; 에는 쿼리문이 오게 된다. 이 부분이 CakePHP가 쿼리문을 읽어오는 방법이다. 이제 어떤 제품을 찾고 뷰를 위한 결과를 배열로 저장해 보자. 뷰는 텍스트 필드에 타이핑을 시작할때 필드 아래쪽에 리스트 형태로 나오게 된다. 파일을 하나 만들어 보자(auto_complete.ctp)&lt;/span&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;if(!empty($products)) {&lt;br /&gt;foreach($products as $product) {&lt;br /&gt;echo $product['Product']['name'].'|'.$product['Product']['id'].'^';&lt;br /&gt;}&lt;br /&gt;} else {&lt;br /&gt;echo 'No results';&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="margin: 0px; font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 2em;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 돋움,San-Serif; font-size: small;"&gt;위 코드는 제품 배열을 풀어서 제품명과 제품 아이디 형태로 분류해서 보여주는 코드이다. 물론 배열이 비어 있다면 아무런 결과 값이 없기 때문에 "No results"라는 메시지를 뿌리게 된다. 위에 설명했던 ^ 문자를 기억하는가? 여기 코드에 보면 각 제품명과 제품 아이디를 출력하고 다음 제품으로 넘어갈 때 ^문자를 기준으로 구분을 한다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-family: 돋움,San-Serif;"&gt;자. 여기까지가 전부다. 복사해서 붙여넣기 기능을 이용하면 빠르게 결과를 볼 수 있고 수정도 가능하다. 아마 20분 이내에 가능할 것이다.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 돋움,San-Serif; font-size: small;"&gt;물론 자바스크립트의 경고창보다는 더 나은 방식으로 나오길 원할것이다.&lt;/span&gt;&lt;span style="font-family: 돋움,San-Serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align:right"&gt;이 글은 &lt;a href="http://whdrnr01.springnote.com/pages/1949156"&gt;스프링노트&lt;/a&gt;에서 작성되었습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107692362051888978-1828472140113295956?l=whdrnr01-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/1828472140113295956/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2009/01/cakephp%EC%97%90%EC%84%9C-jquery%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/1828472140113295956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/1828472140113295956'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2009/01/cakephp%EC%97%90%EC%84%9C-jquery%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%B4-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0.html' title='CakePHP에서 jQuery를 이용해 자동완성 구현하기'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107692362051888978.post-5940100767566116719</id><published>2009-01-24T17:03:00.000+09:00</published><updated>2011-01-30T13:05:20.938+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CakePHP'/><title type='text'>CakePHP와 jQuery를 이용한 CMS - wildflower</title><content type='html'>&lt;p&gt;&lt;span class="Apple-style-span" style="font-weight: bold; line-height: normal; white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;원문 -&lt;/span&gt;&lt;/span&gt; &lt;a href="http://phpimpact.wordpress.com/2008/09/23/wildflower-a-cakephp-and-jquery-content-management-system/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://phpimpact.wordpress.com/2008/09/23/wildflower-a-cakephp-and-jquery-content-management-system/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="entrytitle"&gt;&lt;h2 style="margin: 0px; font-weight: normal; letter-spacing: -1px;"&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 85, 85);"&gt;&lt;a href="http://phpimpact.wordpress.com/2008/09/23/wildflower-a-cakephp-and-jquery-content-management-system/" title="Permanent Link to Wildflower, a CakePHP and jQuery&amp;amp;nbsp;CMS" rel="bookmark" style="text-decoration: none; color: rgb(71, 119, 143);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Wildflower, a CakePHP and jQuery&amp;nbsp;CMS&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/h2&gt;&lt;h3 style="margin: 0px; color: rgb(111, 111, 111); padding-top: 0px; font-weight: bold; letter-spacing: -1px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;September 23, 2008&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;div class="entrybody snap_preview"&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Wildflower는 멋진 UI, 간단한 사용자 관리, 파일 관리를 위해 필요한 도구를 제공하는 웹 콘텐츠 관리 프로그램이다. CMS 에서 기대되는 표준 컴포넌트를 얻을 수 있다&lt;/span&gt;&lt;/span&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;관리된 페이지 콘텐츠&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;카테고리와 코멘트 기능이 있는 블로그&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;메시지 아카이브를 이용한 연락 폼&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;파일 관리자&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;사용자 계정&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;글로 아무리 자세히 설명하는 것보다 사진 한장(스크린샷)으로 보는 것이 낫다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://phpimpact.files.wordpress.com/2008/09/wildflower.jpg" style="text-decoration: none; color: rgb(71, 119, 143);"&gt;&lt;img class="aligncenter size-full wp-image-846" title="wildflower" src="http://phpimpact.files.wordpress.com/2008/09/wildflower.jpg?w=480&amp;amp;h=326" height="326" alt="" width="480" style="border-style: none; margin: 5px auto; display: block;" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;h3 style="margin: 0px; font-weight: normal; letter-spacing: 0px; padding-top: 10px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Links&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://wf.klevo.sk/" style="text-decoration: none; color: rgb(71, 119, 143);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Project Home Page&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/wildflower/" style="text-decoration: none; color: rgb(71, 119, 143);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Source Code&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="text-align:right"&gt;이 글은 &lt;a href="http://whdrnr01.springnote.com/pages/1949122"&gt;스프링노트&lt;/a&gt;에서 작성되었습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107692362051888978-5940100767566116719?l=whdrnr01-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/5940100767566116719/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2009/01/cakephp%EC%99%80-jquery%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-cms-wildflower.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/5940100767566116719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/5940100767566116719'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2009/01/cakephp%EC%99%80-jquery%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-cms-wildflower.html' title='CakePHP와 jQuery를 이용한 CMS - wildflower'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107692362051888978.post-3676990570193811942</id><published>2008-11-10T11:26:00.000+09:00</published><updated>2011-01-30T13:05:20.892+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CakePHP'/><title type='text'>CakePHP 1.2의 인증기능 개선하기</title><content type='html'>&lt;div class="section" style="background-color: rgb(249, 249, 216);"&gt;&lt;p class="section"&gt;개인적인 공부를 목적으로 번역한 글이며 오역이 많이 있을 수 있습니다. 또한 번역 내용에 존칭은 생략했습니다.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;원문 :&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 18px;"&gt;&lt;a href="http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;이 글은&amp;nbsp;최근에 &lt;a href="http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/" class="external" title="http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/"&gt;올렸던 퓨토리얼&lt;/a&gt;에(&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;일반적인 인증 컴포넌트 기술이 아닌 예제를 몇개 포함하고 있던&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;) 이어지는 글이다. 이 글에서는 이전에 올렸던 글에서 언급했던 것들보다 더 깊이 있게 알아보도록 하자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;다시 &lt;strong&gt;app_controller.php&lt;/strong&gt; 를 살펴보도록 하자:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;class AppController extends Controller {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;var $components = array('Auth');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;function beforeFilter() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;Auth-&amp;gt;allow('display');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;Auth-&amp;gt;loginRedirect = array('controller'=&amp;gt;'users', 'action'=&amp;gt;'index');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;code style="font-style: normal; color: rgb(132, 147, 159);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;Auth-&amp;gt;allow('display');&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;는 Auth 컴포넌트에 'display'라는 특정 액션에 대해 접근을 허락하라고 말한다. 이 액션은 Cake 의 코어에서 찾을 수 있는 Pages 콘트롤러의 일부분이다. 이 콘트롤러의 주요 목적은 정적 페이지들을 다루는 것이다. 실제 어떻게 작동하는지 살펴보려면 API를 살펴볼 수 있다. 하지만 한가지 명심해야 할 것은 'display'라는 액션이 정적 페이지들을 보여주는데 사용된다는 것이다. 만약 기본으로 허락되지 않으면 Auth는 홈페이지의 'About us' 페이지 같은 곳에 접근할 수 없게 할 것이다. 많은 경우 이것은 권장되지 않는 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;code style="font-style: normal; color: rgb(132, 147, 159);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;Auth-&amp;gt;loginRedirect = array('controller'=&amp;gt;'users', 'action'=&amp;gt;'index');&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;는 Auth 컴포넌트에 로그인 한 후에 사용자를 어디로 리다이렉팅 시켜줄지 말해준다. 기본으로 Auth는 사이트의 메인페이지로 리다이렉팅 되도록 설정되어 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="font-family: 'Trebuchet MS',San-Serif;"&gt;다음으로, Users 콘트롤러에서 아래 부분을 유의해서 살펴보자&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if($this-&amp;gt;action == 'add') {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;Auth-&amp;gt;authenticate = $this-&amp;gt;User;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;&lt;code style="font-style: normal; color: rgb(132, 147, 159);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;Auth-&amp;gt;authenticate = $this-&amp;gt;User;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; &lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;는 Auth 컴포넌트에 hashPasswords()에 의해 제어되던 것을 오버라이딩하기 위해 User 모델 오브젝트를 사용해야 한다고 알려준다. 다시 말하면, 만약 $this-&amp;gt;User 오브젝트에 hashPasswords() 메서드가 있으면 이것은 Auth 콘트롤러에 있는 hashPasswords() 메서드를 대신해서 사용이 된다는 의미이다. 예제에서 보는 것 처럼 이 오버라이딩은 'add' 액션에만 적용이 된다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;왜 이렇게 번거롭게 하는가?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;글쎄, Auth 컴포넌트는 검증에 들어가기 전에 비밀번호를 암호화 한다는 점을 기억할 필요가 있다. 이것은 몇가지 문제를 발생시킨다. 먼저 검증 메서드가 사용자가 입력한 실제 값이 아닌 암호화된 값을(항상 길고 비어 있지 않은) 받아오기 때문에 'minLength' 와 'notEmpty' 규칙을 정확하게 적용할 수가 없다. 두번째로 만약 폼에 에러가 있다면 암호화된 값은 password 필드를 다시 차지하게 될 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;By User 모델에 간단한 오버라이드를 만들어 줌으로 인해 작은 문제들을 피해갈 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol class="code"&gt;&lt;li&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;function hashPasswords($data, $enforce=false) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if($enforce &amp;amp;&amp;amp; isset($this-&amp;gt;data[$this-&amp;gt;alias]['password'])) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if(!empty($this-&amp;gt;data[$this-&amp;gt;alias]['password'])) {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;data[$this-&amp;gt;alias]['password'] = Security::hash($this-&amp;gt;data[$this-&amp;gt;alias]['password'], null, true);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return $data;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;function beforeSave() {&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;$this-&amp;gt;hashPasswords(null, true);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return true;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="line-height: normal; white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span style="color: rgb(51, 51, 51);"&gt;&lt;span style="font-family: 'Trebuchet MS',San-Serif;"&gt;이익은 간단하지만 가치는 있다.&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51);"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;뷰를 만들때 폼 필드명이 모델이나 콘트롤러에 어떤 영향을 미칠지에 대해서 고민할 필요가 없다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;검증 규칙을 적용하기 위해 'password' 필드를('passwd' 같은 다른 필드명으로 하지 않아도 된다.) 사용할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;폼 에러가 발생했을때 'password' 필드가 정리된다는 것을 믿지 않는다.&amp;nbsp;또한 'password' 를 다시 타이핑하도록 함으로 인해 'email' 필드에 실수를 한 사람&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;을 탓할 순 없다.&lt;/span&gt;&lt;/span&gt;(?)&lt;/li&gt;&lt;li style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;가상 'password' 필드를 재설정/해제를 위해 콘트롤러에 코드를 추가할 필요가 없다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;위 코드를 설명하기 위해 hashPasswords()는 beforeSave() 에 true 로 설정될 $enforce 플래그가 'true'로 설정되지 않는 한 암호화를 수행하지 않을 것이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana,Arial,Helvetica,sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 1em; line-height: 1.3em;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Trebuchet MS',San-Serif;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;아무쪼록 도움이 되었기를 바라며 Auth에 대한 더 많은 트윅이 나왔으면 좋겠다.(Hopefully this clarifies some things and gives you some more ideas for the further tweaking of Auth…&lt;/span&gt;&lt;/span&gt;)&lt;/p&gt;&lt;p style="text-align:right"&gt;이 글은 &lt;a href="http://whdrnr01.springnote.com/pages/1949130"&gt;스프링노트&lt;/a&gt;에서 작성되었습니다.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107692362051888978-3676990570193811942?l=whdrnr01-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/3676990570193811942/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2008/11/cakephp-12%EC%9D%98-%EC%9D%B8%EC%A6%9D%EA%B8%B0%EB%8A%A5-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/3676990570193811942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/3676990570193811942'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2008/11/cakephp-12%EC%9D%98-%EC%9D%B8%EC%A6%9D%EA%B8%B0%EB%8A%A5-%EA%B0%9C%EC%84%A0%ED%95%98%EA%B8%B0.html' title='CakePHP 1.2의 인증기능 개선하기'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107692362051888978.post-5352304213166786417</id><published>2008-10-07T16:09:00.000+09:00</published><updated>2011-01-30T13:05:20.818+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cakephp'/><category scheme='http://www.blogger.com/atom/ns#' term='Tip'/><category scheme='http://www.blogger.com/atom/ns#' term='app_model.php'/><category scheme='http://www.blogger.com/atom/ns#' term='generateList'/><title type='text'>CakePHP 1.2 에서 generateList() 에러!</title><content type='html'>cakePHP를 사용하기 시작한지 얼마되지 않았지만 모델의 연관을 통한 강력한 기능은 아주 매력적이라는 생각을 하게 된다. 사실 MVC 패턴이라고 해서 생소한 환경으로 갈아탄것도 아직 적응이 다 되었다고 하기에는 조금 무리가 있다. 암튼 오늘은 cakePHP를 학습하면서 알게 된 간단한 팁을 올리도록 하겠다. &lt;br /&gt;&lt;br /&gt;generateList()는 모델 사이의 연관이 정의되어 있는 경우(A라는 모델과 B라는 모델이 belongsTo 라는 연관으로 묶여 있는 상태에서) 외래키를 보고 대상이 되는 모델의 리스트를 뽑아와서 셀렉트 박스 형태로 뿌려 줄 때 유용합니다.(이런 조금 헷갈리네요.) 책을 새로 등록할때 책을 쓴 저자명을 등록하는데 저자명을 셀렉트 박스 형태로 뿌리고 싶은 경우입니다. 그런데 설명에 나와있는대로 하니까 에러가 나옵니다.&lt;br /&gt;&lt;br /&gt;구글링해서 찾은 정보입니다. find('all') 보다 find('list') 형태로 받아와야 작동을 한다라고 되어 있는데요. /app/app_model.php 라는 파일을 만들고 아래 함수를 추가해 주면 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;div style="border: 1px solid rgb(187, 187, 187); padding: 10px; background-color: rgb(221, 221, 221);"&gt;&amp;lt;?php&lt;br /&gt;class AppModel extends Model {&lt;br /&gt;function getlist ($cond=null,$order=null,$limit=null,$key=null,$val=null) {&lt;br /&gt;&amp;nbsp; &amp;nbsp; return $this-&amp;gt;find("list",array(&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'conditions' =&amp;gt; $cond,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'order' =&amp;gt; $order,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'limit' =&amp;gt; $limit,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'fields' =&amp;gt; array(str_replace('{n}.','',$key), str_replace('{n}.','',$val))&lt;br /&gt;&amp;nbsp; &amp;nbsp; ));&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/div&gt;&lt;br /&gt;이제 generateList() 대신 getlist() 라고 사용하시면 됩니다. 이때 코딩 형식은 &lt;br /&gt;&lt;br /&gt;getlist(null, null, null, '{n}.ModelName.key', '{n}.ModelName.value');&lt;br /&gt;&lt;br /&gt;위와 같이 해주시면 됩니다. &lt;a target="_blank" href="http://book.cakephp.org/view/580/Model-generateList"&gt;1.2메뉴얼에 설명&lt;/a&gt;이 되어 있군요....^^&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107692362051888978-5352304213166786417?l=whdrnr01-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/5352304213166786417/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2008/10/cakephp-12-%EC%97%90%EC%84%9C-generatelist-%EC%97%90%EB%9F%AC.html#comment-form' title='2개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/5352304213166786417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/5352304213166786417'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2008/10/cakephp-12-%EC%97%90%EC%84%9C-generatelist-%EC%97%90%EB%9F%AC.html' title='CakePHP 1.2 에서 generateList() 에러!'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4107692362051888978.post-860493482857653085</id><published>2008-09-26T16:01:00.000+09:00</published><updated>2011-01-30T13:05:20.776+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cakephp'/><category scheme='http://www.blogger.com/atom/ns#' term='blueprint'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>cOOkIE blog textcube 버전을 시작합니다.</title><content type='html'>&lt;div class="imageblock center" style="text-align: center; clear: both;"&gt;&lt;a href="http://www.flickr.com/photos/27467108@N03/2564764591" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3005/2564764591_941ffd0470.jpg" style="width:333px;height:500px;" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;개설하고 오랫동안 어떤 블로그로 컨셉을 잡을지 고민을 많이 했습니다. 그러다 앞으로 알아가고 싶은 분야와 공부하고 있는 분야에 대한 자료를 정리하는 것이 좋겠다 싶어서 그쪽으로 컨셉을 잡아 봤습니다. 원래 PHP를 이용한 웹 프로그램을 업으로 삼고 있다 보니 그 분야에 대한 연구를 계속하게 되는데요. 요즘은&lt;a target="_blank" href="http://www.cakephp.org"&gt; CakePHP&lt;/a&gt;라는 프레임워크를 한참 공부중입니다.&lt;br /&gt;&lt;br /&gt;자바스크립트와 CSS쪽도 함께 보고 있고 어떻게 하면 &lt;span style="font-weight: bold;"&gt;CakePHP + jQuery + CSS&lt;/span&gt; 환경을 자유롭게 가지고 놀 수 있을지를 고민하고 있습니다. 아직 배우는 입장이고 평생 배우는 자세를 유지하는 것이 마땅하다고 생각하고 있기때문에 분야가 중간에 바뀔 수도 있지만 지금 관심이 있는 분야는 이쪽입니다. 앞으로 블로그를 통해 많은 소통이 있었으면 좋겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/13822502@N04/1424606104"&gt;&lt;img src="http://farm2.static.flickr.com/1033/1424606104_3f3d7c1d84_s.jpg" alt=""&gt;&lt;/a&gt;&lt;a href="http://www.flickr.com/photos/16318901@N00/285731517"&gt;&lt;img src="http://farm1.static.flickr.com/105/285731517_8d4097a342_m.jpg" alt=""&gt;&lt;/a&gt;&lt;a href="http://www.flickr.com/photos/21241983@N00/1049376896"&gt;&lt;img src="http://farm2.static.flickr.com/1030/1049376896_87bd6f5452_s.jpg" alt=""&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4107692362051888978-860493482857653085?l=whdrnr01-textcube.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://whdrnr01-textcube.blogspot.com/feeds/860493482857653085/comments/default' title='댓글'/><link rel='replies' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2008/09/cookie-blog-textcube-%EB%B2%84%EC%A0%84%EC%9D%84-%EC%8B%9C%EC%9E%91%ED%95%A9%EB%8B%88%EB%8B%A4.html#comment-form' title='0개의 덧글'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/860493482857653085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4107692362051888978/posts/default/860493482857653085'/><link rel='alternate' type='text/html' href='http://whdrnr01-textcube.blogspot.com/2008/09/cookie-blog-textcube-%EB%B2%84%EC%A0%84%EC%9D%84-%EC%8B%9C%EC%9E%91%ED%95%A9%EB%8B%88%EB%8B%A4.html' title='cOOkIE blog textcube 버전을 시작합니다.'/><author><name>cOOkIE</name><uri>http://www.blogger.com/profile/07657256966339974218</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3005/2564764591_941ffd0470_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
