Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР): Частина 2. Створення головного керуючого сценарію

  1. Серія контенту:
  2. Цей контент є частиною серії: Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР)
  3. Головний керуючий сценарій
  4. Малюнок 1.
  5. висновки
  6. Ресурси для скачування

Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР)

Серія контенту:

Цей контент є частиною # з серії # статей: Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР)

https://www.ibm.com/developerworks/ru/library/?series_title_by=**auto**

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР)

Слідкуйте за виходом нових статей цієї серії.

Маючи працездатний сайт (Інтернет-магазин) з деяким числом передплатників (або користувачів) дуже корисно організувати взаємодію з ними у вигляді постійного контакту через систему розсилки інформаційних бюлетенів.

В попередній частині циклу був описаний порядок функціонування системи, її функціональні можливості, а також процес створення бази даних під навчальний проект. Крім цього, була приведена бібліотека функцій, що відповідають за реалізацію виведення інформації в браузер користувача системи. У другій частині циклу буде описаний головний керуючий сценарій системи.

Головний керуючий сценарій

Як і раніше, на всьому протязі всіх циклів, в цьому проекті також використовується підхід, заснований на управлінні подіями. Наведений нижче є головним двигуном всієї системи. Функціонально в ньому можна виділити чотири основні розділи:

  1. первісна обробка даних: реалізує обробку, виконувану до відправки заголовків;
  2. формування і висновок головних заголовків: створюють і відправляють початок HTML документа;
  3. виконання дії: створює відповідь на введені подія. Як і в раніше розглянутих циклах, сама подія міститься в змінній $ action;
  4. формування і вивід нижнього колонтитула.

Найбільша кількість обробок виконується саме в цьому файлі, тому він і названий головним керуючим сценарієм. В процесі своєї роботи він звертається до деякому іншим бібліотекам функцій. Всі їх тут привести не вдасться через дуже великого обсягу та обмежень на розмір статті, але найбільш важливі будуть приведені, а решта, так чи інакше, розглядалися в раніше написаних циклах по загальній темі «Реальні веб-проекти на PHP і MySQL ...». Так що доповнити відсутню тим, хто уважно відстежував всі цикли по цій темі, не складе особливих труднощів.

Код головного керуючого сценарію наведено нижче по тексту:

