20 Ekim 2012 Cumartesi

PHP ile Basit ve kullanışlı admin panel (yönetim paneli) yapımı


Evet arkadaşlar bu seferki yazımda daha önce Jquery tabs ile nasıl haber manşeti vitrin yapımını göstermiştim şimdiki yazımda ise bu haberleri admin panel ile nasıl değiştiririz sileriz ekleriz onu anlatacağım.
şimdi kodlama haritamızı şöyle bi gözümüzün önünde canlandıralım. daha iyisi bi kalem kağıt alıp. sıra ile yazalım.
ben ne zaman bir site yapsam bunu hep bir tiyatro oyunu olarak ele alırım.
oyuncular, konu mankenleri, mekanlar olarak düşünürüm. sizede bu yazımda öyle anlatacağım.
şimdi. kullanıcı giriş yapılmış sayfamız olan main.php sayfamızı kral olarak düşünelim.
main.php - kral (her şeye yetkisi var)
haber ekle/sil/düzenle
firma ekle/sil/düzenle (bu moduller kralın uşakları olsun kralın emirleri ile çalışan)
login.php (yani giriş sayfamızıda kralın tacı olsun. taçsız kralın hiç bir yetkisi olmaz)
1. adım krala tacı takma ( yani sitemize yönetici girişi yapma)
index.php sayfamızın içeriği buradadır.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?
session_start(); //php sezonlar ile kullanicinin giris yapip yapmadigini anlar buna gore tekrar giris yapmasina gerek varmi yokmu ona bakar gerek yok ise gerekli sayfaya yonlendirir
error_reporting(1); //sayfamizda hatalari gostersin mi gostermesinmi onu ayarlariz. sitemizi gelistirme asamasinda bize çok yardımı olur. şimdilik 1 yani açık olsun
if($_SESSION["admin"] and $_COOKIE['cook']){
header("location:main.php");
//burada ise admin sezonu tanımlanmış ve  cook çerezi browser a atılmış ise yani giriş yapılmış ise main.php kralın sayfasına yönlendirme yapıyoruz.
} ?>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>admin giriş</title>
</head>
<body>
<form id="form1" name="form1" method="post" action="login.php">
  <p>
    <label>Username
      <input type="text" name="user" id="user" />
    </label>
  </p>
  <p>
    <label>Password
      <input type="text" name="pass" id="pass" />
    </label>
  </p>
  <p>
    <label>
      <input type="submit" name="button" id="button" value="Войти" />
    </label>
  </p>
