원문 :http://yensdesign.com/2008/09/how-to-create-a-stunning-and-smooth-popup-using-jquery/

 

개인적인 용도로 번역을 했기때문에 오역과 의역이 많을 수 있습니다.

 

오늘날 웹사이트들은 점점 더 풍부하고 사용자들과 상호작용을 하는 것이 점점 더 모든 웹사이트에서 꼭 필요한 것이 되어가고 있다. 보통 중요한 정보를 보여주기 위해 윈도우 팝업창을 사용하는데 jQuery를 이용해서 멋지고 훌륭한 윈도우 팝업창을 만드는 방법에 대해서 배워보도록 하자. 읽어보고 이해가 되지 않는 부분이 있으면 알려주기 바란다. 영어가 별로 신통치 못해서 그럴수도 있을것이다.

 

여기서 튜토리얼이 잘 작동하는지 테스트해 볼 수 있다.

 

테스트 된 브라우저들: Firefox, Internet Explorer 6 & 7, Opera (old and 9.52) , Safari & Chrome.

 

어떤것들이 필요한가?_What will We need?

멋진 팝업을 만들기 위해서 아래와 같은 것들이 필요하다.

 

  • HTML
  • CSS
  • jQuery 라이브러리
  • 배우고자 하는 열정 :D

 

jQuery는 빠르고 안정적인 개발에 촛점을 맞춘 새로운 자바스크립트 라이브러리이다. 지난달에 "add magic"에 사용되기도 했다. 또한 http://www.plusdeporte.com 과 http://www.plusmusica.com몇몇 사이트에서 AJAX 를 구현하기 위해 사용되었다.

 

 

jQuery 는 빠르고 간결한 자바스크립트 라이브러리이다. jQuery는 빠른 웹 개발을 위한 HTML 문서 추적, 이벤트 핸들링, 애니메이션과 AJAX 통신등을 쉽게 구현할 수 있도록 해준다.

 

1단계:무엇을 만들것인가?_Step 1: What We will do?

사진 한장이 백마디 말보다 가치가 있다... 암튼 아래와 같은 결과가 나오도록 하는 방법을 배우게 될것이다.

보는것처럼 간단한 사이트를 하나 만들것이다. 버튼을 누르면 멋지고 부드러운 팝업창이 뜨게 될것이다. 시작해 보자!

 

2단계:간단한 웹 페이지 만들기_Step 2: Setting up our simple webpage

먼저 2개의 영역을 가지는 간단한 HTML 웹페이지가 필요하다. popup을 위한 popupContact 과 helps our popup 을 위한 backgroundPopup 이다.;)

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>yensdesign.com - How to create a stuning and smooth popup in jQuery</title>
        <link rel="stylesheet" href="general.css" type="text/css" media="screen" />
        <script src="http://jqueryjs.googlecode.com/files/jquery-1.2.6.min.js" type="text/javascript"></script>
        <script src="popup.js" type="text/javascript"></script>
    </head>
    <body>
        <center>
            <a href="http://www.yensdesign.com"><img src="logo.jpg" alt="Go to yensdesign.com"/></a>
            <div id="button"><input type="submit" value="Press me please!" /></div>
        </center>
        <div id="popupContact">
            <a id="popupContactClose">x</a>
            <h1>Title of our cool popup, yay!</h1>
            <p id="contactArea">
                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...
                <br/><br/>
                We can use it for popup-forms and more... just experiment!
                <br/><br/>
                Press ESCAPE, Click on X (right-top) or Click Out from the popup to close the popup!
                <br/><br/>
                <a href="http://www.yensdesign.com"><img src="logo.jpg" alt="Go to yensdesign.com"/></a>
            </p>
        </div>
        <div id="backgroundPopup"></div>
    </body>
    </html>

 

주의: <head> 섹션에 구글 사이트로부터 호스팅되는 jQuery를 인클루딩한 부분이 보인다. 몇몇 사람들은 jQuery 라이브러리를 캐시에 저장하기 위해서 이렇게 한다. 많은 웹 페이지가 같은 리소스를 가지게 됨으로 인해 불러오는 시간을 줄일 수 도 있다.

 