<? Php / ********************************************** ************************ Розділ 1. Первісна обробка даних ******************* ************************************************** / require_once ( 'include_fns.php'); session_start (); $ Action = $ _GET [ 'action']; $ Buttons = array (); // Додавати до цього рядка, якщо щось виконується перед виведенням заголовка $ status = ''; // Необхідно спочатку обробити запити на вхід і вихід з системи if ($ _ POST [ 'email'] && $ _ POST [ 'password']) {$ login = login ($ _ POST [ 'email'], $ _POST [ 'password' ]); if ($ login == 'admin') {$ status. = "<p> <b>". get_real_name ($ _ POST [ 'email']). "</ B> увійшов в систему". "Успішно як <b> адміністратор </ b> </ p> <br /> <br /> <br /> <br /> <br />"; $ _SESSION [ 'admin_user'] = $ _POST [ 'email']; } Else if ($ login == 'normal') {$ status. = "<P> <b>". Get_real_name ($ _ POST [ 'email']). "</ B> увійшов в систему". "Успішно. </ p> <br /> <br /> "; $ _SESSION [ 'normal_user'] = $ _POST [ 'email']; } Else {$ status. = "<P> Вибачте, вхід в систему з даними адресою електронної пошти та паролем у вас не вийде! </ P> <br />"; }} If ($ action == 'log-out') {unset ($ action); unset ($ _ SESSION); session_destroy (); } / ************************************************ ********************** Розділ 2. Формування і висновок головних заголовків ******************* ************************************************** / // Налаштувати кнопки, які будуть відображатися в панелі інструментів if (check_normal_user ()) {// Для звичайного користувача $ buttons [0] = 'change-password'; $ Buttons [1] = 'account-settings'; $ Buttons [2] = 'show-my-lists'; $ Buttons [3] = 'show-other-lists'; $ Buttons [4] = 'log-out'; } Else if (check_admin_user ()) {// Для адміністратора $ buttons [0] = 'change-password'; $ Buttons [1] = 'create-list'; $ Buttons [2] = 'create-mail'; $ Buttons [3] = 'view-mail'; $ Buttons [4] = 'log-out'; $ Buttons [5] = 'show-all-lists'; $ Buttons [6] = 'show-my-lists'; $ Buttons [7] = 'show-other-lists'; } Else {// Якщо вхід в систему ще не був здійснений $ buttons [0] = 'new-account'; $ Buttons [1] = 'show-all-lists'; $ Buttons [4] = 'log-in'; } If ($ action) {// Вивести заголовок з ім'ям програми і описом сторінки або // дії do_html_header ( 'швидка розсилка -' .format_action ($ action)); } Else {// Вивести заголовок тільки з ім'ям програми do_html_header ( 'швидка розсилка'); } Display_toolbar ($ buttons); // Вивести будь-який текст, що згенерував функціями, які викликані до // виклику заголовка echo $ status; / ************************************************* ********************* Розділ 3. Виконання дії *********************** ********************************************** / // До входу в систему доступні тільки ці дії switch ($ action) {case 'new-account': {// Вбити змінну сеансу session_destroy (); display_account_form (); break; } Case 'store-account': {if (store_account ($ _ SESSION [ 'normal_user'], $ _SESSION [ 'admin_user'], $ _POST)) $ action = ''; if (! check_logged_in ()) display_login_form ($ action); break; } Case 'show-all-lists': {display_items ( 'Все списки', get_all_lists (), 'information', 'show-archive', ''); break; } Case 'show-archive': {display_items ( 'Архів для' .get_list_name ($ _ GET [ 'id']), get_archive ($ _ GET [ 'id']), 'view-html', 'view-text', ''); break; } Case 'information': {display_information ($ _ GET [ 'id']); break; } Default: {if (! Check_logged_in ()) display_login_form ($ action); break; }} // Все інші дії вимагають обов'язкового входу в систему if (check_logged_in ()) {switch ($ action) {case 'account-settings': {display_account_form (get_email (), get_real_name (get_email ()), get_mimetype (get_email ( ))); break; } Case 'show-other-lists': {display_items ( 'Непідписані списки', get_unsubscribed_lists (get_email ()), 'information', 'show-archive', 'subscribe'); break; } Case 'subscribe': {subscribe (get_email (), $ _GET [ 'id']); display_items ( 'Підписані списки', get_subscribed_lists (get_email ()), 'information', 'show-archive', 'unsubscribe'); break; } Case 'unsubscribe': {unsubscribe (get_email (), $ _GET [ 'id']); display_items ( 'Підписані списки', get_subscribed_lists (get_email ()), 'information', 'show-archive', 'unsubscribe'); break; } Case '': case 'show-my-lists': {display_items ( 'Підписані списки', get_subscribed_lists (get_email ()), 'information', 'show-archive', 'unsubscribe'); break; } Case 'change-password': {display_password_form (); break; } Case 'store-change-password': {if (change_password (get_email (), $ _POST [ 'old_passwd'], $ _POST [ 'new_passwd'], $ _POST [ 'new_passwd2'])) {echo '<p> OK: Пароль змінений. </ p> <br /> <br /> <br /> <br /> <br /> <br /> '; } Else {echo '<p> Вибачте, ваш пароль не може бути змінений. </ P>'; display_password_form (); } Break; }}} // Наступні дії доступні тільки адміністратору if (check_admin_user ()) {switch ($ action) {case 'create-mail': {display_mail_form (get_email ()); break; } Case 'create-list': {display_list_form (get_email ()); break; } Case 'store-list': {if (store_list ($ _ SESSION [ 'admin_user'], $ _POST)) {echo '<p> Новий список доданий </ p> <br />'; display_items ( 'Все списки', get_all_lists (), 'information', 'show-archive', ''); } Else echo '<p> Неможливо створити список. Будь ласка, повторіть '.'попитку. </ P> <br /> <br /> <br /> <br /> <br />'; break; } Case 'send': {send ($ _ GET [ 'id'], $ _SESSION [ 'admin_user']); break; } Case 'view-mail': {display_items ( 'Невідправлені повідомлення', get_unsent_mail (get_email ()), 'preview-html', 'preview-text', 'send'); break; }}} / ********************************************** ************************ Розділ 4. Висновок нижнього колонтитула ******************* ************************************************** / do_html_footer (); ?>

На етапі обробки заголовків створюються кнопки меню і за допомогою функції формування заголовка do_html_header () ці заголовки і відображаються.

Код функції do_html_header () наводиться нижче по тексту:

