Как управлять страницами / формами в PHP-приложении? - PullRequest
0 голосов
/ 24 февраля 2012

Я новичок в PHP, и я пытаюсь написать простой интернет-магазин.

Допустим, есть индексный файл, подобный этому:

<?php  
require_once '/inc/db.php';
$db = new Db();
?>  

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
        <div id="header"><?php require_once("header.php"); ?></div>

        <div id="content">
                <?php
                    // i have no idea what to put here
                ?>
        </div>

        <div id="footer"><?php require_once("footer.php"); ?></div>
</body>
</html>

Я создал файлы "add_category.php" и "add_product.php ", они содержат HTML-формы.Они работают, но я хочу отобразить эту форму в содержимом div, и сохранить данные в базе данных, и у меня есть проблема.Я хочу применить свой глобальный заголовок, нижний колонтитул и т. Д. И не хочу копировать макет из индексного файла в каждую форму моего приложения.

Я понятия не имею:

  • как отображать разные "страницы" в моем (сейчас я пытаюсь управлять с помощью ветвления переключателя данных $ _POST ['action'], но я не знаю, это лучший способ)

  • куда мне "отправлять" данные с сайта?я имею в виду атрибут "действие" в.Другими словами - где я должен обрабатывать данные, сохраняя постоянную разметку, которая «определена» в index.php

У меня есть несколько книг по PHP, но нет книги, в которой говорится, как создавать приложения.,Все они о языке PHP и простых задачах на отдельных страницах / файлах.

Мне нужен простой шаблон / пример / статья об управлении формами / страницами и взаимодействием между ними (например, POST),Пытался учиться на источниках Wordpress, но для меня это слишком сложно анализировать (большой сложный реестр, кеширование объектов и т. Д.).

У меня нет проблем с программированием в общем (я программист приложений для Windows).

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

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

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

Пример макета будет выглядеть так: страница:

<?
//include our settings, connect to database etc.
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php';
//getting required data
$DATA=dbgetarr("SELECT * FROM links");
$pagetitle = "Links to friend sites";
//etc
//and then call a template:
$tpl = "links.tpl.php";
include "template.php";
?>

выводит ничего , но собирает только необходимые данные и вызывает шаблон:

template.php который является вашим основным шаблоном сайта,

состоит из вашего верхнего и нижнего колонтитула:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My site. <?=$pagetitle?></title>
</head>
<body>
<div id="page">
<? include $tpl ?>
</div>
</body>
</html>

и вызывает фактический шаблон страницы:

<h2><?=$pagetitle?></h2>
<ul>
<? foreach($DATA as $row): ?>
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
<? endforeach ?>
<ul>

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

<?  
if ($_SERVER['REQUEST_METHOD']=='POST') {  

  $err = array();
  //performing all validations and raising corresponding errors
  if (empty($_POST['name']) $err[] = "Username field is required";  
  if (empty($_POST['text']) $err[] = "Comments field is required";  

  if (!$err) {  
    //if no errors - saving data and redirect
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
  }  else {
    // all field values should be escaped according to HTML standard
    foreach ($_POST as $key => $val) {
      $form[$key] = htmlspecialchars($val);
    }
} else {
  $form['name'] = $form['comments'] = '';  
}
$tpl = "form.tpl.php";
include "template.php";
?>  

он обработает ваши данные и либо перенаправит на ту же страницу в случае успеха, либо покажет заполненную форму при ошибке

Основная идея этого заключается в удобной обработке форм и разделении бизнес-логики / логики отображения при сохранении наиболее естественного макета сайта - отдельных файлов для разных модулей сайта, но общего дизайна.

1 голос
/ 24 февраля 2012

Просто передайте GET-параметр ?page=add_product или ?page=add_category вашему index.php и включите соответствующий php-скрипт:

<?php  
require_once '/inc/db.php';
$db = new Db();

// if no page-parameter was send, have a default page to display.
define("DEFAULT_PAGE", "my_default_page.php");

if (isset($_GET["page"]))
{
    switch ($_GET["page"])
    {
        case "add_product": $page = "add_product.php"; break;
        case "add_category": $page = "add_category.php"; break;
        // add more cases here
        default : $page = DEFAULT_PAGE;
    }
}
else
    $page = DEFAULT_PAGE;
?>  

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
        <div id="header"><?php require_once("header.php"); ?></div>

        <div id="content">
                <?php
                    require $page;
                ?>
        </div>

        <div id="footer"><?php require_once("footer.php"); ?></div>
</body>
</html>

Редактировать: MVC-подход:

/index.php
/controllers/home.php               Default page with some welcome stuff.
/controllers/new_product.php        Display form for creating a product.
/controllers/create_product.php     Process POST-data and create a product.
/controllers/new_category.php       Display form for creating a category.

index.php:

define("DEFAULT_PAGE", dirname(__FILE__)."/controllers/home.php");

// Did the user pass page?
if (isset($_GET["page"])
// Does page contain a valid controller name?
&&  preg_match("~^[a-zA-Z_]+$~D", $_GET["page"])
// Does this controller exist?
&&  file_exists(dirname(__FILE__)."/controllers/".$_GET["page"].".php"))
{
    // Controller exists.
    $page = dirname(__FILE__)."/controllers/".$_GET["page"].".php";
}
else
    $page = DEFAULT_PAGE;
0 голосов
/ 24 февраля 2012

Начните с основ: http://www.tizag.com/phpT/forms.php

Сначала вы, возможно, захотите опубликовать свои данные в своей форме, поэтому добавьте в свою форму action = "add_category.php" и method = "post".Всегда лучше POST, чтобы избежать ошибок при передаче данных в URL (GET).

Затем в части PHP сначала проверьте переменную $ _SERVER ['REQUEST_METHOD'].Если написано «POST», это означает, что форма была отправлена.Проверьте все свои переменные, используя isset (), чтобы избежать php-уведомлений, и сделайте любую проверку, которую вам нужно сделать для этих переменных.Например: $ _POST ['category']> 0.

Я обычно храню все свои ошибки в одном массиве $ errors и отображаю ошибки, основанные на предыдущей проверке.

count ($ errors) == 0 означает, что у вас нет ошибок, вы можете вставить / обновить базу данных и показать пользователю сообщение о том, что вставка выполнена, или перенаправить его с помощью заголовка Location: например, в список категорий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...