만들면서 배우는 CodeIgniter Q&A

제목 131쪽 입력 부분에서요....
글쓴이 vvshinevv 작성시각 2016/08/02 20:44:50
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 13485   RSS

안녕하세요

131쪽에서 write_v.php 내용을 쭉 테스트하다가 

	<script type="text/javascript">
		$(document).ready(function() {
			$("#write_btn").click(function() {
				if($("#input01").val() == '') {
					swal('제목을 입력해주세요.');
					$("#input01").focus();
					return false;
				} else if($("#input02").val() == '') {
					swal('내용을 입력해주세요.');
					$("#input02").focus();
					return false;
				} else {
					$("#write_action").submit();
				}
			});
		});
	</script>
	<article id="board_area">
		<header>
			<h1></h1>
		</header>
		
		<form class="form-horizontal" method="post" action="" id="write_action">
			<fieldset>
				<legend>게시물 쓰기</legend>
				<div class="control-group">
					<label class="control-labe" for="input01">제목</label>
					<div class="controls">
						<input type="text" class="input-xlarge" id="input01" name="subject">
						<p class="help-block">게시물의 제목을 써주세요.</p>
					</div>
					<label class="control-labe" for="input01">내용</label>
					<div class="controls">
						<textarea class="input-xlarge" id="input02" name="contents" rows="5"></textarea>
						<p class="help-block">게시물의 내용을 써주세요.</p>
					</div>

					<div class="form-actions">
						<button type="submit" class="btn btn-primary" id="write_btn">작성</button>
						<button class="btn" onclick="document.location.reload()">취소</button>
					</div>
				</div>
			</fieldset>
		</form>
	</article>

여기서 제가 취소 버튼을 누르면 자꾸만 '비 정상적인 접근'입니다. 라고 되는데... controller의 $_POST 분기점에서 엇나가는 거 같은데.. 왜 이런거죠??

 

아랜 controller 코드입니다.