function do_html_header ($ title = '') {// Виводить HTML-заголовок global $ table_width; // Вивести панель заголовка?&gt; <Html> <head> <title> <? Php echo $ title?> </ Title> <style> h1 {font-family: Arial, Helvetica, sans-serif; font-size: 32; font-weight: bold; color: white; margin-bottom: 0} h2 {margin-bottom: 0} b {font-family: Arial, Helvetica, sans-serif; font-size: 14; font-weight: bold; color: black} th {font-family: Arial, Helvetica, sans-serif; font-size: 18 font-weight: bold; color: white; } Body, li, td, p {font-family: Arial, Helvetica, sans-serif; font-size: 14; margin = 5px} a {color: # 000000} </ style> </ head> <body> <table width = <? php echo $ table_width?> cellspacing = 0 cellpadding = 6 border = 0> <tr> <td bgcolor = "# 5B69A6" width = 73> <img src = "images / pyramid.gif" width = 73 height = 49 alt = "" valign = "middle" /> </ td> <td bgcolor = "# 5B69A6" width = <? php echo $ table_width-73;? &gt;> <h1> <? php echo $ title?> </ h1> </ td> </ tr> </ table> <table width = <? php echo $ table_width ?> cellpadding = 0 cellspacing = 0 border = 0> <tr> <td> <? php}

Головний сценарій реалізує відповіді на дії користувача. Ці дії підрозділяються на три основні частини. Користувач не ввійшов і це пересічний користувач (див. Рис. 1), користувач увійшов в систему (див. Рис. 2), і в систему увійшов привілейований користувач (адміністратор) - (див. Рис. 3). Дії, що виконуються простими користувачами, відрізняються від таких же, але для суперкористувача. Можливість виконання якихось конкретних дій користувачем у другому і третьому випадку перевіряються функціями check_logged_in () і check_admin_user (). Їх код, а також код інших функцій, що відповідають за авторизацію і аутентифікацію користувача наводиться нижче по тексту:

<? Php function login ($ email, $ password) // Перевіряє за допомогою доступу до бази даних передані ім'я користувача // і пароль. Якщо збіг знайдено, повертає тип реєстрації, // в іншому випадку - значення false {// Підключитися до бази даних $ conn = db_connect (); if (! $ conn) return 0; $ Query = "select admin from subscribers where email = '$ email' and password = sha1 ( '$ password')"; $ Result = $ conn-> query ($ query); if (! $ result) return false; if ($ result-> num_rows <1) return false; $ Row = $ result-> fetch_array (); if ($ row [0] == 1) return 'admin'; else return 'normal'; } Function check_logged_in () {return (check_normal_user () || check_admin_user ()); } Function get_email () {if (isset ($ _ SESSION [ 'normal_user'])) return $ _SESSION [ 'normal_user']; if (isset ($ _ SESSION [ 'admin_user'])) return $ _SESSION [ 'admin_user']; return false; } Function change_password ($ email, $ old_password, $ new_password, $ new_password_conf) // Змінює старий пароль $ old_password для адреси $ email на новий пароль // $ new_password. Повертає значення true або false. {// Якщо старий пароль коректний, змінити пароль на $ new_password // і повернути значення true. // В іншому випадку повернути значення false. if (login ($ email, $ old_password)) {if ($ new_password == $ new_password_conf) {if (! ($ conn = db_connect ())) return false; $ Query = "update subscribers set password = sha1 ( '$ new_password') where email = '$ email'"; $ Result = $ conn-> query ($ query); return $ result; } Else echo '<p> Передано вами паролі не збігаються. </ P>'; } Else echo '<p> Старий пароль вказано невірно. </ P>'; return false; // старий пароль вказано невірно} function check_normal_user () // Перевіряє, увійшов відвідувач в систему, і повідомляє його, якщо немає {if (isset ($ _ SESSION [ 'normal_user'])) return true; else return false; } Function check_admin_user () // Перевіряє, увійшов відвідувач в систему, і повідомляє його, якщо немає {if (isset ($ _ SESSION [ 'admin_user'])) return true; else return false; }?>
Малюнок 1.
Малюнок 2.
Малюнок 3.

Для перевірки того, увійшов користувач в систему чи ні, в цих функціях використовуються змінні сеансу normal_user і admin_user. В кінці роботи головного керуючого сценарію формується нижній колонтитул. Код, який його формує наводиться нижче:

function do_html_footer () {// Виводить завершальні HTML-дескриптори global $ table_width; ?> </ Td> </ tr> </ table> <table width = <? Php echo $ table_width?> Cellspacing = 0 cellpadding = 6 border = 0> <tr> <td bgcolor = "# 5B69A6" align = " right "> <img src =" images / pyramid.gif "width = 73 height = 49 alt =" "valign =" middle "/> </ td> </ tr> </ table> </ body> </ html > <? php}

висновки

У статтях описана вступна частина для навчального проекту диспетчера списків розсилки, логіка роботи майбутньої системи і її компонентів. Наведено код головного керуючого сценарію системи, його ядра (движка), описана структура і логіка роботи.

Дано опис функцій, що відповідають за ідентифікацію входить в систему користувача. Залежно від його статусу система змінює свій інтерфейс і відповідно пропоновані функціональні можливості.

Наведено і описані функції виведення тексту в колонтитулах, як основних частин для візуалізації виведеної сторінки.

Ресурси для скачування

Схожі теми

  • Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР). Частина 1 .
  • Реальні веб-проекти на PHP і MySQL. Розробка диспетчера списків розсилки (ДСР). Частина 2 .

Підпишіть мене на повідомлення до коментарів

Com/developerworks/ru/library/?
4. Висновок нижнього колонтитула ******************* ************************************************** / do_html_footer (); ?
Gt; <Html> <head> <title> <?
Php echo $ title?
Php echo $ table_width?
Gif" width = 73 height = 49 alt = "" valign = "middle" /> </ td> <td bgcolor = "# 5B69A6" width = <?
Php echo $ table_width-73;?
Gt;> <h1> <?
Php echo $ title?