8. PHP 홈페이지 만들기 프로그램 글쓰기 1

2014. 7. 19. 22:56
저자 : Kurien







오늘은 프로그램 메뉴에서 글쓰기 부분을 만들어 보겠습니다.

먼저 사이드 바에 글쓰기와 관리자 메뉴를 나타나게 할껀데요.

프로그램 메뉴 부분은 관리자만 접근할 수 있도록 하기 위해서 $_SESSION['permit']이 3, 즉 관리자일때만 사용 가능하도록 하겠습니다.


먼저 사이드바는 layout.inc에 있으므로 수정을 해야합니다.


/layout.inc


<?php

// 세션을 시작합니다.

// 이후에 사용 할 로그인 용.

session_start();

ini_set("session.gc_maxlifetime", 3600);


if(!isset($_SESSION['id']) && isset($_SESSION['permit']) )

{

echo "<script>location.replace('/logout.php');</script>";

}

// class를 이용한 객체 지향 방식

class Layout

{

public $title="Need Programs"; // 웹 페이지 제목

private $menu = array('Board'=>'board', 'Programs'=>'programs', 'Notice'=>'notice');

public $pmenu = array('최신'=>'latest', '가상OS'=>'virtual', '관리'=>'manage', '동영상'=>'video', '드라이버'=>'driver', '문서'=>'document', '압축'=>'press','이미지'=>'image', '백신'=>'vaccine', '음악'=>'music', '웹 브라우저'=>'web', '파일 공유'=>'p2p', '프로그래밍'=>'programing', 'FTP'=>'ftp');

public $bmenu = array('최신'=>'latest', '자유게시판'=>'press');

public $link; // CSS 링크 태그

public $style; // 스타일 적용 

public $content; // 메인 컨텐츠

public $board; //게시판 이름 지정

private $sub; // 서브 메뉴용 변수

private $login; // 로그인이나 로그아웃을 출력


// 레이아웃을 출력

public function LayoutMain()

{

echo $this->ThisBoard(); // 현재 게시판의 이름을 확인

echo "<!DOCTYPE html>\n<html lang='ko'>";

echo "<head>\n<meta charset='utf-8'/>";

echo "<title>".$this->title."</title>";

echo $this->LayoutStyle(); // 스타일을 레이아웃에 추가.

echo "</head>\n<body>\n<div id='container'>";

echo $this->LayoutHeader(); // 헤더 부분을 레이아웃에 추가

echo $this->LayoutContent(); // 컨텐츠 부분을 레이아웃에 추가

echo $this->LayoutSide(); // 사이드 부분을 레이아웃에 추가

echo $this->LayoutFooter(); // 푸터 부분을 레이아웃에 추가

echo "</div></body>\n</html>";

}

// 현재 게시판의 이름을 확인

public function ThisBoard()

{

$this->board = explode('/', $_SERVER['PHP_SELF']);

}

// 스타일을 추가

public function LayoutStyle()

{

echo "<link rel='stylesheet' type='text/css' href='".$this->link."'/> ";

echo "<style>".$this->style."</style>";

}

// 헤더 부분 추가

public function LayoutHeader()

{

$this->LayoutLogin();

echo "<header>

<div id='logo'><h1><a href='/'>Need Programs</a></h1></div>

<div id='navset'>

<nav id='menu'>

";

$this->LayoutMenu($this->menu, 0); // $menu 배열을 이용해서 메뉴 부분을 호출

echo " </nav>

<nav id='login'>".$this->login."</nav>

</div>

<div class='ad_1'>

<script async src=\"//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\"></script>

<!-- Speeds_728x90 -->

<ins class=\"adsbygoogle\"

style=\"display:inline-block;width:728px;height:90px\"

data-ad-client=\"ca-pub-4805042826277102\"

data-ad-slot=\"7788772676\"></ins>

<script>

(adsbygoogle = window.adsbygoogle || []).push({});

</script>

</div>

</header>";

}

public function LayoutMenu($menu, $side) // 배열과 <li> 을 이용해서 메뉴 부분을 호출

{

while (list($key, $value) = each($menu))

{

$this->ThisMenu($key, $value, $side);

        }

}

public function ThisMenu($key, $value ,$side)

{

if($side=='1')

{

if(strpos($_SERVER['REQUEST_URI'], $value)==false)

{

$thismenu = $thismenu."<li><a href='./?tn=".$value."'>".$key."</a></li>";

} else

{

$thismenu = $thismenu."<li><b style='border-bottom:4px solid #90bbff;'>".$key."</b></li>";

}

} else

{

if(strpos($_SERVER['PHP_SELF'], $value)==false)

{

$thismenu = $thismenu."<li><a href='/".$value."'>".$key."</a></li>";

} else

{

$thismenu = $thismenu."<li><b style='border-bottom:4px solid #90bbff;'>".$key."</b></li>";

}

}

echo $thismenu;

}

public function LayoutLogin()

{

if($_SESSION['id']=="")

{

if(strpos($_SERVER['PHP_SELF'], "login.php"))

{

$this->login="<b style='border-bottom:3px solid #90bbff;'>Login</b>";

} else

{

$this->login="<a href='/login.php'>Login</a>";

}

} else

{

$this->login="<a href='/logout.php'>Logout</a>";

}

}

// 내용을 추가

public function LayoutContent()

{

echo "<section><article>".$this->content."</article>";

}

// 사이드바 추가

public function SideMenu()

{

$this->board=explode('/', $_SERVER['PHP_SELF']);

switch($this->board[1])

{

case notice : 

echo "<h3 style='margin: 5px 0 10px 0;text-align:center;'><a href='./'>공지사항</a></h3>";

if($_SESSION['permit']==3)

{

echo "<div style='margin-top:20px;text-align:center;padding:15px;border:1px solid #ddd;'><a href='../write.php?bn=".$this->board[1]."' style='padding:20px;'>글쓰기</a> <a href='../admin.php' style='padding:20px;'>관리</a></div>";

}

break;


case programs : 

echo "<h3 style='margin: 5px 0 10px 0;text-align:center;'><a href='./'>프로그램</a></h3>";

$this->LayoutMenu($this->pmenu, 1);

if($_SESSION['permit']==3)

{

echo "<div style='margin-top:20px;text-align:center;padding:15px;border:1px solid #ddd;'><a href='../write.php?bn=".$this->board[1]."' style='padding:20px;'>글쓰기</a> <a href='../admin.php' style='padding:20px;'>관리</a></div>";

}

break;


case board : 

echo "<h3 style='margin: 5px 0 10px 0;text-align:center;'><a href='./'>게시판</a></h3>";

$this->LayoutMenu($this->bmenu, 1);

break;


default : 

if(isset($_SESSION['id']) && isset($_SESSION['permit']))

{

echo "<div style='margin-top:20px;text-align:center;padding:15px;border:1px solid #ddd;'><b style='padding:20px;'>";

switch($_SESSION['permit'])

{

case 1 : echo "일반회원";

break;

case 2 : echo "특별회원";

break;

case 3 : echo "관리자";

break;

}

echo "</b><b style='padding:20px;'>".$_SESSION['id']."</b></div>";

}

}

}

public function LayoutSide()

{

echo "<aside>";

$this->SideMenu();

echo "</aside></section>";

}

// 푸터 부분 추가

public function LayoutFooter()

{

echo "<footer>Copyright © Kurien. All rights reserved. Need Programs</footer>";

}

}

