Работа с меню
Просмотров: 1033Примерный вид нашей страницы:

Сначала инициализируем некоторые глобальные переменные 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 – разрешитm HTML3. _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>
Все создание списка объявлений закончено. Теперь снова проверяем работоспособность компонента.
Оставьте комментарий!