다음으로 CSS를 보도록 하자. HTML 에 스타일을 추가하고 무엇보다도 HTML  메인 영역을 숨기기 위한 스타일을 CSS에 추가해 줘야 한다. "popup core"와 일치하는 popupContactbackgroundPopup 그리고 팝업이 시작될때 보이지 않았으면 하는 부분들오 있다.  ;)

 

  1. 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,
    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,
    tfoot, thead, tr, th, td {
    border:0pt none;
    font-family:inherit;
    font-size:100%;
    font-style:inherit;
    font-weight:inherit;
    margin:0pt;
    padding:0pt;
    vertical-align:baseline;
    }
    body{
    background:#fff none repeat scroll 0%;
    line-height:1;
    font-size: 12px;
    font-family:arial,sans-serif;
    margin:0pt;
    height:100%;
    }
    table {
    border-collapse:separate;
    border-spacing:0pt;
    }
    caption, th, td {
    font-weight:normal;
    text-align:left;
    }
    blockquote:before, blockquote:after, q:before, q:after {
    content:"";
    }
    blockquote, q {
    quotes:"" "";
    }
    a{
    cursor: pointer;
    text-decoration:none;
    }
    br.both{
    clear:both;
    }
    #backgroundPopup{
    display:none;
    position:fixed;
    _position:absolute; /* hack for internet explorer 6*/
    height:100%;
    width:100%;
    top:0;
    left:0;
    background:#000000;
    border:1px solid #cecece;
    z-index:1;
    }
    #popupContact{
    display:none;
    position:fixed;
    _position:absolute; /* hack for internet explorer 6*/
    height:384px;
    width:408px;
    background:#FFFFFF;
    border:2px solid #cecece;
    z-index:2;
    padding:12px;
    font-size:13px;
    }
    #popupContact h1{
    text-align:left;
    color:#6FA5FD;
    font-size:22px;
    font-weight:700;
    border-bottom:1px dotted #D3D3D3;
    padding-bottom:2px;
    margin-bottom:20px;
    }
    #popupContactClose{
    font-size:14px;
    line-height:14px;
    right:6px;
    top:4px;
    position:absolute;
    color:#6fa5fd;
    font-weight:700;
    display:block;
    }
    #button{
    text-align:center;
    margin:100px;
    }

 

CSS 코드는 CSS를 리셋해주는 작은 CSS 조각을 추가하기 위해 매번 사용해 왔던 것이다. 이 코드는 모든 웹 사이트에서 레이아웃을 잡을때 많은 도움이 되었다. 암튼 모든 단계를 잘 따랐다면 아래와 같은 화면을 만나볼 수 있다.

 

 

3단계: jQuery를 이용해서 팝업에 마술 걸기_Step 3: Adding magic to our popup with jQuery

튜토리얼의 핵심 파일인 popup.js 파일에 팝업창을 멋지고 부드럽게 해주는 몇개의 함수를 추가해 주게 될 것이다. 하지만 먼저 팝업창의 상태제어하기 위해 popupStatus 변수를 설정해줘야 한다.

  1. //SETTING UP OUR POPUP
    //0은 비활성화된 상태; 1은 활성화된 상태를 의미한다. / 0 means disabled; 1 means enabled;
    var popupStatus = 0;

 

이제 팝업을 불러오기 위한 합수를 만들어보자.

  1. //loading popup with jQuery magic!
    function loadPopup(){
      //팝업은 popupStatus 가 비활성화되어 있을때만 불러진다. / loads popup only if it is disabled
      if(popupStatus==0){
      $("#backgroundPopup").css({
         "opacity": "0.7"
       });
       $("#backgroundPopup").fadeIn("slow");
       $("#popupContact").fadeIn("slow");
          popupStatus = 1;
        }
    }

 

팝업을 닫거나 비활성화시키기 위한 함수

  1. //disabling popup with jQuery magic!
    function disablePopup(){
    //popupStatus 가 활성화 되어 있다면 비활성화 시키기 / disables popup only if it is enabled
    if(popupStatus==1){
    $("#backgroundPopup").fadeOut("slow");
    $("#popupContact").fadeOut("slow");
    popupStatus = 0;
    }
    }

 

팝업창이 화면 중앙에 나타나게 하는 부분 추가

  1. //centering popup
    function centerPopup(){
      //화면 중앙에 자리잡게 하기 위한 요청 / request data for centering
      var windowWidth = document.documentElement.clientWidth;
      var windowHeight = document.documentElement.clientHeight;
      var popupHeight = $("#popupContact").height();
      var popupWidth = $("#popupContact").width();
      //중앙에 위치시키기 / centering
      $("#popupContact").css({
        "position": "absolute",
        "top": windowHeight/2-popupHeight/2,
        "left": windowWidth/2-popupWidth/2
      });
      //IE6 을 위한 핵 / only need force for IE6
      $("#backgroundPopup").css({
        "height": windowHeight
      });
    }

 

