Выбрать главу

(есть увеличенное изображение)

Рис. 2.2.  Результат сохранения ответа на вопрос

С помощью phpMyAdmin вы можете проверить, что данные были сохранены в таблице базы данных jos_myquestions (рис. 2.3).

(есть увеличенное изображение)

Рис. 2.3.  Ответ на вопрос сохранен в базе данных

Вывод списка записей

Прежде всего, добавьте в файл admin.myquestions.phpследующую функцию:

function showQuestions($option) { $db =& JFactory::getDbo(); $query = "SELECT * FROM #__myquestions"; $db->setQuery($query); $rows = $db->loadObjectList(); if ($db->getErrorNum()) { echo $db->stderr(); return false; } HTML_questions::showQuestions($option, $rows); }

Эта функция загружает все записи из таблицы #__myquestions и передает их в виде массива $rows в следующую функцию, которую необходимо добавить в файл admin.myquestions.html.phpв класс HTML_questions:

function showQuestions($option, &$rows) { $maxlen = 100; ?> <form action="index.php" method="post" name="adminForm"> <table class="adminlist"> <thead> <tr> <th width="20"> <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count($rows);?>);"/> </th> <th class="title"><?php echo JText::_('COM_MYQUESTIONS_AUTHOR');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_DATE');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_QUESTION');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_EMAIL');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_PUBLISHED');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_EXPIRATION_DATE');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_SENTTOEXPERT');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_ANSWER');?></th> <th><?php echo JText::_('COM_MYQUESTIONS_SENTTOAUTHOR');?></th> </tr> </thead> <?php jimport('joomla.filter.output'); $k = 0; for ($i = 0, $n = count($rows); $i < $n; $i ++) { $row = &$rows[$i]; $checked = JHTML::_('grid.id', $i, $row->id); $link = JFilterOutput::ampReplace('index.php?option=' .$option . '&task=reply&cid[]='. $row->id); ?> <tr class="<?php echo "row$k";?>"> <td><?=$checked?></td> <td><?=$row->name?></td> <td><?=JHTML::_('date', $row->date, JText::_('DATE_FORMAT_LC3'))?></td> <td><?='<a href="'.$link.'">'.substr(strip_tags($row->question), 0,$maxlen-1).'</a>'?></td> <td><?=$row->email?></td> <td align="center"> <?php if ($row->published == '1') echo JText::_('JYES'); else echo JText::_('JNO');?> </td> <td> <?php if ($row->expiration_date == '0000-00-00 00:00:00') echo JText::_('COM_MYQUESTIONS_DATE_NOT_DEFINED'); else echo JHTML::_('date', $row->expiration_date, JText::_('DATE_FORMAT_LC3'));?> </td> <td align="center"> <?php if ($row->senttoexpert == '1') echo JText::_('JYES'); else echo JText::_('JNO');?> </td> <td><?=substr(strip_tags($row->answer),0,$maxlen-1)?></td> <td align="center"> <?php if ($row->senttoauthor == '1') echo JText::_('JYES'); else echo JText::_('JNO'); ?> </td> </tr> <?php $k = 1 - $k; } ?> </table> <input type="hidden" name="option" value="<?php echo $option;?>"/> <input type="hidden" name="task" value=""/> <input type= "hidden" name="boxchecked" value="0"/> </form> <?php } Листинг .

Записи выводятся в таблице, для которой задан CSS-класс adminlist. Все заголовки таблицы, кроме первого, - это обычный текст. Первый заголовок является чекбоксом и используется для одновременного выделения всех отображенных записей.

Затем начинается цикл для вывода самих записей. Значение переменной $k меняется с 0 на 1 и обратно для того, чтобы переключаться между различными классами CSS для четных и нечетных строк, имеющими немного различающиеся свойства фона. С помощью вызова функции JHTML::_('grid.id') мы получаем HTML-код для чекбокса, который будет обрабатываться с помощью JavaScript.

Для каждого вопроса и ответа выводятся первые maxlen символов вместо его текста целиком. При этом с помощью функции strip_tags() отбрасываются теги, чтобы предотвратить ситуацию, когда граница обрезки текста может оказаться внутри тега.

Для перехода к форме ответа на вопрос для каждой записи выводится гиперссылка, которая пропускается через функцию JFilterOutput::ampReplace(), заменяющую амперсанды "&" на коды "&" в соответствии со спецификацией XHTML. Для подключения класса JFilterOutput в код вставлена строка jimport('joomla.filter.output').

Перед закрывающим тегом </form> расположены три скрытых элемента. Option и task были рассмотрены при анализе формы для ответа на вопрос. Значение boxchecked заключается в следующем. Когда пользователь ставит флажок в каком-либо из чекбоксов, значение boxchecked меняется на 1. Значение boxchecked, равное 0, возвращается, когда ни один из чекбоксов не отмечен. С помощью этого значения JavaScript обрабатывает список.

Для обработки случая, когда не выбрано никакой задачи, измените код переключателя switch в файле admin.myquestions.phpследующим образом:

switch($task) { case 'reply': replyToQuestion($option); break; case 'save': case 'apply': saveQuestion($option, $task); break; default: showQuestions($option); break; }

Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniстроку:

COM_MYQUESTIONS_DATE_NOT_DEFINED="Дата не задана"

Теперь при загрузке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestionsдолжна появиться страница, как на рис. 2.4.

(есть увеличенное изображение)

Рис. 2.4.  Список вопросов

Удаление записей

Добавьте следующий оператор case в переключатель switch() в файле admin.myquestions.php:

case 'remove': removeQuestions($option); break;

Также добавьте функцию removeQuestions():

function removeQuestions($option) { global $app; $cid = JRequest::getVar('cid', array(), '', 'array'); $db =& JFactory::getDbo(); if(count($cid)) { $cids = implode(',', $cid); $query = "DELETE FROM #__myquestions WHERE id IN ($cids)"; $db->setQuery($query); if (!$db->query()) { echo "<script> alert('".$db->getErrorMsg()."'); window.history.go(-1); </script>\n"; } } $app->redirect('index.php?option=' . $option, JText::_('COM_MYQUESTIONS_QUESTION_DELETED')); }

Если в массиве cid есть элементы, то составляется строка из идентификаторов, разделенных запятыми, которая затем используется для построения запроса удаления соответствующих записей. В данном случае нельзя использовать метод JTable::delete(), т.к. он предназначен для удаления одной записи, а не нескольких.

Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniстроку:

COM_MYQUESTIONS_QUESTION_DELETED="Вопрос(ы) успешно удален(ы)"

Ключевые термины

JDatabase - абстрактный класс, предоставляющий доступ к соединению с базой данных, создающемуся при инициализации приложения Joomla. JDatabaseQuery - класс, методы которого совпадают с ключевыми словами языка SQL и позволяют упростить создание сложных SQL-запросов. JTable - класс, реализующий паттерн Active Record и использующийся для управления таблицами базы данных. Префикс таблиц базы данных - строка, которая присоединяется к названию каждой таблицы Joomla в базе данных. Реальный префикс - то конкретное сочетание символов, которое используется в названиях таблиц базы данных. Связывание - процесс присвоения каждому полю производного от JTable класса значения элемента массива переменных запроса, так что ключ элемента совпадает с названием поля. Символический префикс - сочетание "#__" (решетка и два знака подчеркивания), которое используется в запросах вместо реального префикса.

Краткие итоги

При работе с базой данных различают реальный и символический префиксы. Реальный префикс используется в названиях таблиц базы данных, а символический префикс ("#__") используется в запросах вместо реального префикса. При обработке запроса вместо символического префикса будет автоматически подставлен реальный.