Статьи

Создайте систему рассылки с PHP и MySQL

Сегодня мы собираемся создать систему новостной рассылки с использованием PHP на фоне MySQL. Учебное пособие будет посвящено созданию системы, которая позволяет создавать несколько списков рассылки и отправлять сообщения в определенные списки

Привет, ребята, так что мы собираемся создать довольно сложную систему рассылки, так что давайте начнем! Вам понадобятся два ресурса для проекта.

  • Набор Silk Icon будет использоваться для добавления визуального «стиля» в приложение.
  • Swift PHP Mailer будет использоваться для отправки наших электронных писем.

При запуске любого проекта я предпочитаю макетировать папки до начала кодирования, поэтому давайте сделаем это сейчас. Сначала создайте общий каталог проекта. Затем создайте папку с именем admin в папке вашего проекта. Затем в папке администратора добавьте две папки с именами media и swift. Наконец, создайте папку с именем images внутри медиа-каталога. Также вы можете поместить папку Swift lib в созданную нами папку swift. Вы также можете скопировать шесть значков шелка, которые мы будем использовать:

  • bullet_green.png
  • bullet_red.png
  • delete.png
  • email_go.png
  • find.png
  • page_edit.png

Я собираюсь структурировать оставшееся руководство по созданию CRUD: создавать, читать, обновлять и удалять для четырех из наших шести моделей. Один другой будет редактироваться другими действиями, а шестое мы не будем создавать действия CRUD.

Теперь давайте сначала создадим нашу базу данных, а наши таблицы мы будем создавать постепенно. Теперь мы собираемся начать кодирование. Также, как примечание, я буду предполагать, что мы будем работать с файлами в нашей папке администратора, если я не укажу иначе, так как большая часть кода находится в этой папке.


Каждое приложение будет иметь определенный тип конфигурационного файла, и мы собираемся создать наш сейчас. Затем создайте файл с именем config.php и добавьте следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
# admin/config.php
   <?php
   // DB Settings
   define(‘DB_SERVER’, ‘localhost’);
   define(‘DB_USER’, ‘root’);
   define(‘DB_PASSWORD’, »);
   define(‘DB_NAME’, ‘nettuts_ns_demo’);
 
   define(‘FROM_EMAIL’, ‘no_reply@ohyeahemail.com’);
   define(‘FROM_NAME’, ‘oh yeah email!’);
 
 
   session_start();
   require_once ‘classes.php’;
   $mini = false;
   $nonav = false;
   error_reporting(0);

Итак, в первом разделе настраиваются переменные нашей базы данных, поэтому убедитесь, что вы отредактировали их так, чтобы они улучшили вашу локальную конфигурацию. Наша следующая реклама устанавливает некоторые атрибуты электронной почты, которые мы будем использовать позже. Последний раздел запускает наш сеанс, чтобы мы могли получить к нему доступ, требует наш файл classes.php (мы его создадим всего за секунду), устанавливает значения по умолчанию для некоторых параметров макета, а затем устанавливает для отчета об ошибках значение 0, чтобы прекратить раздражающие предупреждения , Однако, если у вас возникли проблемы, попробуйте закомментировать эту строку.

Теперь создайте наш файл classes.php и добавьте:

01
02
03
04
05
06
07
08
09
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
# admin/classes.php
   <?php
   // Authentication
   function validate_user($username, $pw) {
       if (check_username_and_pw($username, $pw)) {
           header(‘Location: index.php’);
       } else {
           $_SESSION[‘error’] = «Login error.»;
           header(‘Location: login.php’);
       }
   }
 
   function logged_in() {
       if ($_SESSION[‘authorized’] == true) {
           return true;
       } else {
           return false;
       }
   }
 
   function login_required() {
       if(logged_in()) {
           return true;
       } else {
           header(‘Location: login.php’);
       }
   }
   // mysql
   function query($sql) {
     $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
 
     $stmt = $link->prepare($sql) or die(‘error’);
     $stmt->execute();
     $meta = $stmt->result_metadata();
 
     while ($field = $meta->fetch_field()) {
       $parameters[] = &$row[$field->name];
     }
 
     $results = array();
     call_user_func_array(array($stmt, ‘bind_result’), $parameters);
 
     while ($stmt->fetch()) {
       foreach($row as $key => $val) {
         $x[$key] = $val;
       }
       $results[] = $x;
     }
 
     return $results;
     $results->close();
     $link->close();
   }
 
   function count_query($query) {
     $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
     if($stmt = $link->prepare($query)) {
       $stmt->execute();
       $stmt->bind_result($result);
       $stmt->fetch();
       return $result;
       $stmt->close();
     }
     $link->close();
   }
 
   function check_username_and_pw($u, $pw) {
     $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
 
     $query = «SELECT * FROM users WHERE username = ? AND password = ? LIMIT 1»;
     if($stmt = $link->prepare($query)) {
       $p = md5($pw);
       $stmt->bind_param(‘ss’, $u, $p);
       $stmt->execute();
       $stmt->bind_result($id, $username, $pw);
       if($stmt->fetch()) {
         $_SESSION[‘authorized’] = true;
         $_SESSION[‘username’] = $username;
         return true;
       } else {
         return false;
       }
       $stmt->close();
     }
     $link->close();
   }

Это огромный кусок кода, и я пройдусь по нему. Наша первая функция обрабатывает, когда пользователь публикует наш логин, а затем отправляет данные в нашу функцию check_username_and_pw. Наша функция logged_in просто возвращает информацию о том, вошел ли пользователь в систему. Наша функция login_required проверяет, вошли ли мы в систему, и, если нет, отправляет нас на страницу входа.

Следующая функция с простым именем query () выполняет предварительный запрос к нашей БД и была создана Джеффри Вей . Я добавил функции создания ссылок и закрытия, чтобы сделать их еще проще. Наша следующая функция, которую я создал, специально для того, чтобы мы могли легко выполнять SQL-запросы COUNT, а наша функция check_username_and_pw проверяет, можем ли мы найти пользователя с таким же адресом электронной почты и хэшированным паролем MD5, и, если это так, устанавливает переменные сеанса.


Наш следующий файл, над которым мы будем работать, — это файл layout.php, поэтому давайте создадим его. В нашем разделе head мы просто объявляем наши обычные объявления XHTML. Если вы заметили, мы автоматически добавляем заголовок страницы в другую строку для нашего заголовка. Затем у нас есть таблица стилей (продолжайте и создайте ее тоже в нашей медиа-папке). После чего мы открываем наш тег body и проверяем, хотим ли мы мини-макет, и если да, то добавляем класс. Затем у нас есть заголовок, и затем проверяется, хотим ли мы нашу навигацию, и если мы хотим, мы показываем наши вкладки. Я также добавил способ добавления текущего класса для каждой вкладки. Затем у нас также есть ссылка для выхода из системы, а затем наш контейнер div. В этом мы добавляем тег h3 с нашим заголовком, а затем отображаем наш контент.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# admin/layout.php
   <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»>
   <html xmlns=»http://www.w3.org/1999/xhtml» >
       <head>
           <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
 
           <title><?php echo $title;
           <!— Stylesheets —>
           <!— <link rel=»stylesheet» href=»media/style.css» type=»text/css» media=»all» /> —>
       </head>
       <body<?php if ($mini == true) { ?> class=»mini»<?php } ?>>
           <div id=»header»>
               <h1><a href=»index.php»>my newsletter app</a></h1>
           </div>
           <?php if ($nonav == false) { ?>
           <div id=»nav»>
               <a href=»messages.php»<?php if($tab == ‘mess’) {?>class=»current»<?php } ?>>messages</a>
               <a href=»subscribers.php»<?php if($tab == ‘sub’) {?>class=»current»<?php } ?>>subscribers</a>
               <a href=»newsletters.php»<?php if($tab == ‘nl’) {?>class=»current»<?php } ?>>newsletters</a>
               <a href=»templates.php»<?php if($tab == ‘temp’) {?>class=»current»<?php } ?>>templates</a>
               <span class=»right»>
                   <a href=»logout.php»>log out</a>
               
           </div>
           <?php } ?>
           <div id=»container»>
               <h3><?php echo $title;?></h3>
               <?php echo $content;
           </div>
       </body>
   </html>

Теперь мы собираемся создать нашу страницу index.php просто так, чтобы мы могли стилизовать. Откройте index.php и добавьте:

1
2
3
4
5
6
7
8
9
# admin/index.php
       <?php
       require_once ‘config.php’;
       $title = «Home!»;
       $content = <<<EOF
       <h3>current stats</h3>
       Our home page!
       EOF;
       include ‘layout.php’;

Таким образом, в этом случае нам требуется наш файл конфигурации, установите наш заголовок, а затем настройте нашу переменную содержимого, а затем в последнюю очередь требуется наш файл макета. Когда вы впервые откроете его, оно должно выглядеть так:


Теперь откройте нашу таблицу стилей. Мне нравится использовать стили сброса и типографии 960.gs , сжатые в TextMate. Итак, верхняя часть моего CSS-файла выглядит так:

