MVC 구조
- 주말 군부대라고 생각하면 알기 쉬움.
컨트롤러: 당직사관. 상황 판단을 해서 작업을 하거나 준다. 근데 저 혼자서 할 수 있는 일이 거의 없어서 보통은 일단 모델부터 부르고 본다.
모델: 상황병. 필요한 변수를 컨트롤러에게 물어봐서 그거 갖고 자료 뽑은 다음 뷰를 차출해서 작업한다. 사실상 거의 모든 실무는 얘가 혼자 다 함.
뷰: 일반병력. 쪽수가 많다. 각종 물자(HTML JS CSS 등등)갖고 다니면서 모델이 뽑아준 자료 보고 컨트롤러가 시킨 삽질을 해놓는다.
codeigniter 세그먼트
- 밑줄친 세그먼트가 주로 $this->uri->segment(n) 꼴로 호출된다.
- 아 물론 자기가 일일이 섬세하게 routing을 해둔상태라면 할말음슴
0: CI가 깔린 루트폴더. 여기까지는 ㅈㄴ 퍼블릭경로임.
1: 지금 보고 있는 화면 담당 컨트롤러 이름. 앱 복제의 경우를 대비해 고정값으로 적지 않는다.
2: 지금 보고 있는 화면을 만드는 함수(메쏘드)명. list, view, write...
3: 그 함수가 받아야 할 변수. 주로 DB 내 테이블명이나 옵셋(리밋)값.
(2n+2): 그 함수에게 추가로 알려줘야 할 변수명. page, id...
(2n+3): 그 추가 파라미터에 담겨야 할 값. 주로 DB 테이블 내 필드명이나 입력값.
codeigniter 페이지네이션
- "UI를 만들어주는 것뿐".
Q. $config['per_page']에 7을 할당했더니 3페이지 주소 세그먼트에 3이 아니라 14가 뜬다. 근데 이 와중에 게시물들 자체는 에러 없이 잘 뜬다. 왜 이러나?
A. $config['use_page_numbers']가 기본값인 FALSE로 되어 있어서 그럴꺼다. CI 입장에서 페이지 변수는 기본적으로 그 페이지 맨 첫줄에 띄울 아이템의 id 숫자("index")다. 그러니까 너님의 설정대로라면 1페이지에는 id가 0인 자료부터 6인 자료까지가 나오고, 3페이지에는 id가 14인 아이템부터 20인 항목까지가 나올 것이다. 그게 ㅈㄴ 정상이다.
Q. 난 그게 싫다. 3페이지로 가는 링크의 페이지 세그먼트가 당연히 3이어야 되는 거 아니냐? 그렇게 하려면 어떡하면 되나?
A. 어쩌긴 뭐 어째 $config['use_page_numbers']에 TRUE 주고 ㅈ빠지게 로직 짜야지 뭐. 전체 자료를 아이디 내림차순으로 가져오되 (페이지세그먼트값)*$config['per_page']-1을 뒤끝으로, (뒤끝)-$config['per_page']+1을 앞끝으로 해서 가져오는 LIMIT 쿼리문을 작성해야 될 거다. 골치 아프면 하지 말든가.
jquery.AJAX()
- 기본 코드 얼개는 다음과 같다.
$('#폼전체id').submit(function(e){ ◀1
e.preventDefault(); ◀2
if (폼 전송 거부 조건) {
alert("이 폼은 전송 못하겠습니다.");
return false; ◀3
} else {
$('폼 서브밋 버튼').html('로딩중…').attr('disabled','disabled');
$.ajax({
type: 'POST', ◀4
url: '폼처리.php', ◀4
data: $(this).serialize(), ◀4
dataType: 'json' ◀5
}) ◀6
.done(function(data){ ◀7
alert(data['title']+"에 대한 정보를 찾았습니다."); ◀7
$('#받아온 데이터를 사용할 객체').html(data['author']+"이(가) 쓴 +"data['title']"+에 대한 상세정보입니다."); ◀7
$('#데이터 가지고 manipulate시킬 다른 객체').html(data['detail']); ◀7
$("아까 disabled 시켜놨던 폼 서브밋 버튼").html('새로 시작').removeAttr('disabled');
// 기타등등 하고 싶은 모든 작업
})
}) ◀6
.fail(function(){
alert("실패! 다시 시도해 주세요.");
$('아까 disabled 시켜놨던 폼 서브밋 버튼').html('재시도').removeAttr('disabled');
// 그밖에도 시키고 싶은 작업
});
return false; ◀8
}
});
- 이하 조금 창피할 정도로 디테일한 설명
1: 제이쿼리에 들어 있는 submit() 는 개이득 메쏘드. 4번 참조
2: 해당 폼 태그의 action 속성과 무관하게 이하의 코드를 작동시켜야 하므로 선택이 아닌 필수. 폼태그의 action="어쩌구" 부분을 통째로 생략하는 것이 여러모로 가장 안전.
3: 매우 기초적인 JS 상식인데 몰라서 고생한 부분. 아무 동작도 하지 말라고 지시하고 싶을 땐 십중팔구 리턴폴스가 답이다.
4: jQuery.AJAX() 메소드의 필수값들은 type, url, data. 나머지는 없으면 없는대로 돌아가는데 이 셋은 꼭 있어야 한다(애당초 폼전송을 기본으로 하는 API이므로 당연하다 하겠다). ajax 호출 조건이 폼전체의 submit 메소드 호출일 경우, 이 시점에서 $(this)는 곧 바로 그 폼 전체이므로, 'data'에는 그냥 $(this).serialize()를 부여하면 끝. (이걸 안 쓸 경우 json 형식으로 일일이 매핑해 줘야 함.{'title':$('#title').val(), 'author':$('#author').val(), …} 하는식 ㅋ)
5: 'datatype'은 안 되고 'dataType'이 됨. 'url'에 지정된 폼처리.php로부터 어떤 데이터가 반환되는가가 이후 .done()과 .fail() 그리고 여기 쓰지 않은 .all() 메소드의 판별 기준이기 때문에 여기에 부여되는 값은 사실 상당히 중요하다. 'dataType'에서 'json'을 지정했는데 php가 함수 맨끝에 echo() 를 돌려서 text를 뱉었을 경우에는 얄짤없이 .fail() 내부가 실행됨. ajax() 메쏘드의 진가는 json을 받아와서 처리 가능하다는 데 있다. 7번 참조
6: 기본 얼개가 $.ajax().done().fail(); 형태임. 이 부분에서 괜히 누구처럼 세미콜론 열심히 찍어서 에러 내지 않도록 한다.
7: 여기서 변수명 'data'를 다른 걸로 바꾸면 작동을 안 함. 코드 결벽증이 있지 않고서야 그냥 냅두자. 자료 참조 방법은 그냥 json 배열 참조랑 똑같음. 위 코드를 보고 어떻게 사용 가능한지 짐작해 보자. 개발자 도구의 response 부분을 들여다보는 것은 매우 도움이 된다.
8: ㅈㅅ 솔직히 나 이거 왜 넣었는지 모름 ㅋ if else로 에러 처리를 했는데 이도저도 아닌 상황에 아무것도 하지 말라고 걸어둔 건가... try catch로 바꿔야 되나... 에이 몰라
추가예정
'9 도저히 분류못함' 카테고리의 다른 글
iYUPTOGUN (0) | 2016.01.30 |
---|---|
그냥 생각을 해 봤는데 (0) | 2015.04.06 |
Noto Sans KR woff (2) | 2014.07.31 |
본의 아니게 (0) | 2014.01.16 |
스마트 재생목록 updated better (0) | 2014.01.02 |