Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Samouchitel_po_razrabotke_rasshireny_dlya_Jooml....docx
Скачиваний:
3
Добавлен:
10.11.2018
Размер:
2.53 Mб
Скачать

Парсинг url сегментов

При попытке нажать на один из Обзоров прямо сейчас, вы получите сообщение типа "Фатальная ошибка: Вызов неопределенной функции reviewsParseRoute() ("Fatal error: Call to undefined function reviewsParseRoute()"). В дополнение к функции генерации SEF URL для Обзоров, мы должны иметь функцию способную декодировать эти URL. Вернемся в components/com_reviews/router.php и добавим ее:

function ReviewsParseRoute($segments)

{

$vars = array();

$vars['task'] = $segments[0];

$vars['id'] = $segments[1];

return $vars;

}

Как только Joomla! определит, что запрос страницы предназначен для Компонента Обзоров, она будет вызывать BuildParseRoute() и передст в массив соответствующие сегменты URL. Эти сегменты уже отсортированы, и мы передаем их в ReviewsBuildRoute(). Инициализируем массив $vars для хранения возвращаемых переменных. Мы помещали task и ID в массив $segments как первый и второй элементы соответственно. Наконец, мы возвращаем массив, Joomla! в свою очередь, устанавливает переменные запроса. Таким образом, весь процесс маршрутизации является прозрачным для остального кода: все переменные, которые обычно мы ожидаем увидеть при обычных вызовах скрипта будут на месте.

Сохраните router.php и попробуйте нажать на некоторые ссылки и обратите внимание на адресную строку в браузере. Теперь вы должны видеть URL, как

http://www.oursite.com/reviews/view/1 или

http://www.oursite.com/index.php/reviews/view/1.

Если URL выглядит как

http://www.oursite.com/component/reviews/view/1, это просто означает, что вы перешли без SEF URL. Все восстановится, как только Вы пройдете круг.

Добавление комментариев

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

CREATE TABLE 'jos_reviews_comments' (

'id' int(11) NOT NULL auto_increment,

'review_id' int(11) NOT NULL,

'user_id' int(11) NOT NULL,

'full_name' varchar(50) NOT NULL,

'comment_date' datetime NOT NULL,

'comment_text' text NOT NULL,

PRIMARY KEY ('id')

)

или в PhpMyAdmin создайте таблицу jos_reviews_comments с 6 полями:

Заполните как показано на рисунке:

Обратите внимание, что id установлен как auto_increment и primary key:

Добавим еще один класс БД для работы с основными функциями. Поскольку у нас уже есть класс для Обзоров administrator/components/com_reviews/tables, добавим второй здесь же. Создайте comment.php файл и добавьте класс TableComment, убедившись, что каждый столбец в таблице представлен в виде переменной:

<?php

defined('_JEXEC') or die('Restricted access');

class TableComment extends JTable

{

var $id = null;

var $review_id = null;

var $user_id = null;

var $full_name = null;

var $comment_date = null;

var $comment_text = null;

function __construct(&$db)

{

parent::__construct( '#__reviews_comments',

'id', $db );

}

}

?>

Теперь, добавим форму, чтобы люди могли вводить свои комментарии. Откройте reviews.html.php файл и добавьте следующую функцию в HTML_reviews

function showCommentForm($option, $review_id, $name)

{

?>

<br /><br />

<form action="index.php" method="post">

<table>

<tr>

<td>

<strong>Name:</strong>

</td>

<td>

<input class="text_area" type="text" name="full_name"

id="full_name" value="<?php echo $name; ?>" />

</td>

</tr>

<tr>

<td>

<strong>Comment:</strong>

</td>

<td>

<textarea class="text_area" cols="20" rows="4"

name="comment_text" id="comment_text"

style="width:500px"></textarea>

</td>

</tr>

</table>

<input type="hidden" name="review_id"

value="<?php echo $review_id; ?>" />

<input type="hidden" name="task"

value="comment" />

<input type="hidden" name="option"

value="<?php echo $option; ?>" />

<input type="submit" class="button" id="button"

value="Submit" />

</form>

<?php

}

Функция ShowCommentForm() принимает имя текущего Компонента, id отображаемого Обзора и имя в качестве параметров. Имя (Name) уже заполнено в форме, так что зарегистрированные пользователи не должны его вводить. Ссылка вернуться к Обзорам (return to the reviews) вернет нас назад в Компонент. Переменная task имеет значение comment, так что Компонент записывает комментарии. Чтобы быть уверенным, что комментарий соответствует Обзору, review_id установлен как текущий. Чтобы форма отображалась только под Обзором, добавьте следующий выделенный код viewReview () в файл reviews.php:

if(!$row->published)

{

JError::raiseError( 404, JText::_( 'Invalid ID provided' ) );

}

HTML_reviews::showReview($row, $option);

$user =& JFactory::getUser();

if($user->name)

{

$name = $user->name;

}

else

{

$name = '';

}

HTML_reviews::showCommentForm($option, $id, $name);

Перед вызовом функции HTML-отображения, нам необходимо получить имя вошедшего в систему пользователя (если имеется). Код $user =& Jfactory::getUser(); устанавливает ссылку на объект $user для вошедшего в систему пользователя. Если полное имя пользователя находится в переменной name, мы фиксируем это значение в $name, в противном случае $name имеет значение пустой строки.

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

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

switch($task)

{

case 'view':

viewReview($option);

break;

case 'comment':

addComment($option);

break;

default:

showPublishedReviews($option);

break;

}

Далее в этот же файл добавьте функцию addComment():

function addComment($option)

{

global $mainframe;

$row =& JTable::getInstance('comment', 'Table');

if (!$row->bind(JRequest::get('post')))

{

echo "<script> alert('".$row->getError()."');

window.history.go(-1); </script>\n";

exit();

}

$row->comment_date = date( 'Y-m-d H:i:s' );

$user =& JFactory::getUser();

if($user->id)

{

$row->user_id = $user->id;

}

if (!$row->store())

{

echo "<script> alert('".$row->getError()."');

window.history.go(-1); </script>\n";

exit();

}

$mainframe->redirect('index.php?option=' .

$option . '&id=' . $row->review_id .

'&task=view', 'Comment Added.');

}

Большая часть этого кода уже должна быть понятна. Мы получаем ссылку на текущий объект пользователя, чтобы получить ID пользователя и установить его в нашей БД. На данный момент, мы, позволяем оставлять комментарии как зарегистрированным пользователям, так и анонимные комментарии. В дальнейшем будет возможно отслеживать зарегистрированных пользователей. Если посетитель не вошел в систему, $user будет пустой и, следовательно, столбец user_id, по умолчанию будет равен 0. Перед сохранением, присвоим текущую дату и время comment_date. Остальные функции связывания, сохранения, и перенаправления аналогичны ИА

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]