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

2014.07.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에서 확인하실 수 있습니다.


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

TAG , ,
  1. Dr.A 2014.08.07 17:51 신고  댓글주소  수정/삭제  댓글쓰기

    글쓰기 2단계는 없나영? ㅠㅡㅠ 글등록이안되네영 ㅠ

  2. Dr.A 2014.08.07 18:05 신고  댓글주소  수정/삭제  댓글쓰기

    그러시구나 ㅠ 네 자주자주 들어와서 확인할께요~ 정보들 많아서 읽을게많네요^^

    • Kurien 2014.08.07 18:05 신고  댓글주소  수정/삭제

      감사합니다^^ 자주자주 들러주시고 어려운 점 있으시면 댓글 달아주세요!
      이렇게 최대한 바로바로 댓글 답변하고있어요 ㅎㅎ

  3. ㄱㄴㄷ 2014.08.14 14:43 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다. PHP 는 처음 배우고 있어, 도움 많이 얻고 있습니다. 다음 글이 기다려 집니다. 또 들리겠습니다. 꾸벅

  4. 따식이 2015.04.29 18:39 신고  댓글주소  수정/삭제  댓글쓰기

    이페이지의 라이트부분과 레이아웃부분을 소스를 옴겨서 실행을 하면 라이트페이지가 아무것도 나오지를 않는데 왜그런것인지 알고 싶습니다 로그인 안하고 페이지가 안보이는것인가염

    • Kurien 2015.04.29 20:23 신고  댓글주소  수정/삭제

      첫 번째 글부터 읽으면서 수정하고 삭제해야 동작합니다.
      단순히 이 글에 있는 부분만 복사해서 쓰시면 실행 안됩니다.

  5. 따식이 2015.04.29 18:40 신고  댓글주소  수정/삭제  댓글쓰기

    라이트페이지랑 레이아웃소스를 넣고 파일을 실행해보면 아무것도 보이지를 않아서 문의를 올립니다

  6. 질문자 2016.06.28 14:29 신고  댓글주소  수정/삭제  댓글쓰기

    공부하고 있는 학생입니다. 웹페이지의 Layout.inc 파일에서 LayoutContent()부분에 최근에 만드신 게시판을 넣으려고 하는데 이해가 잘 안됍니다. 물론 최근 만든 게시판에서 함수 부분이 전송이 없어서 그런거 같은데 도움 주셨으면 좋겟습니다 ㅠㅠ

    • Kurien 2016.06.29 09:01 신고  댓글주소  수정/삭제

      지금 보고 계신 홈페이지 제작은 Class를 이용한 방식이고, 게시판은 순차적인 방식이라 두 부분을 모두 공부하지 않는 이상 합쳐서 쓰시긴 힘들 수 있습니다.

      차라리 게시판을 먼저 수정 하시고, include를 사용하는 방식으로 제작하시는 편이 쉬울꺼라고 생각합니다.

  7. 배대웅 2016.07.02 23:29 신고  댓글주소  수정/삭제  댓글쓰기

    <div>카테고리
    <select name='category'>
    ".$pmenu."
    </select></div>
    정상적으로 출력되지 않고

    <option value='?tn=중1'>중1</option> 이런식으로 나오네요.

    ?tn을 어떻게 빼야 하나요?
    layout.inc에서 ?tn을 삭제하면 사이드바의 링크가 걸리지 않더군요.

    • Kurien 2016.07.02 23:44 신고  댓글주소  수정/삭제

      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."

      ?tn=$value는 위의 코드에 들어가야 하는 부분입니다.
      $pmenu에는 tn이 들어갈 필요가 없어요.

  8. 배대웅 2016.07.03 07:48 신고  댓글주소  수정/삭제  댓글쓰기

    고맙습니다.

  9. 콤이 2017.07.17 17:22 신고  댓글주소  수정/삭제  댓글쓰기

    질문드릴 것이 있어 이렇게 댓글 드립니다~
    관리자 계정을 생성하려면 어떻게 해야하나요~?
    단순한 것일지도 모르겠지만, 분야에 무지하다보니...
    답변 부탁드립니다~~

  10. 콤이 2017.07.17 18:07 신고  댓글주소  수정/삭제  댓글쓰기

    앗, 해결 했습니다^^ 에구 부족한지라 많이 헤매이네요;; 좋은 자료 공유에 정말 감사드립니다~