그래서 만약 팝업창을 제어하기 위한 popupStatus 변수를 가지고 있다면 $(document).ready 함수 안에 jQuery 이벤트 제어를 사용해서 상호작용을 하기 위해 함수들이 필요하다.(loadPopup - 불러오기, disablePopup - 닫기/비활성화, centerPopup - 화면 가운데 위치시키기)

 

모든 코드는 아래 함수 안에 들어가야 한다는 것을 기억하자.

  1. $(document).ready(function(){
    //following code will be here
    });

 

아이디가 #button 인 버튼을 눌렀을때 팝업이 활성화 되도록 하고 싶다. 그래서

  1. //LOADING POPUP
    //Click the button event!
    $("#button").click(function(){
    //centering with css
    centerPopup();
    //load popup
    loadPopup();
    });

 

간단하지 않은가? 그럼 계속해서 이벤트를 닫는 부분들 살펴보도록 하자. 모두 3가지 다른 방식으로 팝업이 닫히길 원한다. ESC 키를 누르거나, 팝업창에서 벗어나거나 X 버튼을 클릭하는 것이다. 그래서 아래와 같이 해줬다.

  1. //CLOSING POPUP
    //Click the x event!
    $("#popupContactClose").click(function(){
      disablePopup();
    });
    //Click out event!
    $("#backgroundPopup").click(function(){
      disablePopup();
    });
    //Press Escape event!
    $(document).keypress(function(e){
      if(e.keyCode==27 && popupStatus==1){
      disablePopup();
    }
    });

 

4단계: jQuery를 이용한 멋지고 부드러운 팝업 테스트해보기_Step 4: Trying our stunning and smooth window popup in jQuery!

이제 다 끝났다. 이 튜토리얼이 도움이 되었으면 좋겠다. 여기서 실제 작동하는 예제를 볼 수 있고 모든 소스는 여기서 다운로드 할 수 있다. 그리고 여러개의 팝업창을 열기 위한 중요한 업데이트가 있다.

 

각각의 팝업을 위한 부분을 생성하지 않고 여러개의 팝업을 띄우고 싶다면 자바스크립트 오브젝트를 생성해줘야 한다. 그러면 팝업 오브젝트에서 여러개의 인스턴스를 생성해낼 수 있다.

 

만약 버그나 잘못된 영어 표현을 발견했거나 질문이나 하고 싶은 말이 있는 경우 코멘트를 달아달라. 다음 시간에 또 보도록 하자.

 

 

 

 

 

 

이 글은 스프링노트에서 작성되었습니다.

개인적인 목적으로 번역한 글이기 때문에 오역과 의역이 많습니다.

 

원문 - http://teknoid.wordpress.com/2008/05/07/jquery-autocomplete-in-cakephp/


이것은 CakePHP와 jQuery를 이용한 "필드 자동완성"을 설정하는 방법에 대한 빠른 예제이다.

Product 라는 모델과 products 콘트롤러가 있다고 가정해 보자. 여기서 목표는 사용자가 단어 몇개를 치면 autocomplete 기능을 이용해서 DB에서 매칭되는 제품 리스트를 보여주는 것이다. 먼저 해줘야 할 것은 jQuery 라이브러리를 인클루딩하는 것이다. 만약 $script_for_layout 을 사용한다면 뷰 파일은 아마도 아래와 같을 것이다.


  1. $javascript->link(’jquery/jquery.min’, false);


다음으로 autocomplete 플러그인을 인클루드해야 한다. 그런 플러인들은 몇 종류가 있다.


이 플러그인이 조금 쓸만하다: http://www.pengoworks.com/workshop/jquery/autocomplete.htm

(jQuery 자동완성이 어떻게 작동하는지에 대한 자세한 내용은 문서를 참고하라. 또한 적절한 CSS 파일과 로딩 이미지도 얻을 수 있다.)


JS 디렉토리 어딘가에 저장을 하고 난 후에(아마도 js/jquery/plugins 폴더가 될것이다.) 뷰에서 아래와 같이 반드시 인클루딩을 해줘야 한다.

 

  1. $javascript->link(’jquery/plugins/autocomplete’, false);

 

