Научи РНР - Обобщение 1-5


Вече преминахте основата на езика. С нея може да правите проста динамичност на една страница. Тъй като до сега не е даван реален пример, е добре да се запознаете с такъв. Въпреки това не смятам че трябва да давам елементарен пример, след което, в следващите уроци, да призная, че той е илюстрация на лошо организиран пример. Още в началото е добре да усвоите някой принципни положения на кода, които ще срещате и в последствие.
Нека припомня, че силата ви на програмист, зависи от това, колко бързо решавате възложени задачи. Както във футбола, така и тук, е важно да познавате противника, т.е. проблемите в нашия случай. Когато създавате едно приложение, какво може да се случи във времето с него?

- да се наложи промяна на външния му вид
- да се измени функционалнността му
- да се вградят нови модули в него
- да стане ненужно

Сега нека помислим пак какво е РНР. Това е скиптов език, който извежда резултатите в html формат за браузера. Най-очевидния подход за построяването на кода, е да се постави там, където е нужен. Какво ще стане тогава? Ще смесите html кода с РНР кода. Преставете си в една такава каша - малко функционалност, малко форматиране, как ще се чете кодът. Ако се наложи да промените външния вид, неминуемо ще се наложи да премествате РНР код, да търсите малки фрагменти и това ще стане сериозен проблем. Ако трябва да се смени функционалността също ще се наложат неприятни промени. Изходът от това е просто да не смесвате двете.
Това, което ще предложа тук като решение не е темплейт система, но има подобна идея. В началото на страницата подготвяте цялото динамично съдържание, след което го записвате в променливи. На местата, където тябва да се появи това съдържание, извеждате променливите. Така, ако се наложи смяна на дизайна, вие променяте само кода на html, без да четете друг код. Този подход има още един плюс - може да наемете човек, разбиращ само от html и той ще се справи идеално със смяната на дизайна.
Нека сега видим задачата. Имате магазин за канцеларски материали. Трябва да създадете страница за поръчки, в която потребителя да може да изчисли каква сума е нужно да плати, казвайки само броя продукт, който ще купи. Всеки продукт има различна цена. Само за примера, той не трябва да вижда единичната цена на продуктите.

Реализация

Първо, за да не правим много проверки ще ползваме POST метод(ако ползваме GET, какво допълнително действие се налага, с оглед на сигуростта?). Ще си създадем функция, която умножава количеството по единичната цена и връща резултата(това може да се направи и без функцията със същия ефект). Най-добрия метод за съхранение на цените(без база данни разбира се) е в асоциативен масив. Ключът ще бъде названието на продукта, а стойността - цената му. Добре е да създадем и още две конфигурационни променливи - за типа валута и за заглавието на страницата(в един момент може да се наложи то да се променя динамично и това е добре да се предвиди). Потребителя ще избере продукт, който желае в комбо кутия и ще въведе броя продукти в текстово поле. Действие се предприема след натискане на бутон "Изчисли". За да проверим дали въведената стойност не е отрицателна ще трансформираме променливата $_POST['quanity'] в числена променлива това става така:

(int)$_POST['quanity']

Ключовете на select избора са всъщност имната на продуктите, т.е. ключовете в масива ни. Функцията isset() проверява дали променливата, предадена като параметър, е дефинирана, като връща стойност истина или лъжа. Ако потребителя натисне бутона "Изчисли" той автоматично дефинира променливата $_POST['submit']. В $ERR записваме евентуална грешка, ако потребителя въведе отрицателно число. Кодът би трябвало да ви бъде ясен, но ако не е - прочетете отново уроците от 1 до 5. Ако и тогава нещата не се избистрят питайте под статията.

<?php
function calculateCost($quanity, $price)
{
  return $quanity * $price;
}

$Prices = array( "Pen" => 5,
    "Rubber" => 6,
    "Pencil" => 4,
   "Paper" => 10 );
$currensy = " лв.";
$title = "Магазинът на БОБ";
/* main */
if (isset($_POST['submit']))
{
$product = $_POST['product'];
if ((int)$_POST['quanity'] > 0)
    $quanity = (int)$_POST['quanity'];
else
    $ERR = "ERROR 001: Количество може да е само цяло положително число";
$totalCost = calculateCost($quanity, $Prices[$product]);
$totalCost .= $currensy;
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.05 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><? echo $title; ?></title>
</head>
<body>

<center>
<p>Изберете продукт и напишете количеството, което желаете.
С бутона "Изчисли" ще разберете общата цена на покупката.
Приятно пазаруване! </p>
<FORM method="POST">
Продукт :
<select name="product">
    <option value="Pen"> Писалка
    <option value="Rubber"> Гума
    <option value="Pencil"> Молив
    <option value="Paper"> Хартия
</select>
Количество :
<input name="quanity" type="text" size="8">
<input name="submit" type="submit" value="Поръчай">
</FORM>
Обща стойност на поръчката : <? echo $totalCost; ?>
<font color="#FF0000"><? echo $ERR; ?></font>
</center>

</body>
</html>


За да се упражните вие в разработването на кода помислете как може да се въведат отстъпки. Да кажем за поръчка над 200 броя цената е 90%. Ако това не ви затрудни много, а то и не би трябвало, помислете за множество отстъпки - ценови диапазони. Къде ще държите диапазоните на цените и самите цени? Помислете за многомерен масив!
Източник: http://www.eadvise.info