Вы здесь: Статьи Статьи по Joomla! Создаем компонент «Моя доска объявлений» - II - Реакция на нажатие кнопок

Создаем компонент «Моя доска объявлений» - II - Реакция на нажатие кнопок

Индекс материала
Создаем компонент «Моя доска объявлений» - 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=”textname=”namevalue=”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:

Файл 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
0 ???? Не работают ссылки на следующие части статьи:
- Создание пустых файлов
- Редактирование файла myboard.xml
- Панель управления компонентом
- Все страницы

Не, ну я так не играю :sad:
система ругается и говорит, что нету-ть продолжения у статей. Может лучшн не разбивать их на страницы, а выложить просто разными частями?
Коммент от
Июл 12, 2009
Комментатор
Aleks_El_Dia
0 Починил ссылки. Дело было в одном непроверенном плагине (каюсь, не протестировал перед установкой). Продолжения работают, читайте на здоровье :-)
Коммент от
Июл 12, 2009
Комментатор
Alika
0 Спасибо! Сейчас же все и прочту :-)

Оставить комментарий

Защитный код
Обновить

Популярные файлы

1.
Компонент Миграции с Joomla! 1.0.x на Joomla! 1.5.x
2106
2.
Хак постраничной навигации сайта на CMS Joomla!
883
3.
Дополнительное изменяемое поле "Телефон"
514

Последние комментарии

  • повторюсь - очень очень надо для 1.5 )) Ну и спаси... Подробнее..
    От Илюха
  • Так введите это имя и пароль/мыло админа и заканч... Подробнее..
    От Aleks_El_Dia
  • делал, делал, миграция прошла успешно, жму далее -... Подробнее..
    От Вася