?>


위의 코드에서 빨간 부분이 공지사항과 프로그램 메뉴에 나타낼 글쓰기, 관리자 메뉴입니다.

이 두 가지는 모두 관리자만 접근할 수 있어야 하는 영역이기 때문에 비슷하게 만들었습니다.


그리고 파란색 부분이 있는데, 이 부분은 딱히 적을게 없는 사이드바에 본인 아이디와 등급별로 출력되게 만들었습니다.



이 다음은 이 부분과 연결 될 ../write.php를 만들어야겠네요.

공용으로 사용하기 위해서 이 write.php는 최상위 폴더에 만들었습니다.


/write.php


<?php

require_once "./layout.inc"; // 레이아웃을 include 함 


$base = new Layout; // Layout class 객체를 생성

$base->link='./style.css'; // 임시 스타일 추가


$bn=$_GET['bn'];


if(($bn == 'notice' || $bn == 'programs') && $_SESSION['permit']!=3)

{

header("Content-Type: text/html; charset=UTF-8");

echo "<script>alert('접근할 수 없습니다.');history.back('/')</script>";

exit;

}


//프로그램 부분

else if($bn=='programs') 

{

while (list($key, $value) = each($base->pmenu))

{

if($key!='최신')

{

$pmenu = $pmenu."<option value='".$value."'>".$key."</option>";

}

}


$base->content="

<form action='./writing.php' method='post' enctype='multipart/form-data'>

<div>

<input type='hidden' name='MAX_FILE_SIZE' value='5000000' />

<input type='hidden' name='bn' value='".$bn."' />

<div>제목 <input type='text' name='title' size='80'/></div>

<div>카테고리

<select name='category'>

".$pmenu."

</select></div>

<div>지원 OS

<input type='checkbox' name='os1' value='WinXP'/>WinXP

<input type='checkbox' name='os2' value='WinVIsta'/>WinVista

<input type='checkbox' name='os3' value='Win7'/>Win7

<input type='checkbox' name='os4' value='Win8'/>Win8

<input type='checkbox' name='os5' value='Wine'/>Wine

<input type='checkbox' name='os6' value='Linux'/>Linux

<input type='checkbox' name='os7' value='Mac'/>Mac</div>

<div>한국어 지원 <input type='radio' name='kr' value='O'/>O<input type='radio' name='kr' value='X'/>X</div>

<div>라이센스

<select name='licence'>

<option value='1'>페이웨어 : 개인, 기업 유료</option>

<option value='2'>부분적 프리웨어 : 개인 무료, 기업 유료</option>

<option value='3'>프리웨어 : 개인, 기업 무료</option>

<option value='4'>쉐어웨어 : 일정기간 이후 유료</option>

<option value='5'>부분적 쉐어웨어 : 개인 메일 인증 시 무료, 기업 유료</option>

</select>

</div>

<div>링크 <input type='text' name='link' size='50'/></div>

<div><input type='file' name='userfile' id='userfile'/></div>

<div><textarea name='content' cols='90' rows='20'></textarea></div>

<input type='submit' value='글쓰기'/>

</div>

</form>

";

}