이제 자동완성 필드로 사용될 폼 필드가 필요하다. 기본적으로 플러그인에서 id="autoComplete"인 필드명을 기대할 것이다. 그래서 폼의 일부분에 이런 부분을 명시해 줘야 한다.

 

  1. <?php echo $form->text('Product.name', array('size'=>'30', 'id'=>'autoComplete')); ?>

(여기서 Product 라는 모델명을 사용하기로 한것을 기억하자.)

아직까진 나쁘지 않다. 자 그럼 이제부터 자바스크립트 코드를 작성해서 폼 엘리먼트에 실제 자동완성 기능을 붙이도록 해보자. 새로운 JS 파일을 만들고 파일명을 autocompleteAction.js 라고 하자.(뷰에서 인클루딩하는 것. 잊지 말자.) 코드는 아래와 같은 형태가 될 것이다.

 

  1. $(document).ready(function(){
        $("#autoComplete").autocomplete("/products/autoComplete", {
               minChars: 2,
               lineSeparator: "^",
               cacheLength: 10,
               onItemSelect: selectItem,
               onFindValue: findValue,
               formatItem: formatItem,
               autoFill: false
            });

    });

    function selectItem(li) {
        findValue(li);
    }

    function findValue(li) {
        if( li == null ) return alert("No match!"); // if coming from an AJAX call, let's use the product id as the value
        if( !!li.extra ) var sValue = li.extra[0]; // otherwise, let's just display the value in the text box
        else var sValue = li.selectValue;
        alert("The value you selected was: " + sValue);
    }

    function formatItem(row) {
        if(row[1] == undefined) {
            return row[0];
        } else {
            return row[0] + " (id: " + row[1] + ")";
        }
    }

 

기본에서 다뤘던것처럼 위 액션은 폼 필드에 두글자 이상을 입력하게 되면 자동완성 기능을 통해서 알려주게 될 것이다.(최소 두글자 이상은 입력해야 한다.) lineSeparator:"^" 는 자동완성 플러그인에 글자를 세는 라인이 어디든지 간에 ^ 문자를 만나면 다음 줄로 건너 뛰라는 의미이다. 이 부분에 대해서는 조금 뒤에 설명하도록 하겠다. 이 기능은 새줄 입력하는 문자가 "\n"일 경우엔 의미가 없다. 하지만 CakePHP에서 이 개행문자열을 인식시킬 수 없었다. 그래서 제품명에 나타나지 않는 이런 애매한 문자 대신에 ^ 를 사용하기로 했다. 이것은 아주 좋은 해결책은 아니지만 나중에 다시 살펴보기로 했다.

 

그래서 무슨일이 벌어졌는가? 자, 이제 자동완성은 어딘가에 있는 아이템(예제에서는 제품) 리스트를 가져올 필요가 있다. 그리고 이 코드는 바로 부분을 보여준다:

 

autocomplete(”/products/autoComplete”…

 

아마도 CakePHP의 규약에 따라 폴더명을 보고 products 콘트롤러와 autoComplete 액션이 필요할 것이라는 것을 알 수 있을 것이다. 이제 그 파일을 만들 때가 되었다. 코드는 아래와 같다.


  1. function autoComplete() {
    Configure::write('debug', 0);
    $this->layout = 'ajax';
    $products = $this->Product->find('all', array(
    'conditions'=>array( 'Product.name'=> 'LIKE '.$this->params['url']['q'].'%'),
    'fields'=>array( 'name', 'id')
    ));
    }

    $this->set('products', $products);

    }

자이 기본적으로 폼 필드에 입력한 최초의 두 글자와 매칭되는 제품명을 찾아볼 수 있게 되었다. DB에서 제품 아이디와 제품명을 리턴받아왔다. $this->params['url']['q'] 라고 되어 부분을 주목하자. 자동완성 플러그인은 GET 메서드를 사용해서 폼 데이터를 콘트롤러에 넘겨주게 된다. 여기서 q=<문자열> 에는 쿼리문이 오게 된다. 이 부분이 CakePHP가 쿼리문을 읽어오는 방법이다. 이제 어떤 제품을 찾고 뷰를 위한 결과를 배열로 저장해 보자. 뷰는 텍스트 필드에 타이핑을 시작할때 필드 아래쪽에 리스트 형태로 나오게 된다. 파일을 하나 만들어 보자(auto_complete.ctp)

  1. if(!empty($products)) {
    foreach($products as $product) {
    echo $product['Product']['name'].'|'.$product['Product']['id'].'^';
    }
    } else {
    echo 'No results';
    }