1
2
3
4
5
# admin/media/style.css
   /* reset */
   html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:»;content:none}:focus{outline:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0}
   /* typography */
   body{font:13px/1.5 Helvetica,Arial,’Liberation Sans’,FreeSans,sans-serif}a:focus{outline:1px dotted invert}hr{border:0 #ccc solid;border-top-width:1px;clear:both;height:0}h1{font-size:25px}h2{font-size:23px}h3{font-size:21px}h4{font-size:19px}h5{font-size:17px}h6{font-size:15px}ol{list-style:decimal}ul{list-style:square}li{margin-left:30px}p,dl,hr,h1,h2,h3,h4,h5,h6,ol,ul,pre,table,address,fieldset{margin:10px 0;}

Давайте сначала стилизуем наши основные элементы, поэтому добавим следующие стили:

1
2
3
4
# admin/media/style.css
   #header {width:85%;
   #header h1 a {text-decoration:none;
   #container {width:85%;

Теперь ваша страница должна выглядеть так:


Теперь, если мы стилизируем вкладки с фоном навигации, а затем наведите курсор на фон для каждой из ссылок, и вы должны увидеть:

1
2
3
4
5
6
# admin/media/style.css
   /* tabs */
   #nav {margin:0 auto 2px;padding:10px;width:85%;
   #nav a { padding:12px 10px;
   #nav a.current, #nav a:hover {background:#111;}
   #nav span.right {float:right;}

Теперь, пока мы работаем над файлом, добавьте следующие стили для нашего мини-макета, входов формы, таблиц, больших ссылок и наших сообщений об ошибках и успехах.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
# admin/media/style.css
   body.mini #header {width:30%;
   body.mini #container {width:30%;}
 
   /* form */
   form input.text {width:95%;
   form textarea {width:95%;
   /* table */
   table {width:98%;
   table th {background-color: rgb(229, 229, 229);
   table tr td {border: 1px solid rgb(221, 221, 221);
   table tr:hover {background-color: rgb(240, 240, 240);color:#000;}
   /* a */
   a.large {padding: 5px;
   a.large.right {float:right;}
   a.large:hover, a.large.current {background:#444;
   /* messages */
   #message {margin: 5px 10px;
   #message.error {background:#FFEBE8;border: 1px solid #CC0000;color:#CC0000;}
   #message.success {border:solid 1px #349534;

Это те стили, которые мне нравится использовать во всех моих проектах. Теперь, когда мы закончили макет, мы продолжим аутентификацию.


Мы будем работать с очень простой системой аутентификации. Создайте login.php и поместите в него следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# admin/login.php
   <?php
   require_once ‘config.php’;
   if(logged_in()) {header(‘Location: index.php’);}
   $title = «login»;
   $nonav = true;
   $mini = true;
   if($_POST && (!empty($_POST[‘username’]) ) && (!empty($_POST[‘password’]))) {
       validate_user($_POST[‘username’], $_POST[‘password’]);
   }
   $error = $_SESSION[‘error’];
   $content = <<<EOF
   $error
   <form action=»login.php» method=»post»>
       <p>
           <label for=»username»>username:</label><br />
           <input type=»text» name=»username» class=»text» />
       </p>
       <p>
           <label for=»password»>password:</label><br />
           <input type=»password» name=»password» class=»text» />
       </p>
       <p>
           <input type=»submit» value=»login» />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Я объясню каждую часть кода. Сначала нам нужен наш конфигурационный файл. Затем мы проверяем, вошли ли мы в систему, и, если мы, мы перенаправляем домой. Далее мы устанавливаем заголовок и наши параметры макета. Затем мы проверяем, есть ли у нас POST и есть ли у POST имя пользователя и пароль, и если это так, мы вызываем функцию validate_user из нашего файла классов. Затем мы устанавливаем переменную error для наших ошибок сеанса, а затем настраиваем нашу форму и выводим любые ошибки. Теперь мы собираемся создать нашу страницу выхода из системы, поэтому создайте logout.php и вставьте в нее следующее:

1
2
3
4
5
6
7
# admin/logout.php
   <?php
   require_once ‘config.php’;
   $_SESSION = array();
   session_destroy();
   header(‘Location: login.php’);
   ?>

Нам снова требуется наш конфигурационный файл, задайте для нашего сеанса пустой массив, затем уничтожим наш сеанс и перенаправим на нашу страницу входа. Теперь, когда вы сделали все это, ваша страница входа должна выглядеть так:


Мы также собираемся создать пользовательскую запись (и нашу таблицу), чтобы мы могли добавить логику аутентификации и вы могли просматривать страницы с кодом впереди. Создать пользователя с именем пользователя admin и секретным паролем. Чтобы добавить это, запустите этот SQL:

1
2
3
4
5
6
7
8
9
CREATE TABLE `users` (
      `id` int(10) AUTO_INCREMENT,
      `username` varchar(50),
      `password` varchar(32),
      PRIMARY KEY (`id`)
   ) ENGINE=MyISAM DEFAULT CHARSET utf8;
 
   INSERT INTO `users` (`id`, `username`, `password`) VALUES
   (‘1’, ‘admin’, ‘5ebe2294ecd0e0f08eab7690d2a6ee69’);

Я разработал это приложение, чтобы быть очень гибким. Я хотел, чтобы вы (пользователь) могли создавать и управлять таким количеством информационных бюллетеней, как вы хотите. Итак, во-первых, нам нужно создать нашу таблицу базы данных. Вот код SQL из экспорта в моем демонстрационном приложении:

1
2
3
4
5
6
7
CREATE TABLE `newsletters` (
   `id` int(10) AUTO_INCREMENT,
   `name` varchar(50),
   `description` varchar(255),
   `visible` varchar(10),
   PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET utf8;

Итак, теперь, когда у нас есть таблица новостных рассылок, мы собираемся создать страницы для каждого действия. Создайте четыре файла с именем: newsletters.php, newsletters_delete.php, newsletters_edit.php и newsletters_new.php. Сначала откройте newsletters.php:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# admin/newsletters.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «newsletters»;
   $newsletters = query(«SELECT * FROM newsletters ORDER BY id ASC»);
   $tab = ‘nl’;
   $table = «»;
   foreach($newsletters as $row) {
       $dlink = ‘<a href=»newsletters_delete.php?id=’.$row[‘id’].'» onclick=»return confirm(\’Are you sure you want to delete this newsletter?\’);»
       $elink = ‘<a href=»newsletters_edit.php?id=’.$row[‘id’].'» title=»edit» ><img src=»media/images/page_edit.png» alt=»edit»/></a>’;
       if($row[‘visible’] == «1») {$visible = ‘<img src=»media/images/bullet_green.png» />’;} else {$visible = ‘<img src=»media/images/bullet_red.png» />’;}
       $table .= «<tr><td>».$row[‘id’].»</td><td>».$row[‘name’].»</td><td>».$row[‘description’].»</td><td>$visible</td><td>».$dlink.» «.$elink.»</td></tr>\n»;
   }
   $message = error_messages();
   $content = <<<EOF
   <a href=»newsletters_new.php» class=»large»>new newsletter »</a>
   $message
   <table>
       <tr>
           <th></th>
           <th>name</th>
           <th>description</th>
           <th>visible</th>
           <th></th>
       </tr>
       $table
   </table>
   EOF;
   include ‘layout.php’;

Таким образом, этот файл имеет тот же базовый вид нашей страницы входа. Нам нужен наш конфиг, убедитесь, что мы вошли в систему, установите наш заголовок. Затем мы используем нашу функцию query (), чтобы выполнить запрос SELECT, чтобы найти все наши информационные бюллетени. Затем мы устанавливаем текущую вкладку для нашего макета. После того, как мы пройдемся по массиву, возвращенному нашим запросом, и создадим макет таблицы. Затем мы вызываем еще неизвестную функцию и создаем нашу страницу. Прежде чем вы сможете просмотреть страницу, вам нужно добавить следующее в ваш файл classes.php, чтобы легко обрабатывать наши сообщения об ошибках:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
# admin/classes.php
   // Render error messages
   function error_messages() {
       $message = »;
       if($_SESSION[‘success’] != ») {
           $message = ‘<span class=»success» id=»message»>’.$_SESSION[‘success’].’
           $_SESSION[‘success’] = »;
       }
       if($_SESSION[‘error’] != ») {
           $message = ‘<span class=»error» id=»message»>’.$_SESSION[‘error’].’
           $_SESSION[‘error’] = »;
       }
       return $message;
   }

Хотя у вас, вероятно, не будет никаких данных, когда у вас будет несколько записей, это будет выглядеть так: (хотя и немного менее сжато)


Теперь мы собираемся поработать над нашим новым действием, поэтому откройте newsletters_new.php и добавьте следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# admin/newsletters_new.php
   <?php
   require_once ‘config.php’;
   login_required();
   $tab = ‘nl’;
 
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $sql = «INSERT INTO NEWSLETTERS (name, description) VALUES ( ‘».$_POST[‘name’].»‘ , ‘».$_POST[‘description’].»‘ )»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
       $_SESSION[‘success’] = «Added newsletter.»;
       header(‘Location: newsletters.php’);
   }
   $title = «new newsletter»;
   $content = <<<EOF
   <form action=»newsletters_new.php» method=’POST’>
       <p>
           <label for=»name»>Name:</label><br />
           <input type=’text’ name=’name’ class=»text» />
       </p>
       <p>
           <label for=»description»>Description:</label>
           <input type=»text» name=»description» class=»text» />
       </p>
       <p>
           <input type=’submit’ value=’Add Newsletter’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Поэтому я надеюсь, что вы заметили шаблон в верхней части каждого из наших файлов. Сначала нам требуется наш файл config.php, затем убедитесь, что мы вошли в систему, а затем настроим нашу текущую вкладку, а затем добавим некоторую дополнительную логику для обработки POST, а затем мы установим наш заголовок, наш контент и затем отобразим страницу. Раздел POST довольно прост для понимания, поэтому я объясню это быстро.

Сначала мы проверяем, был ли отправлен товар с именем отправлено. Это скрытое поле, которое мы имеем после кнопки отправки. Далее мы создаем ссылку на нашу базу данных, используя переменные из нашего конфигурационного файла. Затем мы создаем наш запрос вставки SQL, используя наши переменные POSTed. Затем мы запрашиваем (а не нашу функцию) базу данных, и если возникает ошибка, мы показываем возвращенную ошибку. Затем мы закрываем запрос, затем устанавливаем наше сообщение об успехе и затем перенаправляем на страницу со списком. Ваша страница должна выглядеть так:


Далее мы будем работать на нашей странице редактирования и добавим следующее:

01
02
03
04
05
06
07
08
09
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
# admin/newsletters_edit.php
   <?php
   require_once ‘config.php’;
   login_required();
   $tab = ‘nl’;
 
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       if(isset($_POST[‘visible’])) {$visible = 1;}else{$visible = 0;}
       $sql = «UPDATE NEWSLETTERS SET name='».$_POST[‘name’].»‘, description='».$_POST[‘description’].»‘, visible=».$visible.» WHERE id=».$_POST[‘id’].»»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
       $_SESSION[‘success’] = «Edited newsletter.»;
       header(‘Location: newsletters.php’);
   }
   $title = «edit newsletter»;
   $id = (int) $_GET[‘id’];
   $results = query(«SELECT * FROM newsletters WHERE id='».$id.»‘ LIMIT 1″);
   $name = $results[0][‘name’];
   $description = $results[0][‘description’];
   $visible = ($results[0][‘visible’] == «1») ?
   $content = <<<EOF
   <form action=»newsletters_edit.php» method=’POST’>
       <p>
           <label for=»name»>Name:</label><br />
           <input type=’text’ name=’name’ class=»text» value=»$name» />
       </p>
       <p>
           <label for=»description»>Description:</label>
           <input type=»text» name=»description» class=»text» value=»$description» />
       </p>
       <p>
           <label for=»visible»>Visible:</label>
           <input type=»checkbox» name=»visible» value=»true» $visible/>
       </p>
       <p>
           <input type=’submit’ value=’Edit Newsletter’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
           <input type=’hidden’ value=’$id’ name=’id’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Как и все наши файлы, мы начинаем с того же блока. После нашего POST-блока (о котором я расскажу через секунду), мы устанавливаем id для нашего запрошенного id, удостоверяясь, что это целое число. Затем мы используем нашу функцию запроса, чтобы найти информационный бюллетень, с которым мы работаем, и устанавливаем несколько переменных для возвращаемых результатов. Вы можете спросить, почему мы ставим [0] перед тем, как запрашивать каждое значение, и причина в том, что функция запроса возвращает массив всех записей, а каждая запись является массивом, поэтому нам необходим доступ к первому массиву в нашей переменной результатов , Строка, в которой мы устанавливаем переменную, видимую, если на самом деле сжатый оператор if / else. если часть является == 1, то, если это правда, переменная установлена ​​в флажок, в противном случае ничего. Тогда у нас есть наша форма.

Наш блок POST очень похож на нашу новую страницу и всегда будет начинаться одинаково с остальных наших страниц. Затем мы проверяем, установлен ли флажок, и снова устанавливаем здесь переменную. Затем у нас есть запрос UPDATE, снова запустите запрос, установите наше сообщение об успехе и затем перенаправьте домой. Вот так выглядит форма и сообщение, увиденное после редактирования:



Последняя страница для этого раздела является самой легкой, так как это страница удаления. Откройте файл и вставьте следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
# admin/newsletters_delete.php
   <?php
   require_once ‘config.php’;
   login_required();
   $id = (int) $_GET[‘id’];
   $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
   $sql = «DELETE FROM newsletters WHERE id=$id LIMIT 1»;
   $stmt = $link->query($sql) or die($link->error);
   if($link->affected_rows) {
       $_SESSION[‘success’] = «Newsletter deleted.»;
   } else {
       $_SESSION[‘error’] = ‘Nothing deleted.’;
   }
   header(‘Location: newsletters.php’);

В этом блоке нам требуется наша конфигурация, убедитесь, что мы вошли в систему, затем сохраняем запрошенный идентификатор в переменную, создаем соединение MySQL, настраиваем наш запрос SQL, затем выполняем запрос. Затем мы проверяем, была ли затронута строка, и устанавливаем сообщение соответствующим образом. Затем мы перенаправляем на страницу новостной рассылки. Поздравляю, вы закончили первый из четырех разделов CRUD. Далее мы будем работать над CRUD для наших шаблонов.


Наше приложение также позволит несколько шаблонов, все они хранятся в базе данных. Сначала давайте создадим нашу таблицу базы данных:

1
2
3
4
5
6
7
CREATE TABLE `templates` (
   `id` int(10) AUTO_INCREMENT,
   `name` varchar(50),
   `columns` tinyint(5),
   `body` text,
   PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET utf8;

У нас есть автоматически увеличивающийся столбец идентификатора, столбец имени, столбец столбцов для сохранения количества столбцов (приложение масштабируется только до 2 столбцов, что должно быть достаточно, но может быть легко расширено. Это также можно использовать для различных разделов. и наше тело. Как и в прошлый раз, нам нужно сделать каждую из наших страниц, и у нас будет страница templates.php, а также templates_new.php, templates_edit.php, templates_delete.php и templates_preview.php. Сначала мы будем работать с нашим файлом templates.php, поэтому откройте его и вставьте:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# admin/templates.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «templates»;
   $tab = ‘temp’;
   $templates = query(«SELECT id,name,columns FROM templates ORDER BY id ASC»);
   $table = «»;
   foreach($templates as $row) {
       $plink = ‘<a href=»» onClick=»window.open(\’templates_preview.php?id=’.$row[‘id’].’\’,width=800,height=600)» title=»preview»><img src=»media/images/find.png» alt=»preview»/></a>’;
       $dlink = ‘<a href=»templates_delete.php?id=’.$row[‘id’].'» onclick=»return confirm(\’Are you sure you want to delete this template?\’);»
       $elink = ‘<a href=»templates_edit.php?id=’.$row[‘id’].'» title=»edit»><img src=»media/images/page_edit.png» alt=»edit»/></a>’;
       $table .= «<tr><td>».$row[‘id’].»</td><td>».$row[‘name’].»</td><td>».$row[‘columns’].»</td><td>».$plink.» «.$dlink.» «.$elink.»</td></tr>\n»;
   }
   $message = error_messages();
   $content = <<<EOF
   <a href=»templates_new.php» class=»large»>new template »</a>
   $message
   <table>
       <tr>
           <th></th>
           <th>name</th>
           <th>columns</th>
           <th></th>
       </tr>
       $table
   </table>
   EOF;
   include ‘layout.php’;

Опять мы начнем с основ. Затем мы формируем запрос, чтобы найти все наши шаблоны. Затем мы перебираем каждый массив в шаблонах и создаем таблицу. Затем мы получаем наши сообщения об ошибках (и успехах), а затем — наш контент. Ваша страница должна выглядеть примерно так:


Теперь, перейдя на нашу новую страницу, вставьте следующее:

01
02
03
04
05
06
07
08
09
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
# admin/templates_new.php
   <?php
   require_once ‘config.php’;
   login_required();
   $tab = ‘temp’;
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $sql = «INSERT INTO templates (name, columns, body) VALUES ( ‘».$_POST[‘name’].»‘ , «.$_POST[‘columns’].», ‘».mysql_real_escape_string($_POST[‘body’]).»‘ )»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
       $_SESSION[‘success’] = «Added template.»;
       header(‘Location: templates.php’);
   }
   $title = «new template»;
   $content = <<<EOF
   <form action=»templates_new.php» method=’POST’>
       <p>
           <label for=»name»>Name:</label><br />
           <input type=’text’ name=’name’ class=»text» />
       </p>
       <p>
           <label for=»columns»>Columns</label>
           <select name=»columns»>
               <option value=»1″>Single Column Layout</option>
               <option value=»2″>Two Column Layout</option>
           </select>
       </p>
       <p>
           <label for=»description»>Body: (raw html)</label><br />
           Use %content% for a single column layout, %leftcol% and %rightcol% for a two column layout.<br />
           <textarea name=»body» rows=»35″></textarea>
       </p>
       <p>
           <input type=’submit’ value=’Add Template’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Итак, опять же, у нас есть тот же заголовок. Наш POST снова создает соединение MySQL, затем мы создаем наш запрос и используем mysql_real_escape_string, чтобы разрешить любые символы в записи, а затем мы выполняем наш запрос, устанавливаем наше сообщение об успехе и перенаправляем на наш список шаблонов. Если вы посмотрите на нашу форму, я также прошу вставить переменные для нашего контента, и я покажу вам, как это вступит в силу позже, когда мы сопоставим сообщение с шаблоном. Ваша страница должна выглядеть так:


Далее мы будем работать на нашей странице редактирования. Если вы заметили, большая часть этого кода копируется и вставляется во все одни и те же действия, поэтому сделайте это проще для себя.

01
02
03
04
05
06
07
08
09
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
# admin/templates/edit.php
   <?php
   require_once ‘config.php’;
   login_required();
   $tab = ‘temp’;
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $sql = «UPDATE templates SET name='».$_POST[‘name’].»‘, body='».mysql_real_escape_string($_POST[‘body’]).»‘, columns=».$_POST[‘columns’].» WHERE id=».$_POST[‘id’].»»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
       $_SESSION[‘success’] = «Edited template.»;
       header(‘Location: templates.php’);
   }
   $title = «edit template»;
   $id = (int) $_GET[‘id’];
   $results = query(«SELECT * FROM templates WHERE id='».$id.»‘ LIMIT 1″);
   $name = $results[0][‘name’];
   $templatedata = stripslashes(htmlspecialchars($results[0][‘body’]));
   $content = <<<EOF
   <form action=»templates_edit.php» method=’POST’>
       <p>
           <label for=»name»>Name:</label><br />
           <input type=’text’ name=’name’ class=»text» value=»$name»/>
       </p>
       <p>
           <label for=»columns»>Columns</label>
           <select name=»columns»>
               <option value=»1″>Single Column Layout</option>
               <option value=»2″>Two Column Layout</option>
           </select>
       </p>
       <p>
           <label for=»body»>Body: (raw html)</label><br />
           Use %content% for a single column layout, %leftcol% and %rightcol% for a two column layout.<br />
           <textarea name=»body» rows=»35″>$templatedata</textarea>
       </p>
       <p>
           <input type=’submit’ value=’Edit Template’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
           <input type=’hidden’ value=’$id’ name=’id’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Мы начинаем с того же самого вступления, затем нашего блока POST, нашего заголовка, затем нашего запрошенного идентификатора. После этого мы пытаемся найти шаблон, с которым мы работаем, затем устанавливаем три переменные, чтобы мы могли вставить их в наш блок контента. Мы также преобразуем все сохраненные теги в символы HTML, чтобы все отображалось. Посмотрев на наш блок POST, вы заметите, что мы создаем нашу ссылку, затем наш запрос и снова используем mysql_real_escape_string, чтобы сохранить все, выполнить наш запрос, а затем установить наше сообщение и перенаправить в наш список шаблонов. Ваша страница редактирования (с примером записи) должна выглядеть так:


Теперь мы создадим еще одну страницу удаления, поэтому откройте нашу страницу удаления и вставьте:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
# admin/templates_delete.php
   <?php
   require_once ‘config.php’;
   login_required();
   $id = (int) $_GET[‘id’];
   $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
   $sql = «DELETE FROM templates WHERE id=$id LIMIT 1»;
   $stmt = $link->query($sql) or die($link->error);
   if($link->affected_rows) {
       $_SESSION[‘success’] = «Template deleted.»;
   } else {
       $_SESSION[‘error’] = ‘Nothing deleted.’;
   }
   header(‘Location: templates.php’);

Я надеюсь, что вы выбрали шаблон здесь, это очень простая страница. Теперь мы будем работать над дополнительной страницей, которая не является частью спектра CRUD; мы собираемся создать страницу предварительного просмотра. Бинокль в части действия на столе является ссылкой для каждого (в новом окне). Так что откройте нашу страницу предварительного просмотра. Страница очень проста, мы находим наш шаблон и выводим данные, а затем добавляем кнопку закрытия JavaScript. Код выглядит так:

01
02
03
04
05
06
07
08
09
10
# admin/templates_preview.php
   <?php
   require_once ‘config.php’;
   login_required();
   $id = (int) $_GET[‘id’];
   $data = query(«SELECT body FROM templates WHERE id=$id LIMIT 1»);
   $template = $data[0][‘body’];
   ?>
   <?php echo $template;
   <center><button type=»button» onclick=»self.close();»>close window</button></center>

И пример предварительного просмотра выглядит так:


Теперь мы закончили с нашими шаблонами, мы готовы перейти к следующему шагу!


Так что теперь мы будем работать с нашими подписчиками! Мы собираемся создать две таблицы. Первый:

1
2
3
4
5
6
CREATE TABLE `subscribers` (
      `id` tinyint(10) AUTO_INCREMENT,
      `name` varchar(50),
      `email` varchar(50),
      PRIMARY KEY (`id`)
   ) ENGINE=MyISAM DEFAULT CHARSET utf8;

Относится к каждому подписчику, а ко второму:

1
2
3
4
5
6
CREATE TABLE `subscriptions` (
      `id` tinyint(10) AUTO_INCREMENT,
      `subscriber_id` tinyint(10),
      `newsletter_id` tinyint(10),
      PRIMARY KEY (`id`)
   ) ENGINE=MyISAM DEFAULT CHARSET utf8;

Создает таблицу для наших отношений «многие ко многим» с нашими информационными бюллетенями. Подписчик может иметь несколько подписок на рассылку, поэтому он может подписаться на несколько рассылок, и каждая рассылка может иметь много подписчиков. Чтобы создать наиболее динамичное решение, у нас есть таблица ссылок.

Давайте сначала создадим наши файлы. Файлы, которые мы собираемся собирать, будут подписчики. Php, subs_delete.php и subs_edit.php. Наше действие по созданию будет создано позже для внешнего интерфейса. Сначала откройте файл subscrib.php и вставьте:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# admin/subscribers.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «subscribers»;
   $tab = ‘sub’;
   $table = «»;
   $messages = query(«SELECT * FROM subscribers ORDER BY id ASC»);
   foreach($messages as $row) {
       $dlink = ‘<a href=»subscribers_delete.php?id=’.$row[‘id’].'» onclick=»return confirm(\’Are you sure you want to delete this subscriber?\’);»
       $elink = ‘<a href=»subscribers_edit.php?id=’.$row[‘id’].'» title=»edit»><img src=»media/images/page_edit.png» alt=»edit»/></a>’;
       $table .= ‘<tr><td>’.$row[‘id’].'</td><td>’.$row[‘name’].'</td><td>’.$row[’email’].'</td><td>’.$dlink.’
   }
   $message = error_messages();
   $content = <<<EOF
   $message
   <table>
       <tr>
           <th></th>
           <th>name</th>
           <th>email</th>
           <th></th>
       </tr>
       $table
   </table>
   EOF;
   include ‘layout.php’;

У нас в основном те же листинги, что и раньше, но на этот раз мы будем искать наших подписчиков. Ваша страница (с некоторыми примерами данных) должна выглядеть так:


Теперь мы перейдем к нашей странице редактирования:

01
02
03
04
05
06
07
08
09
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
# admin/subscribers_edit.php
   <?php
   require_once ‘config.php’;
   login_required();
   $tab = ‘sub’;
 
   if(isset($_POST[‘submitted’])) {
       $id = (int) $_POST[‘id’];
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $sql = «UPDATE subscribers SET name='».$_POST[‘name’].»‘, email='».$_POST[’email’].»‘ WHERE id=$id»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
 
       foreach($_POST[‘newsletter’] as $n) {
           if($n[‘exists’] != ‘1’ && $n[‘subscribe’] == «true») { // If we want to subscribe but the record doesnt exist
               $nlid = $n[‘nlid’];
               $sql = «INSERT INTO subscriptions (subscriber_id, newsletter_id) VALUES (‘$id’, ‘$nlid’)»;
               $stmt = $link->query($sql) or die($link->error);
               $stmt->close;
           } elseif ($n[‘exists’] == ‘1’ && $n[‘subscribe’] != «true») {// Else if we had an exits but we want to unsubscribe
               $subid = $n[‘subid’];
               $sql = «DELETE FROM subscriptions WHERE id=$subid LIMIT 1»;
               $stmt = $link->query($sql) or die($link->error);
               $stmt->close;
           }
       }
       $_SESSION[‘success’] = «Edited subscriber.»;
       header(‘Location: subscribers.php’);
   }
   $title = «edit newsletter»;
   $id = (int) $_GET[‘id’];
 
   $subscriber = query(«SELECT * FROM subscribers WHERE id=’$id'»);
   $name = $subscriber[0][‘name’];
   $email = $subscriber[0][’email’];
 
   $newsletters = query(«SELECT * FROM newsletters»);
   $subs = query(«SELECT * FROM subscriptions WHERE subscriber_id='».$id.»‘»);
   $subscriptions = »;
   foreach($newsletters as $nl) {
       $s = false;
       $subid = »;
       foreach($subs as $sub) {
           if($sub[‘newsletter_id’] == $nl[‘id’]) {$s = true;
       }
       $checked = ($s == true) ?
       $subscriptions .= ‘
       <input type=»checkbox» name=»newsletter[‘.$nl[«id»].’][subscribe]» value=»true» ‘.$checked.’/>
       <label for=»newsletter[‘.$nl[«id»].’]»>’.$nl[‘name’].'</label>
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][exists]» value=»‘.$s.'» />
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][nlid]» value=»‘.$nl[‘id’].'» />
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][subid]» value=»‘.$subid.'» /><br />
       ‘;
 
 
   }
   $content = <<<EOF
   <form action=»subscribers_edit.php» method=’POST’>
       <p>
           <label for=»name»>Name:</label><br />
           <input type=’text’ name=’name’ class=»text» value=»$name» />
       </p>
       <p>
           <label for=»email»>Email</label><br />
           <input type=»text» name=»email» class=»text» value=»$email» />
       </p>
       <p>
           <strong>Newsletters:</strong><br />
           $subscriptions
       </p>
       <p>
           <input type=’submit’ value=’Edit Subscriber’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
           <input type=’hidden’ value=’$id’ name=’id’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Эта страница довольно отличается, поэтому я объясню каждую часть. Заголовок тот же, что мы использовали. Я пропущу блок POST и вернусь к нему. Затем мы продолжаем тот же код. Затем мы находим нашего текущего подписчика. Затем мы находим все информационные бюллетени (включая те, которые невидимы — видимые означают видимые для публики), а затем все подписки подписчика. Далее мы перебираем каждую возвращаемую запись новостной рассылки, затем сбрасываем некоторые значения Далее, мы перебираем каждую подписку, которую имеет пользователь, и, если подписка newsletter_id равна текущей новостной рассылке, которую мы делаем в цикле, мы устанавливаем $ s true, а $ subid равен id подписки. Затем мы устанавливаем переменную $ флажок равным либо проверено, либо ничего, в зависимости от того, была ли найдена подписка для этого подписчика и текущий бюллетень в цикле. Далее мы создаем область формы флажка с множеством скрытых полей. Во-первых, у нас есть фактический флажок с именем, который создаст массив для каждого флажка. Затем у нас есть метка, и затем мы выводим, существует ли подписка или нет, newsletter_id и затем subscription_id, когда подписка существует. После чего у нас наш нормальный контент.

Теперь, если мы перейдем к нашему блоку POST. Сначала мы публикуем идентификатор из нашего скрытого поля внизу. Затем мы создаем нашу ссылку MySQL. Далее у нас есть первый запрос SQL, где мы обновляем запись подписчика. Затем мы проверяем каждый флажок новостной рассылки. Первый условный оператор проверяет, указывают ли данные POST, что у нас нет существующей подписки, и хочет ли пользователь подписаться на рассылку. Чтобы справиться с этим, мы собираемся выполнить SQL INSERT в нашей таблице подписок, где наш subscriber_id совпадает с user_id, который мы редактируем, а newsletter_id равен значению nlid, установленному одним из наших скрытых полей. Затем мы выполняем этот запрос SQL INSERT. Условное заявление elseif говорит, что если наша подписка существует, но флажок снят, поэтому мы отписываемся, нам нужно удалить подписку. Мы обрабатываем это с помощью запроса SQL DELETE. Чтобы сформировать наш запрос, мы устанавливаем $ subid равным опубликованному значению для нашего ‘subid’. Затем мы создаем наш запрос, удаляя запись, в которой идентификатор подписки равен нашей переменной $ subid. Затем мы выполняем запрос, устанавливаем наше сообщение об успешном сеансе и затем перенаправляем обратно на страницу наших подписчиков. Ваша конечная страница редактирования должна выглядеть примерно так: (заполнена примерами данных)


У нас есть последняя страница для работы с подписчиками в бэкэнде: страница удаления. Как и раньше, эта страница очень проста:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
# admin/subscribers_delete.php
   <?php
   require_once ‘config.php’;
   login_required();
   $id = (int) $_GET[‘id’];
   $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
   $sql = «DELETE FROM subscribers WHERE id=$id LIMIT 1»;
   $stmt = $link->query($sql) or die($link->error);
   if($link->affected_rows) {
       $_SESSION[‘success’] = «Subscriber deleted.»;
   } else {
       $_SESSION[‘error’] = ‘Nothing deleted.’;
   }
   header(‘Location: subscribers.php’);

Я скажу вам заранее, в этом разделе больше всего страниц. Сейчас мы будем работать с семью и создадим еще одну на шаге 10. Сначала мы создадим нашу таблицу сообщений с этим SQL:

1
2
3
4
5
6
7
8
CREATE TABLE `messages` (
      `id` tinyint(10) AUTO_INCREMENT,
      `subject` varchar(255),
      `leftcol` text,
      `rightcol` text,
      `template_id` tinyint(10),
      PRIMARY KEY (`id`)
   ) ENGINE=MyISAM DEFAULT CHARSET utf8;

Далее мы создадим файлы для этого шага. Создает семь файлов, каждый с именем messages.php, messages_delete.php, messages_edit.php, messages_new.php, messages_new_step2.php, messages_new_step3.php и messages_preview.php. Давайте сначала откроем messages.php и сделаем так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# admin/messages.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «messages»;
   $tab = ‘mess’;
   $table = «»;
   $messages = query(«SELECT * FROM messages ORDER BY id ASC»);
   foreach($messages as $row) {
       $slink = ‘<a href=»messages_send.php?id=’.$row[‘id’].'» title=»send message»><img src=»media/images/email_go.png» alt=»send message»/></a>’;
       $plink = ‘<a href=»messages_preview.php?id=’.$row[‘id’].'» target=»_new» title=»preview»><img src=»media/images/find.png» alt=»preview»/></a>’;
       $dlink = ‘<a href=»messages_delete.php?id=’.$row[‘id’].'» onclick=»return confirm(\’Are you sure you want to delete this message?\’);»
       $elink = ‘<a href=»messages_edit.php?id=’.$row[‘id’].'» title=»edit»><img src=»media/images/page_edit.png» alt=»edit»/></a>’;
       $table .= ‘<tr><td>’.$row[‘id’].'</td><td>’.$row[‘subject’].'</td><td><a href=»» onClick=»window.open(\’templates_preview.php?id=’.$row[‘template_id’].’\’,width=800,height=600)» title=»preview»><img src=»media/images/find.png» alt=»preview»/></a></td><td>’.$slink.’
   }
   $message = error_messages();
   $content = <<<EOF
   <a href=»messages_new.php» class=»large»>new message »</a>
   $message
   <table>
       <tr>
           <th></th>
           <th>subject</th>
           <th>template</th>
           <th></th>
       </tr>
       $table
   </table>
   EOF;
   include ‘layout.php’;

Это наша обычная таблица, за исключением того, что у нас теперь есть 4 «дополнительные» ссылки: одна для отправки сообщения, одна для предварительного просмотра, одна для редактирования и одна для удаления. Ваша страница должна выглядеть так:


Теперь мы собираемся начать работу над нашими новыми страницами. На первой странице начинаются все сообщения, а затем вы можете продолжить и ввести фактическое сообщение на следующей странице. Причина этого в том, что сначала нам нужно создать начальное сообщение в БД, чтобы мы могли найти информацию о шаблоне. Страница step2 — это, по сути, страница редактирования (в соответствии с FileMerge существует шесть различий в строках). Откройте наш новый файл и вставьте следующее:

01
02
03
04
05
06
07
08
09
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
# admin/messages_new.php
   <?php
   require_once ‘config.php’;
   login_required();
   $tab = ‘mess’;
   if(isset($_POST[‘subject’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $sql = «INSERT INTO messages (subject, template_id) VALUES ( ‘».$_POST[‘subject’].»‘ , «.$_POST[‘template’].»)»;
       $stmt = $link->query($sql) or die($link->error);
       $i = query(«SELECT id FROM messages WHERE subject='».$_POST[‘subject’].»‘ AND template_id=».$_POST[‘template’].» «);
       $id = $i[0][‘id’];
       $stmt->close;
       $_SESSION[‘success’] = «Added template.»;
       header(‘Location: messages_new_step2.php?id=’ + $id);
   }
   $title = «new message»;
   $templates = query(«SELECT id,name,columns FROM templates»);
   $tselect = ‘<select name=»template»>’;
   foreach($templates as $row) {
       $tselect .= ‘<option value=»‘.$row[‘id’].'»>’.$row[‘name’].'</option>’;
   }
   $tselect .= «</select>»;
   $content = <<<EOF
   <form action=»messages_new.php» method=’POST’>
       <p>
           <label for=»subject»>Subject:</label><br />
           <input type=’text’ name=’subject’ class=»text» />
       </p>
       <p>
           <label for=»template»>Template:</label>
           $tselect
       </p>
       <p>
           <button onclick=»»>Continue »</button>
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Эта страница очень похожа на то, как выглядят другие наши новые страницы, но эта была одно изменение в блоке POST. Сразу после выполнения SQL INSERT мы находим самый последний идентификатор вставки. Сейчас это не идеальное решение, но я предпочитаю выполнять другой запрос SQL, чтобы найти строку с помощью неиндексированных столбцов. Этот шаг должен выглядеть так:


Затем мы перенаправляем на шаг 2, поэтому давайте откроем файл:

01
02
03
04
05
06
07
08
09
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
# admin/messages_new_step2.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «new message — step 2»;
   $tab = ‘mess’;
   $id = (int) $_GET[‘id’];
 
   $mess = query(«SELECT * FROM messages WHERE id=$id»);
   $message = $mess[0];
   $subject = $message[‘subject’];
 
   $templates = query(«SELECT id,name,columns FROM templates»);
   $tselect = ‘<select name=»template»>’;
   foreach($templates as $row) {
       if($message[‘template_id’] == $row[‘id’]) {
           $selected = ‘ selected=»selected»‘;
           if($row[‘columns’] == «1») {
               $textareas = ‘<p><label for=»body»>Body: (raw html)</label><br /><textarea name=»body» rows=»35″></textarea></p>’;
           } else {
               $textareas = ‘<p><label for=»leftcol»>Left column: (raw html)</label><br /><textarea name=»leftcol» rows=»35″></textarea></p>
               <p><label for=»rightcol»>Right column: (raw html)</label><br /><textarea name=»rightcol» rows=»35″></textarea></p>’;
           }
 
       } else {$selected = »;}
       $tselect .= ‘<option value=»‘.$row[‘id’].'»‘.$selected.’>’.$row[‘name’].'</option>’;
   }
   $tselect .= ‘</select>’;
 
   // Check for a POST
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $template = query(«SELECT columns FROM templates WHERE id=».$message[‘template_id’]);
       if($template[0][‘columns’] == «1») {
           $body = mysql_real_escape_string($_POST[‘body’]);
           $sql = «UPDATE messages SET subject='».$_POST[‘subject’].»‘, leftcol=’$body’ WHERE id=$id»;
       } else {
           $leftcol = mysql_real_escape_string($_POST[‘leftcol’]);
           $rightcol = htmlentities($_POST[‘rightcol’]);
           $sql = «UPDATE messages SET subject='».$_POST[‘subject’].»‘, leftcol=’$leftcol’, rightcol=’$rightcol’ WHERE id=$id»;
       }
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
       header(‘Location: messages_new_step3.php?id=’.$id);
   }
 
   $content = <<<EOF
   <form action=»messages_new_step2.php?id=$id» method=’POST’>
       <p>
           <label for=»subject»>Subject:</label><br />
           <input type=’text’ name=’subject’ class=»text» value=»$subject»/>
       </p>
       <p>
           <label for=»template»>Template:</label>
           $tselect
       </p>
       $textareas
       <p>
           <input type=’submit’ value=’Continue »’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Надеюсь, вы получили суть всех страниц и понимаете страницу выше. У нас нормальный заголовок. Затем мы устанавливаем наш идентификатор из нашего запроса GET. Затем мы находим сообщение, с которым работаем, затем находим все шаблоны и строим выпадающий список. Мы также используем этот вид, чтобы определить, будет ли у нас один или два текстовых пространства. Затем у нас есть наш блок POST, который создает ссылку, затем проверяет, работаем ли мы с одним или двумя столбцами, и создает соответствующий запрос SQL. После этого у нас есть форма. Ваша форма должна выглядеть так:


Теперь мы перейдем к шагу 3, поэтому откройте файл и вставьте:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
# admin/messages_new_step3.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «new message — step 3»;
   $id = (int) $_GET[‘id’];
   $tab = ‘mess’;
 
   $mess = query(«SELECT * FROM messages WHERE id=$id»);
   $message = $mess[0];
   $subject = $message[‘subject’];
 
   $content = <<<EOF
   <a href=»messages_preview.php?id=$id» class=»large» target=»_new»>preview »</a><br />
   <p>Do you want to <a href=»messages.php» class=»large»>return to messages</a> or <a href=»messages_send.php?id=$id» class=»large»>send the message</a>?</p>
   EOF;
   include ‘layout.php’;
   ?>

Страница очень проста и является концом создания сообщения. Он предлагает нам несколько ссылок. Первая — это ссылка для предварительного просмотра сообщения. Следующее предлагает забрать нас домой. Третий предлагает нам отправить сообщение (Шаг 10). Страница выглядит так:


Теперь мы собираемся перейти на нашу страницу редактирования. Я не буду объяснять это, поскольку это тот же файл, что и messages_new_step2.php, так что вы можете обратиться к нему.

01
02
03
04
05
06
07
08
09
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
# admin/messages_edit.php
   <?php
   require_once ‘config.php’;
   login_required();
   $title = «edit message»;
   $id = (int) $_GET[‘id’];
   $tab = ‘mess’;
 
   $mess = query(«SELECT * FROM messages WHERE id=$id»);
   $message = $mess[0];
   $subject = $message[‘subject’];
 
   $templates = query(«SELECT id,name,columns FROM templates»);
   $tselect = ‘<select name=»template»>’;
   foreach($templates as $row) {
       if($message[‘template_id’] == $row[‘id’]) {
           $selected = ‘ selected=»selected»‘;
       } else {$selected = »;}
       $tselect .= ‘<option value=»‘.$row[‘id’].'»‘.$selected.’>’.$row[‘name’].'</option>’;
   }
   $tselect .= ‘</select>’;
 
   $mid = $message[‘template_id’];
   $template = query(«SELECT id,name,columns FROM templates WHERE id=$mid»);
   if($template[0][‘columns’] == «1») {
       $textareas = ‘<p><label for=»body»>Body: (raw html)</label><br /><textarea name=»body» rows=»35″>’.$message[‘leftcol’].'</textarea></p>’;
   } else {
       $textareas = ‘<p><label for=»leftcol»>Left column: (raw html)</label><br /><textarea name=»leftcol» rows=»35″>’.$message[‘leftcol’].'</textarea></p>
       <p><label for=»rightcol»>Right column: (raw html)</label><br /><textarea name=»rightcol» rows=»35″>’.$message[‘rightcol’].'</textarea></p>’;
   }
 
   // Check for a POST
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       if($template[0][‘columns’] == «1») {
           $body = mysql_real_escape_string($_POST[‘body’]);
           $sql = «UPDATE messages SET subject='».$_POST[‘subject’].»‘, leftcol=’$body’ WHERE id=$id»;
       } else {
           $leftcol = mysql_real_escape_string($_POST[‘leftcol’]);
           $rightcol = htmlentities($_POST[‘rightcol’]);
           $sql = «UPDATE messages SET subject='».$_POST[‘subject’].»‘, leftcol=’$leftcol’, rightcol=’$rightcol’ WHERE id=$id»;
       }
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
       $_SESSION[‘success’] = «Edited message.»;
       header(‘Location: messages.php’);
   }
 
   $content = <<<EOF
   <form action=»messages_edit.php?id=$id» method=’POST’>
       <p>
           <label for=»subject»>Subject:</label><br />
           <input type=’text’ name=’subject’ class=»text» value=»$subject»/>
       </p>
       <p>
           <label for=»template»>Template:</label>
           $tselect
       </p>
       $textareas
       <p>
           <input type=’submit’ value=’Save »’ />
           <input type=’hidden’ value=’1′ name=’submitted’ />
       </p>
   </form>
   EOF;
   include ‘layout.php’;

Страница будет выглядеть почти идентично нашему шагу 2, но текстовая область будет иметь содержимое. Теперь мы создадим страницу удаления с:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
# admin/messages_delete.php
   <?php
   require_once ‘config.php’;
   login_required();
   $id = (int) $_GET[‘id’];
   $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
   $sql = «DELETE FROM messages WHERE id=$id LIMIT 1»;
   $stmt = $link->query($sql) or die($link->error);
   if($link->affected_rows) {
       $_SESSION[‘success’] = «Message deleted.»;
   } else {
       $_SESSION[‘error’] = ‘Nothing deleted.’;
   }
   header(‘Location: messages.php’);

Эта страница также должна выглядеть знакомо. Последняя страница, над которой мы собираемся поработать на этом шаге, — это страница предварительного просмотра, поэтому откройте ее и разместите:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# admin/messages_preview.php
   <?php
   require_once ‘config.php’;
   login_required();
   $id = (int) $_GET[‘id’];
 
   $mess = query(«SELECT * FROM messages WHERE id=$id»);
   $message = $mess[0];
   $subject = $message[‘subject’];
   $tid = $message[‘template_id’];
 
   $data = query(«SELECT body,columns FROM templates WHERE id=$tid LIMIT 1»);
   $template = $data[0][‘body’];
 
   if($data[0][‘columns’] == «1») {
       $leftcol = $message[‘leftcol’];
       $body = str_replace(‘%content%’, $leftcol, $template);
   } else {
       $leftcol = $message[‘leftcol’];
       $rightcol = $message[‘rightcol’];
       $b = str_replace(‘%leftcol%’, $leftcol, $template);
       $body = str_replace(‘%rightcol%’, $rightcol, $b);
   }
   ?>
   <?php echo $body;
   <button type=»button» onclick=»self.close();»>close window</button>

Этот файл несколько отличается от того, что вы видели, поэтому я проведу вас через него. Во-первых, у нас нормальный заголовок. Затем мы находим текущее сообщение, с которым мы работаем, и устанавливаем несколько переменных для результатов. Затем мы находим шаблон, с которым мы работаем, и устанавливаем переменную, равную телу. Далее у нас есть условный оператор, который проверяет количество столбцов в шаблоне. Если это так, мы используем функцию PHP str_replace, чтобы заменить имеющийся у нас тег% content% нашим фактическим контентом. В противном случае мы сначала выполняем str_replace для левого столбца, а затем в результате этого снова выполняем str_replace для правого столбца. Теперь мы готовы продолжить на фронтэнде.


Мы наконец добрались до фронтэнда! Для этого шага и только для этого шага я предполагаю, что файлы, с которыми мы работаем, находятся в корне проекта (поэтому не в папке администратора, а в той, которая ее содержит). Мы собираемся работать с четырьмя файлами здесь, поэтому давайте создадим index.php, preferences.php, subscribe.php и файл style.css. Сначала откройте наш файл index.php и вставьте:

01
02
03
04
05
06
07
08
09
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
# index.php
   <?php
   require_once ‘admin/config.php’;
   $newsletters = query(«SELECT * FROM newsletters WHERE visible=1»);
   $subscriptions = »;
   foreach($newsletters as $nl) {
       $subscriptions .= ‘
       <input type=»checkbox» name=»newsletter[‘.$nl[«id»].’][subscribe]» value=»true» ‘.$checked.’/>
       <label for=»newsletter[‘.$nl[«id»].’]»>’.$nl[‘name’].'</label>
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][nlid]» value=»‘.$nl[‘id’].'» /><br />
       ‘.$nl[«description»].'<br />
       ‘;
   }
   ?>
   <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»>
   <html xmlns=»http://www.w3.org/1999/xhtml» >
       <head>
           <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
 
           <title>my newsletters</title>
           <!— Stylesheets —>
           <link rel=»stylesheet» href=»style.css» type=»text/css» media=»all» />
       </head>
       <body>
           <div id=»header»>
               <h1>my newsletters</h1>
           </div>
           <div id=»container»>
               <h3>Subscribe to our newsletters!</h3>
               <form action=»subscribe.php» method=»POST»>
                   <p>
                       <label for=»name»>Name:</label><br />
                       <input type=’text’ name=’name’ class=»text» />
                   </p>
                   <p>
                       <label for=»email»>Email</label><br />
                       <input type=»text» name=»email» class=»text» />
                   </p>
                   <p>
                       <strong>Newsletters:</strong><br />
                       <?php echo $subscriptions;
                   </p>
                   <p>
                       <input type=’submit’ value=’Subscribe »’ />
                       <input type=’hidden’ value=’1′ name=’submitted’ />
                   </p>
               </form>
           </div>
       </body>
   </html>

Сначала я объясню страницу, а затем мы доберемся до рисунка и стиля страницы. В верхнем разделе PHP нам нужен наш файл config.php (теперь он находится в каталоге admin), затем найдите все наши общедоступные информационные бюллетени и создайте массив флажков. Вы заметите, что мы не обрабатываем данные POST здесь, и я решил сделать это в нашем subscribe.php, и мы вернемся к этому, но сначала давайте стилизовать страницу. В настоящее время страница должна выглядеть следующим образом:


Сначала я добавил файл сброса 960.gs, как в другой таблице стилей. Затем я добавил три следующих стиля, чтобы дизайн выглядел так:

1
2
3
4
5
# style.css
   #header, #container {width:65%;margin:0 auto;
   #container {background:#ccc;}
   form input.text {width:95%;
   #message.success {border:solid 1px #349534;

Итак, теперь, когда у нас есть чистая и простая страница, мы продолжим работу и будем работать с нашим файлом subscribe.php. Идите вперед, откройте файл и вставьте:

01
02
03
04
05
06
07
08
09
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
# subscribe.php
   <?php
   require_once ‘admin/config.php’;
 
   if(isset($_POST[‘submitted’])) {
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $name = $_POST[‘name’];
       $email = $_POST[’email’];
 
       $sql = «INSERT INTO subscribers (name, email) VALUES (‘$name’, ‘$email’)»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
 
       $sql = «SELECT id FROM subscribers WHERE name=’$name’ AND email=’$email’ LIMIT 1»;
       $subscriber = query($sql);
       $id = $subscriber[0][‘id’];
 
       foreach($_POST[‘newsletter’] as $n) {
           if($n[‘subscribe’] == «true») { // If we want to subscribe but the record doesnt exist
               $nlid = $n[‘nlid’];
               $sql = «INSERT INTO subscriptions (subscriber_id, newsletter_id) VALUES (‘$id’, ‘$nlid’)»;
               $stmt = $link->query($sql) or die($link->error);
               $stmt->close;
           }
       }
   } else {header(‘Location: index.php’);}
   ?>
   <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»>
   <html xmlns=»http://www.w3.org/1999/xhtml» >
       <head>
           <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
 
           <title>my newsletters</title>
           <!— Stylesheets —>
           <link rel=»stylesheet» href=»style.css» type=»text/css» media=»all» />
       </head>
       <body>
           <div id=»header»>
               <h1>my newsletters</h1>
           </div>
           <div id=»container»>
               <h3>Thank you for subscribing!</h3>
           </div>
       </body>
   </html>

Эта страница очень похожа на нашу страницу редактирования подписчиков, но здесь не происходит запросов DELETE SQL. Мы просто проверяем, чтобы у нас были все данные POST. Затем мы устанавливаем несколько переменных для наших данных POSTed, а затем создаем и выполняем запрос SQL INSERT, чтобы добавить пользователя в нашу таблицу подписчиков. После чего мы выполняем SQL-запрос, чтобы найти только что созданного подписчика (на этот раз у меня не работал insert_id). Затем мы перебираем все бюллетени POSTed и проверяем, хотим ли мы подписаться на них, и выполняем SQL INSERT, когда это необходимо. Если все пойдет по плану, вы увидите хороший экран, подобный показанному ниже:


У нас есть на последней странице здесь, чтобы работать, и это файл Preferences.php. Здесь пользователь может редактировать свою подписку на электронную почту. Я собираюсь разделить страницу на две части. Сначала у нас есть наш блок PHP:

01
02
03
04
05
06
07
08
09
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
# preferences.php
   <?php
   require_once ‘admin/config.php’;
 
   if(isset($_POST[‘submitted’])) {
       $id = (int) $_POST[‘id’];
       $link = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD, DB_NAME) or die(‘There was a problem connecting to the database.’);
       $sql = «UPDATE subscribers SET name='».$_POST[‘name’].»‘, email='».$_POST[’email’].»‘ WHERE id=$id»;
       $stmt = $link->query($sql) or die($link->error);
       $stmt->close;
 
       foreach($_POST[‘newsletter’] as $n) {
           if($n[‘exists’] != ‘1’ && $n[‘subscribe’] == «true») { // If we want to subscribe but the record doesnt exist
               $nlid = $n[‘nlid’];
               $sql = «INSERT INTO subscriptions (subscriber_id, newsletter_id) VALUES (‘$id’, ‘$nlid’)»;
               $stmt = $link->query($sql) or die($link->error);
               $stmt->close;
           } elseif ($n[‘exists’] == ‘1’ && $n[‘subscribe’] != «true») {// Else if we had an exits but we want to unsubscribe
               $subid = $n[‘subid’];
               $sql = «DELETE FROM subscriptions WHERE id=$subid LIMIT 1»;
               $stmt = $link->query($sql) or die($link->error);
               $stmt->close;
           }
       }
       $_SESSION[‘success’] = «Preferences saved.»;
   }
 
   if(isset($_GET[’email’])) {$email = $_GET[’email’];
 
   $subscriber = query(«SELECT * FROM subscribers WHERE email=’$email'»);
   if($subscriber || $display == ‘find’) {
       $id = $subscriber[0][‘id’];
       $name = $subscriber[0][‘name’];
       $email = $subscriber[0][’email’];
   } else {header(‘Location: index.php’);}
 
   $newsletters = query(«SELECT * FROM newsletters WHERE visible=1»);
   $subs = query(«SELECT * FROM subscriptions WHERE subscriber_id='».$id.»‘»);
   $subscriptions = »;
   foreach($newsletters as $nl) {
       $s = false;
       $subid = »;
       foreach($subs as $sub) {
           if($sub[‘newsletter_id’] == $nl[‘id’]) {$s = true;
       }
       $checked = ($s == true) ?
       $subscriptions .= ‘
       <input type=»checkbox» name=»newsletter[‘.$nl[«id»].’][subscribe]» value=»true» ‘.$checked.’/>
       <label for=»newsletter[‘.$nl[«id»].’]»>’.$nl[‘name’].'</label>
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][exists]» value=»‘.$s.'» />
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][nlid]» value=»‘.$nl[‘id’].'» />
       <input type=»hidden» name=»newsletter[‘.$nl[«id»].’][subid]» value=»‘.$subid.'» /><br />
       ‘;
   }
   $message = error_messages();
   ?>

В этом блоке многое происходит. Сначала мы включаем наш конфигурационный файл. Затем мы проверяем наличие POST и, если оно у нас есть, мы обновляем нашу базу данных. Эта часть точно скопирована из нашего файла subs_edit.php, поэтому вы можете найти здесь более подробное объяснение. Далее, в зависимости от того, есть ли у нас запрос get, мы устанавливаем нашу переменную (эта переменная используется в разделе HTML страницы). Затем мы ищем подписчика с этим электронным письмом, и если он существует или мы показываем часть поиска, мы продолжаем, в противном случае нас перенаправляют домой. Затем мы находим все наши информационные бюллетени и все подписки подписчиков, а затем создаем нашу форму флажка. Часть HTML выглядит так:

01
02
03
04
05
06
07
08
09
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
# preferences.php
   <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.1//EN» «http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»>
   <html xmlns=»http://www.w3.org/1999/xhtml» >
       <head>
           <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />
 
           <title>my newsletters — my preferences</title>
           <!— Stylesheets —>
           <link rel=»stylesheet» href=»style.css» type=»text/css» media=»all» />
       </head>
       <body>
           <div id=»header»>
               <h1>my newsletters</h1>
           </div>
           <div id=»container»>
               <h3>my preferences</h3>
               <?php if($display == ‘form’) {?>
               <form action=»preferences.php» method=»POST»>
                   <p>
                       <label for=»name»>Name:</label><br />
                       <input type=’text’ name=’name’ class=»text» value=»<?php echo $name; ?>»/>
                   </p>
                   <p>
                       <label for=»email»>Email</label><br />
                       <input type=»text» name=»email» class=»text» value=»<?php echo $email; ?>»/>
                   </p>
                   <p>
                       <strong>Newsletters:</strong><br />
                       <?php echo $subscriptions;
                   </p>
                   <p>
                       <input type=’submit’ value=’Save my preferences »’ />
                       <input type=’hidden’ value=’1′ name=’submitted’ />
                       <input type=’hidden’ value='<?php echo $id;
                   </p>
               </form>
               <?php } else { ?>
               <?php echo $message;
               <form action=’preferences.php’ method=»get»>
                   <p>
                       <label for=»email»>Email</label><br />
                       <input type=»text» name=»email» class=»text» />
                   </p>
                   <p>
                       <input type=’submit’ value=’Find »’ />
                   </p>
 
               </form>
               <?php } ?>
           </div>
       </body>
   </html>

В нашем HTML-блоке у нас есть две формы и несколько PHP, чтобы выбрать какую из них отображать. Верхняя форма — это форма, которую пользователь видит, была ли найдена запись в базе данных. Вторая форма для ввода вашей электронной почты и поиска системой. Вторая форма выглядит так:


И первое выглядит так:


И вторая форма после того, как мы сохранили наши предпочтения:


Теперь, когда мы закончили интерфейс, у нас есть последний шаг: отправка писем!


Наш последний шаг — работа на странице, чтобы отправить наше сообщение. Мы будем работать в директории администратора, и будет создан только один файл. Создайте наш файл messages_send.php и поместите в него следующее:

1
# admin/messages_send.php <?php require_once ‘config.php’;

В первой части нам снова требуется наш конфиг, затем убедитесь, что пользователь вошел в систему, затем наш заголовок, убедитесь, что наш идентификатор является целым числом, и затем установите нашу вкладку. Далее у нас есть наш сложный почтовый блок. Сначала мы настроили наш базовый запрос и выполнили только то, что вернуло бы 0 записей, что хорошо, потому что это означает, что ни один пользователь не будет отправлять рассылку Затем мы перебираем каждую рассылку, на которую хотим отправить, и находим все подписки на эту рассылку. Затем мы создаем строку, которая будет добавлена ​​к нашему исходному запросу SQL, чтобы мы могли найти каждого подписчика. Теперь мы выполняем этот запрос и создаем массив, в котором ключами являются электронные письма, а имя — это значение, и это помогает нам использовать имена, когда пользователь просматривает электронную почту в своем почтовом приложении, показывая TO: в качестве своего имени. Затем мы находим сообщение, с которым мы работаем, и устанавливаем идентификатор темы, сообщения и шаблона в переменные. Затем мы находим наш шаблон и устанавливаем тело в переменную. Затем мы используем тот же код из предварительного просмотра сообщения, чтобы заменить строки внутри шаблона на части сообщения. Затем мы вызываем нашу еще не созданную функцию send_email_to_mass и затем перенаправляем домой.

Оставляя наш блок POST, мы создаем тот же список флажков новостных рассылок, чтобы администратор мог выбрать, кому он хочет отправить сообщение. Тогда у нас есть простая форма, которая выглядит следующим образом:


Теперь откройте наш файл classes.php и добавьте следующую функцию:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
# admin/classes.php
   // EMAIL
   function send_email_to_mass($from, $recipients, $body, $subject) {
       require_once ‘swift/lib/swift_required.php’;
 
       $transport = Swift_MailTransport::newInstance();
       $mailer = Swift_Mailer::newInstance($transport) or die(‘Error creating mailer.’);
       $message = Swift_Message::newInstance($subject)
           ->setFrom($from)
           ->setTo($recipients)
           ->setBody($body, ‘text/html’) or die(‘error here.’);
       $result = $mailer->batchSend($message);
 
       return true;
   }

Итак, во-первых, у нас есть объявление функции, и она ожидает, что ему будут переданы четыре переменные, от ,ополучателей, тела и субъекта. Далее нам требуется файл sqift_required.php нашей библиотеки Swift Mailer. Затем мы создаем новый почтовый транспорт (для этого используется функция почты PHP, поэтому она будет отправляться с вашего локального компьютера, документацию по трем типам транспорта см. В документации ). Затем мы создаем почтовую программу, используя этот транспорт. Затем мы создаем новое сообщение из нашей темы, затем устанавливаем наши from, to и body. Затем мы используем функцию batch_send, чтобы каждый получатель видел себя только в электронном письме, а никто другой.

Есть один возможный недостаток в том, чтобы делать это так, как я, а именно: если вы отправляете много сообщений, загрузка страницы может длиться вечно. Решением этой проблемы было бы выполнение AJAX-запроса Javascript для отправки каждого сообщения, но я не буду описывать это здесь. Теперь, когда мы закончили работу над отправкой сообщений, мы собираемся оживить домашнюю страницу, и тогда мы будем готовы!


Когда вы загружаете индекс администратора, страница на самом деле ничего не делает. Я хочу иметь некоторую статистику на нашей домашней странице, и мы, наконец, будем использовать функцию count_query. Откройте файл индекса администратора и измените его так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
# admin/index.php
   <?php
   require_once ‘config.php’;
   login_required();
   $users = count_query(«SELECT COUNT(*) AS num FROM users»);
   $emails = count_query(«SELECT COUNT(*) AS num FROM subscribers»);
   $subs = count_query(«SELECT COUNT(*) AS num FROM subscriptions»);
   $nls = count_query(«SELECT COUNT(*) AS num FROM newsletters»);
   $mess = count_query(«SELECT COUNT(*) AS num FROM messages»);
   $temps = count_query(«SELECT COUNT(*) AS num FROM templates»);
   $title = «Home!»;
   $content = <<<EOF
   <h3>current stats</h3>
   <p>$users user registered</p>
   <p>$emails subscribers</p>
   <p>$subs newsletter subscriptions</p>
   <p>$nls newsletters</p>
   <p>$mess messages</p>
   <p>$temps templates</p>
   EOF;
   include ‘layout.php’;

Страница очень проста. Нам нужен наш конфиг, убедитесь, что мы вошли в систему, затем мы выполним шесть запросов на подсчет, по одному для каждой из наших таблиц, а затем выведем их. Вот как выглядит последняя страница:



Поздравляю, вы закончили! Надеюсь, вам понравился урок, и он не слишком вас смутил 🙂