$base->LayoutMain(); //위의 변수들이 입력된 객체를 출력

?>


write.php는 현재 관리자인 저만 볼 수 있기 때문에 따로 디자인은 아직 하지 않았습니다.

단순히 div만 사용해서 기능만 사용할 수 있게 해뒀습니다.


먼저 빨간색 부분부터 보겠습니다.

$bn은 메뉴 이름을 나타내는데요.

layout.inc를 보시면 글쓰기 하이퍼링크에 write.php?bn=programs와 같이 적혀있을텐데,

이처럼 bn을 통해서 어떤 게시판에 글을 적는 것인지 알 수 있게 해줬습니다.


그 다음 if문을 보시면 $bn이 notice(공지사항)이나 programs(프로그램)이고,

permit이 3이 아니라면 접근할 수 없다는 메시지와 함께 이전 화면으로 넘어갑니다.


프로그램 부분이라고 적힌 파란 부분으로 넘어갑니다.

else if로 $bn이 programs일 때만 적용되는 코드입니다.


while문으로 $base->pmenu의 코드를 반복하는데, 그 아래 보시면 if문이 있죠?

조건이 $key가 최신이 아닐 때입니다.

그러므로 최신이 아닌 모든 메뉴를 나타내주는데, $pmenu라는 변수에 중복 저장합니다.


반복문이 돌고 나면 $pmenu에는 아래와 같이 코드가 입력됩니다.


<option value='music'>음악</option><option value='video'>비디오</option>...


위의 코드는 예시일 뿐, 순서는 다를 수 있습니다.

이와같이 $pmenu가 작성 된 후에는 바로 $base->content네요.


<form>을 사용하는데, 이전과 다르게 enctype란게 생겼습니다.

이건 프로그램을 업로드 할 때 쓰이는 것으로 파일을 전송할 때는 적어줘야합니다.


그 아래 있는 input중에 name이 MAX_FILE_SIZE란게 있는데, 이건 업로드 가능한 최대 용량을 나타냅니다.

여기서 value 값인 5000000는 5MB를 나타냅니다.


name이 bn인 것은 writing.php에서도 $bn이 필요한데, 어짜피 넘길거라면 post로 넘기는게 깔끔할 것 같아서 hidden을 줬습니다.

그 아래로 제목, 카테고리, 지원 OS, 한국어 지원, 라이센스, 링크, 파일 업로드, 컨텐츠 등 여러가지가 있고 write는 끝납니다.


딱히 이전과 크게 다를게 없는게 많네요.

여기서 중요한건 파일 업로드 부분입니다.

writing 부분은 상당히 복잡해지므로 name이 어떤게 있었는지 알아보고 넘어가세요!



글이 길어져서 나눠서 적겠습니다.

그리고 사이트를 구경해보실 분은 http://kurien.speeds.kr에서 확인하실 수 있습니다.


궁금한점은 댓글에 남겨주세요.