위 코드는 제품 배열을 풀어서 제품명과 제품 아이디 형태로 분류해서 보여주는 코드이다. 물론 배열이 비어 있다면 아무런 결과 값이 없기 때문에 "No results"라는 메시지를 뿌리게 된다. 위에 설명했던 ^ 문자를 기억하는가? 여기 코드에 보면 각 제품명과 제품 아이디를 출력하고 다음 제품으로 넘어갈 때 ^문자를 기준으로 구분을 한다.

 

자. 여기까지가 전부다. 복사해서 붙여넣기 기능을 이용하면 빠르게 결과를 볼 수 있고 수정도 가능하다. 아마 20분 이내에 가능할 것이다.물론 자바스크립트의 경고창보다는 더 나은 방식으로 나오길 원할것이다.

글은 스프링노트에서 작성되었습니다.

원문 - http://phpimpact.wordpress.com/2008/09/23/wildflower-a-cakephp-and-jquery-content-management-system/

Wildflower는 멋진 UI, 간단한 사용자 관리, 파일 관리를 위해 필요한 도구를 제공하는 웹 콘텐츠 관리 프로그램이다. CMS 에서 기대되는 표준 컴포넌트를 얻을 수 있다:

  • 관리된 페이지 콘텐츠
  • 카테고리와 코멘트 기능이 있는 블로그
  • 메시지 아카이브를 이용한 연락 폼
  • 파일 관리자
  • 사용자 계정

글로 아무리 자세히 설명하는 것보다 사진 한장(스크린샷)으로 보는 것이 낫다.

Links

 

이 글은 스프링노트에서 작성되었습니다.

개인적인 공부를 목적으로 번역한 글이며 오역이 많이 있을 수 있습니다. 또한 번역 내용에 존칭은 생략했습니다.

원문 : http://teknoid.wordpress.com/2008/10/08/demystifying-auth-features-in-cakephp-12/

이 글은 최근에 올렸던 퓨토리얼에(일반적인 인증 컴포넌트 기술이 아닌 예제를 몇개 포함하고 있던) 이어지는 글이다. 이 글에서는 이전에 올렸던 글에서 언급했던 것들보다 깊이 있게 알아보도록 하자.

 

다시 app_controller.php 를 살펴보도록 하자:

  1. class AppController extends Controller {
  2. var $components = array('Auth');
  3. function beforeFilter() {
  4. $this->Auth->allow('display');
  5. $this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index');
  6. }
  7. }

 

$this->Auth->allow('display'); 는 Auth 컴포넌트에 'display'라는 특정 액션에 대해 접근을 허락하라고 말한다. 이 액션은 Cake 의 코어에서 찾을 수 있는 Pages 콘트롤러의 일부분이다. 이 콘트롤러의 주요 목적은 정적 페이지들을 다루는 것이다. 실제 어떻게 작동하는지 살펴보려면 API를 살펴볼 수 있다. 하지만 한가지 명심해야 것은 'display'라는 액션이 정적 페이지들을 보여주는데 사용된다는 것이다. 만약 기본으로 허락되지 않으면 Auth는 홈페이지의 'About us' 페이지 같은 곳에 접근할 수 없게 할 것이다. 많은 경우 이것은 권장되지 않는 것이다.

$this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index'); 는 Auth 컴포넌트에 로그인 한 후에 사용자를 어디로 리다이렉팅 시켜줄지 말해준다. 기본으로 Auth는 사이트의 메인페이지로 리다이렉팅 되도록 설정되어 있다.

 

다음으로, Users 콘트롤러에서 아래 부분을 유의해서 살펴보자 :

  1. if($this->action == 'add') {
  2. $this->Auth->authenticate = $this->User;
  3. }

 

$this->Auth->authenticate = $this->User; 는 Auth 컴포넌트에 hashPasswords()에 의해 제어되던 것을 오버라이딩하기 위해 User 모델 오브젝트를 사용해야 한다고 알려준다. 다시 말하면, 만약 $this->User 오브젝트에 hashPasswords() 메서드가 있으면 이것은 Auth 콘트롤러에 있는 hashPasswords() 메서드를 대신해서 사용이 된다는 의미이다. 예제에서 보는 것 처럼 이 오버라이딩은 'add' 액션에만 적용이 된다.

 

