| Индекс материала |
|---|
| Создаем компонент «Моя доска объявлений» - II |
| Учимся делать запросы в БД |
| Реакция на нажатие кнопок |
| Оптимизация кода |
| Редактирование сообщений |
| Все страницы |
Шаг восьмой. Разработка реакции на нажатие подпункта меню Наша доска->Просмотр и удаление объявлений. Отображение списка существующих объявлений.
При нажатии на Просмотр и удаление объявлений пользователь видит страницу описанную в шаге 5 нашего руководства. Приступим:
Примерный вид нашей страницы:

Сначала инициализируем некоторые глобальные переменные Joomla:
global $database, $mosConfig_list_limit;
$database – для возможности работы с базой данных; $mosConfig_list_limit – переменная хранит количество элементов отображаемых на странице по умолчанию (при использовании постраничной навигации).
Чтобы использовать постраничную навигацию:

нужно определить переменные: $limit, $limitstart, $total. $limit – количество элементов на странице, $limitstart – элемент с которого начинается отображение элементов на текущей странице, $total – количество элементов на всех страницах.
Значения этих переменных будут передаваться скрипту методом POST (так мы указали выше, когда описывали форму).
echo '<form name="adminForm" method="POST" action="index2.php">';
Для получения данных, переданных скрипту используется функция mosGetParam. Она берет значения переданных переменных из суперглобального массива $_REQUEST. По умолчанию обрезает лишние пробелы в начале и конце, а также вычищает HTML код из текста. Используем её следующим способом:
$limit = intval( mosGetParam( $_REQUEST, 'limit', $mosConfig_list_limit ) ); $limitstart = intval( mosGetParam( $_REQUEST, 'limitstart', 0 ) ); $filter_user = intval( mosGetParam( $_REQUEST, 'filter_user', 0 ) );
$_REQUEST - суперглобальный массив переданный в скрипт; второй параметр имя поля значение, которого мы передавали скрипту (Например, <input type=”text” name=”name” value=”0”> ); третий параметр значение, которое должна принять переменная если значение поля передано не было (значение по умолчанию).
Возможен также и четвертый (необязательный параметр). Он указывает, как обрабатывать переданное значение. Возможны следующие значения:
1. _MOS_NOTRIM - не обрезать пробелы 2. _MOS_ALLOWHTML - разрешить HTML 3. _MOS_ALLORAW - не обрабатывать (т.е. текст даже с HTML и JavaScript)
Значение переменной $total мы можем определить только обратившись к базе данных. Что мы и делаем:
$query = "SELECT COUNT(*)" ."\n FROM mdo_message"; $database->setQuery( $query ); $total = $database->loadResult();
Когда все переменные инициализированы, нужно создать объект класса mosPageNav. Для этого:
require_once($GLOBALS['mosConfig_absolute_path']. '/administrator/includes/pageNavigation.php' ); $pageNav = new mosPageNav( $total, $limitstart, $limit );
т.е. включаем в скрипт файл pageNavigation.php, в котором и находится описание класса mosPageNav. Ну и непосредственно создаем объект с параметрами, которые инициализировали раньше.
Далее нужно получить данные, которые будут отображаться в таблице. Нужно получить $limit строк , начиная с $limitstart строки:
$query = "SELECT m.*, u.name, u.username" . "\n FROM mdo_message AS m " . "\n LEFT JOIN #__users AS u ON u.id = m.id_user"; $database->setQuery( $query, $pageNav->limitstart, $pageNav->limit ); $rows = $database->loadObjectList();
Теперь объект $rows содержит требуемые данные осталось отобразить их.
Переходим к визульной части. Сначала отобразим заголовок (это лишь декоративный элемент).