public function modify() {
		echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>';
		echo "<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/sweetalert2/4.0.16/sweetalert2.min.css\">";

		if($_POST) {
			//글 수정 POST 전송 시

			$this->load->helper('alert');

			$uri_array = $this->segment_explode($this->uri->uri_string());

			if(in_array('page', $uri_array)) {
				$pages = urldecode($this->url_explode($uri_array, 'page'));
			}
			else {
				$pages = 1;
			}

			if(!$this->input->post('subject', TRUE) AND !$this->input->post('contents', TRUE)) {
				alert('비정상적인 접근입니다.', 'todo/index.php/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
				exit;
			}

			$modify_data = array(
				'table'=>$this->uri->segment(3),
				'board_id'=>$this->uri->segment(5), 
				'subject'=>$this->input->post('subject', TRUE),
				'contents'=>$this->input->post('contents', TRUE)
				);

			$result = $this->board_m->modify_board($modify_data);

			if($result) {
				swal('수정되었습니다.', '/todo/index.php/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
				exit;
			}
			else {
				alert('다시 수정해 주세요.', '/todo/index.php/board/view/'.$this->uri->segment(3).'/board_id/'.$this->uri->segment(5).'/page/'.$pages);
				exit;
			}
		}
		else {
			$data['views'] = $this->board_m->get_view($this->uri->segment(3), $this->uri->segment(5));
			$this->load->view('board/modify_v', $data);
		}
	}

 

아 그리고 마지막 질문으로 제가 

https://limonte.github.io/sweetalert2/ << 여기 링크에서 alert를 이것으로 쓰고싶은데

write_v 파일에서 

	<script type="text/javascript">
		$(document).ready(function() {
			$("#write_btn").click(function() {
				if($("#input01").val() == '') {
					swal('제목을 입력해주세요.');
					$("#input01").focus();
					return false;
				} else if($("#input02").val() == '') {
					swal('내용을 입력해주세요.');
					$("#input02").focus();
					return false;
				} else {
					$("#write_action").submit();
				}
			});
		});
	</script>

요런식으로 swal함수를 쓰면 제대로 먹히는데

controller나 그 alert_helper에서 쓰면 swal이 정의되어있지 않은 함수라고 에러가 뜨더라고요...

작성이 성공하면 swal함수를 이용해서 alert화면을 뿌려주고 싶은데 어떤식으로 해야 좋을까요???

 다음글 ubuntu16.04에 nginx + php7.0-fp... (2)
 이전글 Chapter4 게시판 프로젝트 bootstrap.cs... (3)

댓글

변종원(웅파) / 2016/08/03 11:51:06 / 추천 1

컨트롤러에서 $this->input->post('subject', TRUE)와 $this->input->post('contents', TRUE) 를 echo로 출력해보세요.

둘중 하나 내용이 없어서 나오는 메세지입니다.

컨트롤러에서 swal 함수를 사용하시려면 helper로 등록해서 사용하셔야 합니다. 

helper/alert_helper.php 열어보시고 참고해서 작업하세요.

vvshinevv / 2016/08/04 15:34:26 / 추천 0

답변 정말정말 감사드립니다.

ㅜㅜ웅파님 둘다찍어봤는데 결과는 둘다나오는데...

취소버튼을 누르면 reload할때 페이지가 reload되는 개념아닌가용? 새로고침처럼 근데 비정상적인 접근입니다라는 것은 

if($_post)안으로 들어간게 아닌가용..? 취소 누르면 if($_POST)안으로 들어가는게 아니라 else로 넘어가야되는부분아닌가용??

 

그리고 swal을 helper로 등록하라는게... 

swal은 css와 js파일로만 구성이 되었는데 이걸 함수로 하라는 말씀이 

helper문서 안에서 alert 대신 swal로 쓰란말씀아닌가용?? 그렇게 햇는데도 안되어서...

ㅜㅜㅜ.. 뭐가 문제인지 모르겠습니다. ㅜㅜ 

 

변종원(웅파) / 2016/08/04 16:52:50 / 추천 1

취소버튼을 눌렀을때 그렇게 된다는 말씀인가요? 그럼 form 전송이 된다는 이야기입니다. 

책하고 소스를 다시 비교해보세요.

 

두번째. 말씀하신 것처럼 작업하셔야 합니다. 저는 어떻게 한다라는 길을 제시해드리는 역할입니다.

헬퍼는 기존 php에서 함수와 역할이 같습니다.

해보시고 안되는 에러메세지를 올려보세요.

vvshinevv / 2016/08/04 23:14:04 / 추천 0

안녕하세요 웅파님 답변 정말정말 감사드립니다.

다름이아니라 제가 2번째 문제에서 계속 헤매고있어서요 ㅜㅜ

여기가

views/header_v.php 파일이거든요

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"/>
	<meta name="apple-mobile-web-app-capable" content="yes">
	<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
	<title>CodeIgniter</title>
	<!--<script type="text/javascript" src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>-->
	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
	<link rel="stylesheet" href="https://cdn.jsdelivr.net/sweetalert2/4.0.16/sweetalert2.min.css">

	<script type="text/javascript">
		$(document).ready(function() {
			$("#search_btn").click( function(){
				if($("#q").val() == '') {
					swal('검색어를 입력하세요.');
					return false;
				} else { 
					var act = '/todo/index.php/board/lists/ci_board/q/'+$("#q").val()+'/page/1';
					$("#bd_search").attr('action', act).submit();
				}
			});
		});

		function board_search_enter(form) {
			var keycode = window.event.keyCode;
			if(keycode == 13) $("#search_btn").click();
		}
	</script>

보시다시피 cdn방식으로 11번째 줄에 sweetalert2를 링크를 걸었고 밑에보시면 <script>내용 부분에 swal()요 함수가 제대로 작동하는 것까지는 성공을 했는데

 

제가 원하는게 controll에서 swal함수를 쓰고 싶은건데 웅파님께서 helper을 사용하라고 하셨잖아요

그래서 

helpers/alert_helper.php파일을 보시면

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

function alert($msg='이동합니다', $url='') {
	$CI =& get_instance();
	echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=".$CI->config->item('charset')."\">";
	echo "<link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/sweetalert2/4.0.16/sweetalert2.min.css\">";

	echo "
		<script type='text/javascript'>
			swal('".$msg."').then(function() {
				location.replace('".$url."');
			});
			
		</script>
		";
	exit;
}

... 생략

요런식으로 작성을 했어요

 

그리고 요게

controller/board.php 파일 내에 write() 함수입니다.

public function write() {

		//폼 검증 라이브러리 로드
		$this->load->library('form_validation');

		//폼 검증할 필드와 규칙 사전 정의
		$this->form_validation->set_rules('subject', '제목', 'required');
		$this->form_validation->set_rules('contents', '내용', 'required');


		echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>';
		if( $this->form_validation->run() == TRUE ) {
			$this->load->helper('alert');

			$uri_array = $this->segment_explode($this->uri->uri_string());

			if(in_array('page', $uri_array)) {
				$pages = urldecode($this->url_explode($uri_array, 'page'));
			}
			else {
				$pages = 1;
			}

			// if(!$this->input->post('subject', TRUE) AND !$this->input->post('contents', TRUE)) {
			// 	alert('비정상적인 접근 입니다.', '/todo/index.php/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
			// 	exit;
			// }

			$write_data = array(
				'subject' => $this->input->post('subject', TRUE),
				'contents' => $this->input->post('contents', TRUE),
				'table' => $this->uri->segment(3)
				);

			$result = $this->board_m->insert_board($write_data);

			if($result) {
				//글 작성 성공 시 게시물 목록으로
				alert('입력되었습니다.', '/todo/index.php/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
				exit;
			}
			else {
				//글 실패 시 게시물 목록으로
				alert('다시 입력해 주세요.', '/todo/index.php/board/lists/'.$this->uri->segment(3).'/page/'.$pages);
				exit;
			}
		}	
		else {
			$this->load->view('board/write_v');
		}
	}

그런데

결과가 

요런식으로 나오게되네요...ㅜㅜ 

에러 내용은

(index):3 Uncaught ReferenceError: swal is not defined << 요것 입니다.ㅜㅜ

함수가 정의되어있지 않다고하는데... helper에서는 link된 부분을 인식하지 못하는 거같습니다. 그렇다면.. 다른 방법이 혹시 있을까요? 

어떤식으로 해야 해결이 될지 정말 답답해서 다시 답글 올립니다. 죄송합니다 자꾸 물어봐서 ㅜㅜ

 

변종원(웅파) / 2016/08/05 10:34:12 / 추천 0
헬퍼안에 css만 선언하고 js파일이 없네요
vvshinevv / 2016/08/05 15:14:01 / 추천 0

답변 감사합니다 웅파님..!! 

아직 학생이지만

책보면서 정말 많은걸 배우고있습니다!! 고맙습니다!!

막국수 / 2016/10/26 14:46:07 / 추천 1

이제 막 배우는 학생으로서 비슷한 문제로 고민을 많이 했는데요 이후에도 고민하시는 분들이 계실 것 같아 댓글답니다.

 

form안의 취소버튼을 눌렀을 때 if($_POST)가 작동하는 것 관련해서 찾아본 결과

<button>은 <form>안에서 type지정을 안할 시 default값으로 submit이 지정된다고 합니다.

취소버튼의 경우 책에서 따로 type지정을 안했으므로 submit으로 타입지정이 되고 array(2)가 $_POST로 전달이 된 것 같습니다.

저의 경우 type지정을 button으로 한뒤 location.reload()함수를 location.href로 바꿔서 해결 보았습니다.