Създаване на сайт с Dreamweaver MX 2004, PHP и MySQL, Урок 3.2

Линкове от дните на календара към статиите. За да направите това, създавате recordset, с всички дати на Вашите статии. След това, сравнявате датите на текущо изобразения месец със тези от recordset. Когато е открито точно съответствие, линквате този ден към страницата day.php, която показва съответните публикации.


Линкове от дните на календара към статиите

Първо, създавате advanced recordset с име rsArticleDates, който екстрактва датите на публикуване на статиите от Вашата база данни. Вашата база данни, съдържа таблицата blg_article_art , която съхранява дневните публикации:

blg_article_art
id_art Primary key: уникален числов индикатор за всяка статия
idtop_art Foreign key: числен ID на темата, към която е асоциирана статията
title_art Заглавието на статията, което се изобразява в браузъра
description_art Кратко описание на статийното съдържание, изобразявано в списъка със статии
text_art Действителното съдържание на статията
date_art Часа и датата, когато статията е била публикувана. Ще бъдат използвани за сортиране и подреждане на статиите по дати. Автоматично ще бъде вмъкнато в таблицата.

Типа на датата, в полето date_art е datetime, което означава, че всяка статия има асоциирана timestamp, съхранявана в следния формат:YYYY-MM-DD HH:MM:SS (примерно: 2004-07-20 19:04:00)

Вие се нуждаете само от първата част на полето date_art или иначе казано датата. За да създадете rsArticleDates recordset, следвайте стъпките:

Отворете страницата blgtemplate.dwt.php
В таба Bindings от панела Application, кликнете (+) бутона, за да добавите recordset.
Изберете Recordset (Query) от появилото се меню
Конфигурирайте появилия се прозорец, както е показано на фиг. 12

фиг.12. Стартирайте от семплия recordset

Единственото поле, което ще екстрактнете за recordset е date_art от таблицата blg_article_art. Обаче, няма да използвате цялото поле, а само част от него: датата.

Кликнете бутона Advanced. Ще редактирате SQL кода, който генерира recordset-а, чрез прилагане на функцията date_format към полето date_art. Заменете кода от SQL текстовото поле с:
SELECT date_format(date_art, '%Y-%c-%e') as ArticleDate

FROM blg_article_art

Забележка: Функцията date_format във MySQL, налага специален формат на входния низ.Спецификаторите, които използвате са:

%Y - четирицифрено, числово представяне на годината
%c - числово представяне на месеца
%e - числово представяне на деня от месеца
Кликнете Ok за да потвърдите настройките.
Dreamweaver показва следното съобщение


фиг.13. Предупредително съобщение

Понеже recordset-ите, обикновено са вмъквани извън HTML таговете, новият recordset (rsArticleDates), няма да е на разположение за страниците, базирани на текущия темплейт. Ще трябва да пресъздадете recordset -а във всички публични страници от Вашия blog ( които имат нужда от него):

index.php
topic.php
article.php
Сега ъпдейтвайте тези сраници с новия recordset. Алтернативно решение е да разпространите recordset-а автоматично, до всички темплейт-базирани страници, но с цената на загуба на всички recordset- и, собственост на тези страници.

След като сте дефинирали нов recordset, който ще използвате с функцията build_calendar, сега ще декларирате нов обект, с името $dates[], вътре във дефиниращото тяло на функцията: масив, съхраняващ всички дати на статиите от recordset-а.

Поставете следния код, веднага след секцията на дефиниране на променливите, в тялото на функцията build_calendar . С други думи, веднага след реда, започващ с променливата $monthName.
global $_GET;
global $rsArticleDates;

URL параметрите и recordset-а , трябва да бъдат декларирани глобални променливи. По този начин, ще бъдат на разположение вътре във тялото на функцията.

Забележка: В PHP, глобалните променливи, трябва да бъдат декларирани глобални, във вътрешността на функцията , ако те ще бъдат използвани от тази функция.

Добавете следния код под двете глобални променливи, които преди малко добавихте. Този код, ще провери дали recordset-а е празен, използвайки функцията mysql_num_rows, която връща броя редове в резултантния набор. Ако не е (броя редове е по-голям от 0), rsArticleDates recordset-а е реинициализиран и датите са съхранени в масива $dates.
if (mysql_num_rows($rsArticleDates) > 0){
mysql_data_seek($rsArticleDates,0);
while($row_rsArticleDates = mysql_fetch_assoc($rsArticleDates)){
$dates[] = $row_rsArticleDates['ArticleDate'];
}
}

Забележка: Функцията mysql_data_seek() придвижва вътрешния указател за ред на MySQL резултата, да сочи към определен номер на реда (който започва от 0). Функцията mysql_fetch_assoc() връща асоциативен масив, кореспондиращ на доставения ред или връща false, ако няма повече редове.

Следва да добавите код, проверяващ дали календарната дата, съответства на някоя от датите на публикуване на статии. Ако е така, съответната дата ще бъде с линк към страницата day.php, която показва публикациите за деня. Ще декларирате нова променлива с име $date, в тялото на функцията build_calendar. Тази променлива съхранява пълната календарна дата, която ще бъде сравнена с датата в масива $dates, съхраняващ датите екстрактнати от rsArticleDates recordset. Използвайте (Edit > Find and Replace) , за да откриете следния ред код в PHP скрипта:

$calendar .= "<td>$currentDay</td>";

След като го откриете, подменете го със следния код, който представлява линка между календарната дата и страницата day.php, подаващ URL параметрите за месец (m), година (y) и ден (d):

$date = $year."-".$month."-".$currentDay;
if (in_array($date,$dates)) {
$calendar .= "<td><a href='day.php?m=$month&y=$year&d=$currentDay'>$currentDay</a></td>";
} else {
$calendar .= "<td>$currentDay</td>";
}

Съхранете (save) страницата blgtemplate.dwt.php и ъплоудвайте на сървъра. Убедете се, че сте ъпдейтнали всички страници, базирани на този темплейт, като сте кликнали бутона за ъпдейт на Dreamweaver запитването.

Показване на статиите от архива на blog-a

Отворете в Dreamweaver, страницата day.php. Приложете към нея blgtemplate, като изберете Modify > Templates > Apply Template to Page.

Въведете Blog: Archive, като заглавие на страницата , в полето Title, на лентата Document.

На тази страница rsArticleDates recordset е на разположение, защото приложихте темплейта след дефиниране на recordset-а. Обаче, на Вас Ви е нужно създаването на нов recordset, филтриращ статиите по датите, получени чрез URL параметрите m, y и d. Следвайте стъпките:

Отидете на таба Bindings в панела Application и кликнете (+) бутона
Изберете Recordset (Query) от появилото се меню. Когато се появи диалог.прозорец Recordset, превключете на Simple mode (ако е на Advanced mode) и попълнете конфигурационните детайли:
Recordset Name: rsArticlesByDate
Database Connection: connBlog
Table: blg_article_art
Columns: All
Сортирайте записите по дата (полето date_art), Descending. Въпреки, че всички статии в този recordset са били публикувани на една дата, Вие вероятно ще пожелаете да ги аранжирате по час, като по този начин да покажете последно публикуваната, като първа в списъка.
Превключете интерфейса на Advanced mode и дефинирайте три променливи за месеца, годината и деня, като кликнете бутона (+) във Variables секцията. Въведете стойностите показани на фиг.14. Runtime value на променливата year , трябва да бъде стойността на URL параметъра y.

фиг.14 Дефиниране на SQL параметрите

Повторете същото и за променливите на месеца и деня и използвайте фиг.14 като помощник. month параметъра приема стойността на URL параметъра m ($_GET['m']) и day параметъра приема стойността на URL параметъра d ($_GET['d']). Техните default стойности са -1.
Накрая, добавете филтриращото условие пред ORDER BY клаузата (в SQL текстовото поле). Условието екстрактва датата от полето date_art и я сравнява със датата, получена чрез URL параметрите. На нов ред над ORDER BY клаузата в SQL текстовото поле, добавете следния код:
WHERE date_format(date_art, '%Y-%c-%e')='year-month-day'

Кликнете Ok за да създадете recordset-а.
Накрая, ще изобразите recordset-а , като използвате динамична таблица:

Кликнете в редактируемия регион main и отидете на таба Application от лентата Insert и вмъкнете динамична таблица, както е показано на фиг.15.

фиг.15. Вмъкване на динамична таблица

Конфигурирайте показалия се интерфейс като на фиг.16

фиг.16. Конфигуриране на динамичната таблица

Изтрийте колоните id_art и idtop_art и първия ред от таблицата
Селектирайте <table> от таг селектора и задайте за width стойност 100% в Property inspector.
Добавете два реда в края на таблицата. Убедете се, че попадат в repeat региона, защото иначе, няма да се появяват за всяка статия.
Издърпайте динамичното поле article description до втория ред и article contents на третия ред, като предварително сте слели клетките на тези редове.
Слейте всички клетки във втори и трети ред
Слейте първите две клетки във първия ред
Слейте десните две клетки в първия ред и напишете Published: пред полето за датата. Подравнете съдържанието на клетката вдясно, като използвате Property inspector.
Приложете съответните CSS стилове към списъка със статии: topic за таблицата, topheader за първия ред и topbody за втория ред.
Запишете страницата, ъплоудвайте я на сървъра и проверете функционалността и в браузъра. Резултата Ви трябва да е подобен на този от фиг.17.

фиг.17. Показване на публикация от архива

Така също ще покажете, текущо селектираната дата на страницата day.php.

Вмъкнете нов ред, над първия ред от динамичната таблица
Слейте клетките на реда и напишете Articles published on в клетката.
За да покажете селектираната дата, ще използвате PHP блока echo. Със курсора, разположен във първия ред, отидете на таба PHP от лентата Insert и кликнете бутона echo, както е показано на фиг.18.

фиг.18. Създаване на PHP, echo кодов блок

Dreamweaver вмъква следния код във Вашата страница и превключва на Split view.

<?php echo ?>

Напишете "$day-$month-$year" след echo израза. Ще се изобразят променливите в зададения ред с тирета между тях.

фиг.19. Редакция на echo израза

Приложете CSS стила nugheader, към новия ред, като използвате таг селектора. Фиг.20 показва как изглежда в браузъра:

фиг.20. Preview

Разбира се това е базов календарен скрипт. Използвайте въображението си.

Продължава в Урок 3.3



/ Трябва да сте регистриран за да напишете коментар /