<table class="adminheading"> <tr> <th> Доска объявлений </th> </tr> </table>
Далее должна идти таблица, оформленная в том же стиле, что и все таблицы в админ-панели. Здесь я приведу весь код, который отображает нужную нам таблицу с данными. Далее поясню некоторые моменты:
<table class="adminlist"> <tr> <th width="20"> # </th> <th width="20"> <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count( $rows ); ?>);" /> </th> <th align="left" nowrap="nowrap"> Сообщение </th> <th width="20%" nowrap="nowrap"> Создатель </th> <th width="11%" nowrap="nowrap"> Начало показа </th> <th width="11%" nowrap="nowrap"> Конец показа </th> </tr> <?php $k = 0; for ($i=0, $n=count($rows);$i<$n;$i++) { $row = $rows[$i]; mosMakeHtmlSafe($row); $row->id = $row->id_message; $checked = mosCommonHTML::CheckedOutProcessing( $row, $i ); ?> <tr class="<?php echo "row$k"; ?>"> <td align="center"> <?php echo $pageNav->rowNumber( $i ); ?> </td> <td align="center"> <?php echo $checked; ?> </td> <td> <?php echo $row->message; ?> </td> <td align="center"> <?php echo $row->name.'('.$row->username.')'; ?> </td> <td> <?=date("Y-m-d H:i:s", $row->start_date)?> </td> <td> <?=date("Y-m-d H:i:s", $row->end_date)?> </td> </tr> <?php $k = 1 - $k; } ?> </table>
mosMakeHtmlSafe($row); - функция которая проверят нет ли HTML кода, если есть вырежет его.
$row->id = $row->id_message; $checked = mosCommonHTML::CheckedOutProcessing( $row, $i );
- функция создает код для отображения checkbox`а (значение параметра value = $row->id, значение параметра id = “cb”.$i. Например: <input type="checkbox" id="cb1" name="cid[]" value="2" onclick="isChecked(this.checked);" />)
<tr class="<?php echo " row$k"; ?>">
- используем класс row$k, для того чтобы фон выводимых строк чередовался (темный - светлый - темный). Переменная $k в конце цикла меняет своё значение (если была 0, то станет 1 и наоборот)
<?=date("Y-m-d H:i:s", $row->start_date)?>
- так как в нашей таблице даты хранятся в формате timestamp, поэтому для преобразования в удобочитаемы вид применяем функцию date.
И, наконец, выводим панель навигации.
<?php echo $pageNav->getListFooter(); ? >
И определяем скрытое поле
<input type="hidden" name="boxchecked" value="0" />
которое требуется для операций с checkbox`ами.
Теперь привожу полный вид файла admin.myboard.php:
Используя этот файл изменить компонент, и проверьте на работоспособность. Не забудьте добавить данные в таблицу mdo_message. Желательно чтобы данные были верные, т.е. id пользователя указывался не от балды, а такой какой указан в таблице #__users.
На первой картинке в правом верхнем углу вы могли заметить список:

Этот список сделан для фильтрации по автору объявления. Чтобы реализовать фильтрацию добавим некоторые строки в код написанный нами ранее.
$filter_user = intval( mosGetParam( $_REQUEST, 'filter_user', 0 ) );
-после описания переменных $limit, $limitstart.
За этой предыдущей строчкой вставляем:
$filter[0]=''; $filter[1]=''; if ($filter_user!=0) { $filter[0]="\n WHERE u.id=$filter_user"; $filter[1]="\n WHERE id_user=$filter_user";
}
- для того чтобы в зависимости от значения переменной $filter_user можно было отсеивать ненужные записи. Если $filter_user равно 0 (фильтр не определен), то изменений в запросах не будет.
Далее изменяем запросы следующим образом:
$query = "SELECT COUNT(*)" . "\n FROM mdo_message"
Заменяем на:
$query = "SELECT COUNT(*)" . "\n FROM mdo_message" .$filter[1];
$query = "SELECT m.*, u.name, u.username" . "\n FROM mdo_message AS m " . "\n LEFT JOIN #__users AS u ON u.id = m.id_user";
Заменяем на:
$query = "SELECT m.*, u.name, u.username" . "\n FROM mdo_message AS m " . "\n LEFT JOIN #__users AS u ON u.id = m.id_user" .$filter[0];
После инициализации объекта $rows:
$query = "SELECT u.id, u.name FROM mdo_message AS m " ."\n LEFT JOIN #__users AS u ON u.id=m.id_user" ."\n GROUP BY u.id"; $authors[] = mosHTML::makeOption( '0', _SEL_AUTHOR, 'id', 'name' ); $database->setQuery( $query ); $authors = array_merge( $authors, $authors = $database->loadObjectList()); $lists['authorid']= mosHTML::selectList( $authors, 'filter_user', 'class="inputbox" size="1" onchange="document.adminForm.submit( );"', 'id', 'name', $filter_user);
И, наконец, изменяем заголовок (таблицу которая выводит - моя доска объявлений) на:
<table class="adminheading"> <tr> <th> Доска объявлений </th> <td align="right"> <?php // echo $lists['authorid']; ?> </td> </tr> </table>
Все создание списка объявлений закончено. Теперь снова проверяем работоспособность компонента.
В результате получился следующий файл admin.myboard.php
| < Предыдущая | Следующая > |
|---|
Комментарии
Коммент от
Июл 11, 2009Комментатор
Alika- Создание пустых файлов
- Редактирование файла myboard.xml
- Панель управления компонентом
- Все страницы
Не, ну я так не играю
система ругается и говорит, что нету-ть продолжения у статей. Может лучшн не разбивать их на страницы, а выложить просто разными частями?
Коммент от
Июл 12, 2009Комментатор
Aleks_El_DiaКоммент от
Июл 12, 2009Комментатор
AlikaRSS лента комментариев этой записи