</form>
<div><? if (isset($_GET['action']) && $_GET['action'] == 'error')
echo 'error'; //kullanıcı veya şifre hatalı ise bize error diye sayfaya yazacak.
?></div>
</body>
</html>
2. aşama giriş yapılan veriler doğrumu login.php ile ona bakacağız.
login.php sayfamızında içeriği burada.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?
$user = 0; //sql injectiondan kacmak icin basit bir yoldur bos bir kullanici adi vs de yollansa 0 a esitleriz ki . sonra htmlescape ile falan uğraşmayalım.
$pass1 = 0;
$user = $_POST['user'];// formdan gonderilen user verisi
$pass1 = $_POST['pass'];// formdan gonderilen pass verisi
if ( $user == "admin" and $pass1 == "123456")
//eger user admine pass da 123456 ya eşit ise aşağıdakileri yapacak.
{
   
ob_start();//buna kafa yormayın bu benim projenin gelecekte yapacağım bir şey si ile ilgili.
session_start();//sezonu başlatıyoruz.
include 'functions.php';// functions.php dosyamızdan  rasgele en az 10 en fazla 40 karakterli rakamlar oluşturacağız.
        $_SESSION["admin"] = $user; //admin sezonumuzu kullanıcı admıza ekledik.
     $ranx = genRandStr(10, 40) ;// bu degisken olusturduğumuz 40 karakterli rakam oldu
   
    setcookie("cook", $ranx, time()+3600); // ve cook isimli cereze o 40 karakterli rakamı atadık ve
header('location:main.php');// main kral ın sayfasına yönlendirme yaptık.
}
//eğer şifremiz vs hatalı ise index sayfamız geri dönüş yaptık.
else {
header('location:index.php?action=error');
}
?>
3. adım ise kralın sayfası emirler yağdıracağı tahtına oturtturduk kralımızı.
bu sayfa main.php
tabi kralımızın verdiği emirleri uşakların yapması gerekiyor bu nedenle uşaklara konuşmayı öğretmek zorundayız. uşaklar veri tabanı ile konuşacaklarki veritabanımızdaki bilgiler değişsin.
bunun için database e bağlanmaları lazım. bu bağlantı dosyamızda
dbb.php dir.
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$con = mysql_connect("localhost","root","");
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }
mysql_select_db("db", $con);
mysql_query("SET CHARACTER SET utf8"); //querylerizin karakter setleri
mysql_query("SET NAMES UTF8");// karşılaştırma karakteri tablo türü latin1 ama içeriği utf8 ise yukarıdaki 2 satır ile utf8 tipinde veriyi düzgün olarak göstermeye yarar.
?>
main.php içeriği.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?
session_start();
error_reporting(0);
if(!$_SESSION["admin"]){
header("location:login.php");
} ?>
<?php include 'head.php';?>
<?php
include_once ('dbb.php');
if(isset($_GET['module']) && file_exists('./'.$_GET['module'].'.php'))
{
   // include the module eg news.php
   include $_GET['module'] . '.php'; // eger uşaklara görev verilmişse gerekli modül olan uşağı çağırır
}
else {
        //yoksa haberler bölümünden hangi haberler var onu gösterir
        $habers = mysql_query("SELECT * FROM Habers");
       
        $habercount = mysql_query("select id FROM Habers
");
        $rows2 = mysql_num_rows($habercount);
        ?>
       
    Haber Sayısı : <? echo $rows2; ?>
       
        <table width="900" cellpadding="0" cellspacing="0"  style="border: 2px solid navy">
      <th colspan="3">Haberler</th> <tr>
    <td><table width="100%" border="0">
    <? while($row = mysql_fetch_array($habers))
   { ?>
 //alt taraftakiler  kısayoldan haber düzenle sil bölümüdür. modül içerisinden de halledilebilir.
 
  <tr  id="haberrow">
    <td  style="border-bottom:1px ridge #966;" width="52%"><?=$row['title']?></td>
    <td  style="border-bottom:1px ridge #966;" width="16%"><a href="main.php?module=newsduzenle&id=<?=$row['id']?>">Düzenle</a></td>
    <td   style="border-bottom:1px ridge #966;"width="17%"><a href="main.php?module=news&action=silmek&id=<?=$row['id']?>">Sil</a></td>
    <td  style="border-bottom:1px ridge #966;" width="15%"><? if($row['vitrin'] == 1) { echo '<span id="vitrin">Manşette</span>';echo '<br />';}if($row['yayin'] == 1) { echo '<span id="yayin"> Yayında</span>';}?></td>
  </tr>
 
<? } ?>
</table>
    </td>
  </tr>
</table>
       
       
       
       
<? }?>
<? include 'foot.php';?>
ve genel olarak panelimizin görüntüsü aşağıdaki gibi oldu.
\
sonraki adım yeni haber ekleme
haber içeriğini zengin içerikli yapmak için tinymce yi kullanacağız. zaten index.phpnin üst bölümü olan head.php içine gerekli kodları gömmüştüm. incelemenizi tavsiye ederim.
hem türkçe hem rusça içerik olacağı için bu projemde 2 tane textarea 2 tane text field vardır formda.ve haberin bir manşet büyük resmi birde haber linkine gidildiğinde gösterilecek olan ufak resmi vardır. haber yayında mı manşettemi seçenekleride haberi yayın ve/veya manşette olacak şekilde ayarlamamıza olanak sağlayacak.
genel görünüm ve sayfa kodları aşağıdadır.
\
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?
session_start();
if(!$_SESSION["admin"] or !$_COOKIE['cook']){
header("location:login.php");
} ?>
<?
include 'dbb.php';
   
   
    ?>
       
                <h3>Haber Ekle</h3>
<form action="main.php?module=news&action=newsekle" method="post" enctype="multipart/form-data" class="niceform">
        <fieldset>
        <legend>Титль</legend>
        <dl>
                <dt>
                  <label for="title">Русский:</label></dt>
            <dd><input type="text" name="title" size="80" maxlength="400" value="" /></dd>
        </dl>
        <dl>
                <dt>
                  <label for="turkcebaslik">Турецкий:</label></dt>
            <dd><input type="text" size="80" name="turkcebaslik" maxlength="400" value="" /></dd>
        </dl>
     
    </fieldset>
    <fieldset>
        <legend>Настройка
                </legend>
          <dt> </dt>
            <dd>
                <input type="checkbox" name="yayin" id="interestsNews" value="1" />
                <label for="interestsNews" class="opt">Опубликован</label>
                <input type="checkbox" name="vitrin" id="interestsSports" value="1" />
                <label for="interestsSports" class="opt">Витрина</label>
             
            </dd>
        </dl>
       
    </fieldset>
    <fieldset>
        <legend>Cодержание</legend>
        <dl>
 <dt>
            <label for="comments">Русский:</label></dt>
            <dd>
<textarea id="elm1" name="content" rows="15" cols="80" style="width: 60%">
               
                        </textarea>
          </dd>
          <dt>
           
      </dl>
      <dl>
 <dt>
            <label for="comments">Turkce Metin</label></dt>
            <dd>
<textarea id="elm2" name="turkcemetin" rows="15" cols="80" style="width: 60%">
               
                        </textarea>
          </dd>
           <dt>
           
      </dl>
        <dl>
                <dt>
                  <label for="upload">Большой рисунок (420 x 280):</label></dt>
            <dd><input type="file" name="bigresim" id="upload" /></dd>
        </dl>
  <dl>
          <dt>
            <label for="upload">Маленкий рисунок (200 x 200):</label></dt>
            <dd><input type="file" name="smallresim" id="upload" /></dd>
      </dl>
       
    </fieldset>
    <fieldset class="action">
        <input type="submit" name="submit" id="submit" value="Отправить" />
    </fieldset>
<input type="hidden" name="MAX_FILE_SIZE" value="300000000" />
</form>
bu formu gönder dediğimizde. news isimli uşağın adamlarına gönderir ve veritabanımızda nasıl değişiklik olacağını gösterir.
veritabanında değişikliği nasıl yapacağız?
kodlar açıklamalı olarak aşağıda.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?
session_start();
if(!$_SESSION["admin"] or !$_COOKIE['cook']){
//daha önce yazdığım gibi eğer sezon ve çerez yok ise login.php ye git.
//yani direk browsera  module=newsekle?action=sil&id=1 yazıldığında giriş yapılmamış ise querynin çalışmaması için gerekli olan koddur yukarıda yazılan.
header("location:login.php");
}
if(isset($_GET['action']))
{
   //eylem nedir eğer newsekle ile haber ekliyor newsduzenle ise haber düzenliyor news sil ise haber siler
    switch($_GET['action'])
    {
       
        case 'newsekle':
          //$id = $_GET['id'];
          include 'functions.php';
//print_r($_FILES);// formdan gönderilen dosyanın dizi verisidir kontrol amaçlı
//move_uploaded_file($_FILES["bigresim"]["tmp_name"],
   //     $_FILES["bigresim"]["name"]);
   if (isset ($_FILES["bigresim"]) && $_FILES["bigresim"]["name"] != "" ){
 //eger buyukresim verisi var ve buyukresimin bir dosya ismi boş değil ise. 10 40 arası karakterli bir kelime ve sayı karışımı olustur ve dosyanın ismini buna çevir. yani 2 tane aynı isimli dosya yüklenipte karışmasın diye.
    $ran = genRandStr(10, 40) ;
     $_FILES["bigresim"]["name"] = $ran.".jpg";
     $resimbname=$_FILES["bigresim"]["name"];// buyukresimin ismini rastgele ürettiğimiz isme atadık ve  images/news/ klasörü altına resmi yeni ismi ile taşıdık.
      move_uploaded_file($_FILES["bigresim"]["tmp_name"],
      "../images/news/".$_FILES["bigresim"]["name"]);
     
         
    }
//altta ise ufak resim eğer ufak resim form verisi var ise yukaridaki işlemlerin aynısını bu seferde ufakresim icin uguladık.
   if (isset ($_FILES["smallresim"]) && $_FILES["smallresim"]["name"] != "" ){
     $ran = genRandStr(11, 40) ;
     $_FILES["smallresim"]["name"] = $ran.".jpg";
     $resimsname =$_FILES["smallresim"]["name"];
      move_uploaded_file($_FILES["smallresim"]["tmp_name"],
      "../images/news/".$_FILES["smallresim"]["name"]);
     
         
    }
    $title= $_POST['title'];//haber basligi
     $content= $_POST['content'];//haber içeriği
     $turkcebaslik= $_POST['turkcebaslik'];// turkçe haber basligi
     $turkcemetin= $_POST['turkcemetin'];//turkçe haber içeriği
     $vitrin = 0;// default olarak vitrinde değil
     $yayin = 0;// default olarak yayında değil
     if (isset ($_POST['vitrin']))
     {
        //eger formdan vitrinde seçeneği işaretlenmiş ise vitrine alıyoruz haberi
     $vitrin= 1;
     
     }
     
     if (isset ($_POST['yayin']))
     {
        //eger formdan yayinda seçeneği işaretlenmiş ise yayına alıyoruz haberi
     $yayin= 1;
     
     }
//ve haberi veritabanımıza giriyoruz
     $query="INSERT INTO habers (title, content, turkcebaslik, turkcemetin, big_resim, ufak_resim, yayin, vitrin)
VALUES ('$title', '$content', '$turkcebaslik', '$turkcemetin', '$resimbname', '$resimsname', $yayin, $vitrin)";
mysql_query($query);
//haber girildikten sonra  3 saniye içinde javascript ile  news modulunun sayfasına yönlendiriliyoruz.
        js_redirect('main.php?module=newsduzenle',3);
    echo '<pre>';
        echo 'Haber eklendi yonlendiriliyorsunuz';
print "</pre>";
        break;
        case 'duzenlemek':
       
        include 'functions.php';
//düzenlemek içinde yukarıdaki gibi aynı kodları kullanıyoruz bu sefer ise INSERT yerine UPDATE ile gerekli haberi düzenliyoruz.
//echo $_FILES['bigresim']['tmp_name'];
$id = $_GET['id'];
//print_r($_FILES);
//move_uploaded_file($_FILES["bigresim"]["tmp_name"],
   //     $_FILES["bigresim"]["name"]);
   if (isset ($_FILES["bigresim"]) && $_FILES["bigresim"]["name"] != "" ){
     $ran = genRandStr(10, 40) ;
     $_FILES["bigresim"]["name"] = $ran.".jpg";
     $resimbname=$_FILES["bigresim"]["name"];
      if(move_uploaded_file($_FILES["bigresim"]["tmp_name"],
      "../images/news/".$_FILES["bigresim"]["name"]));
      $query="UPDATE habers SET big_resim = '$resimbname' WHERE id = $id ";
      mysql_query($query) or die( "An error has ocured: " .mysql_error (). ":" .mysql_errno ());
         
    }
   if (isset ($_FILES["smallresim"]) && $_FILES["smallresim"]["name"] != "" ){
     $ran = genRandStr(11, 40) ;
     $_FILES["smallresim"]["name"] = $ran.".jpg";
     $resimsname =$_FILES["smallresim"]["name"];
      if(move_uploaded_file($_FILES["smallresim"]["tmp_name"],
      "../images/news/".$_FILES["smallresim"]["name"]));
      $query2="UPDATE habers SET ufak_resim = '$resimsname' WHERE id = $id ";
          mysql_query($query2) or die( "An error has ocured: " .mysql_error (). ":" .mysql_errno ());
         
    }
    $title= $_POST['title'];
     $content= $_POST['content'];
     $turkcebaslik= $_POST['turkcebaslik'];
     $turkcemetin= $_POST['turkcemetin'];
     $vitrin = 0;
     $yayin = 0;
     if (isset ($_POST['vitrin']))
     {
       
     $vitrin= 1;
     
     }
     
     if (isset ($_POST['yayin']))
     {
       
     $yayin= 1;
     
     }
  $queryk="UPDATE habers SET title='$title',content='$content',turkcebaslik='$turkcebaslik',turkcemetin='$turkcemetin', vitrin=$vitrin, yayin=$yayin WHERE id=$id";
   
   mysql_query($queryk);
        js_redirect('main.php?module=newsduzenle',3);
    echo '<pre>';
        echo 'Haber Düzenlendi yönlendiriliyorsunuz';
print "</pre>";
        break;
//haber silme bölümü DELETE ile siliyoruz isterseniz unlink komutu ile habere ait resimleride silebilirsiniz orası site kalmış.
        case 'silmek':
          mysql_query("DELETE FROM habers WHERE id=$_GET[id]");
            js_redirect('main.php?module=newsduzenle',3);
    echo '<pre>';
        echo 'Haber Silindi yönlendiriliyorsunuz.';
print "</pre>";
        break;
        default:
           
        break;
}}
?>
bu projemde firmalar da var onlarında çalışma mantığı haberlerdeki gibidir. resimler hariç sadece form verileri yollar. geriye ne kaldı kraldan tacı almak yani çıkış yapmak
bunun içinde logout.php yani çıkış dosyamızı kullanacağız
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
session_start();
include 'functions.php';
        $_SESSION["admin"] = $user;
     $ranx = genRandStr(10, 40) ;
   
    setcookie("cook", $ranx, time() - 3600);
session_unset();
session_destroy();//sezonumuzu yok ediyoruz . yeni bir cookie çerez oluşturup değerimizi -3600 vererek çerezimizi bitmiş gibi gösteriyoruz ve çerezde bitiyor  index.php ye yönlendirince sezon ve çerez olmadığı için index.php de bizi login.php ye yönlendiriyor.
header('location:index.php');
?>

mümkün olduğunca herkese anlatabilmek için basit olarak düz makarna kod şeklinde yazdım. php yi iyi bilen kullanıcılar class ve fonksiyon lar ile daha az kod ile buna benzer bir panel yazabilir. umarım yardımcı olabilmişimdir. aşağıda çalışan hali ile PHP ve SQL dosyalarını bulabilirsiniz.
Bu yazımda kullandığım dosyaları indirmek için tıklayınız.
bu arada dbb.php içinden database isminizi değiştirmeyi ve eca.sql dosyasını o database içine import etmeyi unutmayınız.
sorularınızı ve önerilerinizi bekliyorum.
herkese kolay gelsin. the don is out

Hiç yorum yok:

Yorum Gönder