왜 이렇게 번거롭게 하는가?

 

글쎄, Auth 컴포넌트는 검증에 들어가기 전에 비밀번호를 암호화 한다는 점을 기억할 필요가 있다. 이것은 몇가지 문제를 발생시킨다. 먼저 검증 메서드가 사용자가 입력한 실제 값이 아닌 암호화된 값을(항상 길고 비어 있지 않은) 받아오기 때문에 'minLength' 와 'notEmpty' 규칙을 정확하게 적용할 수가 없다. 두번째로 만약 폼에 에러가 있다면 암호화된 값은 password 필드를 다시 차지하게 될 것이다.

 

By User 모델에 간단한 오버라이드를 만들어 줌으로 인해 작은 문제들을 피해갈 수 있다.

  1. function hashPasswords($data, $enforce=false) {

    if($enforce && isset($this->data[$this->alias]['password'])) {

    if(!empty($this->data[$this->alias]['password'])) {

    $this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);

    }

    }

    return $data;

    }

  2.  

    function beforeSave() {

    $this->hashPasswords(null, true);

    return true;

    }

 

이익은 간단하지만 가치는 있다.:

  • 뷰를 만들때 폼 필드명이 모델이나 콘트롤러에 어떤 영향을 미칠지에 대해서 고민할 필요가 없다.
  • 검증 규칙을 적용하기 위해 'password' 필드를('passwd' 같은 다른 필드명으로 하지 않아도 된다.) 사용할 수 있다.
  • 폼 에러가 발생했을때 'password' 필드가 정리된다는 것을 믿지 않는다. 또한 'password' 를 다시 타이핑하도록 함으로 인해 'email' 필드에 실수를 한 사람을 탓할 순 없다.(?)
  • 가상 'password' 필드를 재설정/해제를 위해 콘트롤러에 코드를 추가할 필요가 없다.

코드를 설명하기 위해 hashPasswords()는 beforeSave() 에 true 로 설정될 $enforce 플래그가 'true'로 설정되지 않는 한 암호화를 수행하지 않을 것이다.

 

아무쪼록 도움이 되었기를 바라며 Auth에 대한 더 많은 트윅이 나왔으면 좋겠다.(Hopefully this clarifies some things and gives you some more ideas for the further tweaking of Auth…)

이 글은 스프링노트에서 작성되었습니다.

cakePHP를 사용하기 시작한지 얼마되지 않았지만 모델의 연관을 통한 강력한 기능은 아주 매력적이라는 생각을 하게 된다. 사실 MVC 패턴이라고 해서 생소한 환경으로 갈아탄것도 아직 적응이 다 되었다고 하기에는 조금 무리가 있다. 암튼 오늘은 cakePHP를 학습하면서 알게 된 간단한 팁을 올리도록 하겠다.

generateList()는 모델 사이의 연관이 정의되어 있는 경우(A라는 모델과 B라는 모델이 belongsTo 라는 연관으로 묶여 있는 상태에서) 외래키를 보고 대상이 되는 모델의 리스트를 뽑아와서 셀렉트 박스 형태로 뿌려 줄 때 유용합니다.(이런 조금 헷갈리네요.) 책을 새로 등록할때 책을 쓴 저자명을 등록하는데 저자명을 셀렉트 박스 형태로 뿌리고 싶은 경우입니다. 그런데 설명에 나와있는대로 하니까 에러가 나옵니다.

구글링해서 찾은 정보입니다. find('all') 보다 find('list') 형태로 받아와야 작동을 한다라고 되어 있는데요. /app/app_model.php 라는 파일을 만들고 아래 함수를 추가해 주면 됩니다.

<?php
class AppModel extends Model {
function getlist ($cond=null,$order=null,$limit=null,$key=null,$val=null) {
    return $this->find("list",array(
        'conditions' => $cond,
        'order' => $order,
        'limit' => $limit,
        'fields' => array(str_replace('{n}.','',$key), str_replace('{n}.','',$val))
    ));
}
}
?>

이제 generateList() 대신 getlist() 라고 사용하시면 됩니다. 이때 코딩 형식은

getlist(null, null, null, '{n}.ModelName.key', '{n}.ModelName.value');

위와 같이 해주시면 됩니다. 1.2메뉴얼에 설명이 되어 있군요....^^