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

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

Индекс материала
Создаем компонент «Моя доска объявлений» - II
Учимся делать запросы в БД
Реакция на нажатие кнопок
Оптимизация кода
Редактирование сообщений
Все страницы
Продолжение статьи "Создаем компонент "Моя доска объявлений"- I

Работа компонента с базой данных

Шаг шестой. Доступ к базе данных.

Итак, на пятом шаге мы создали структуру нашего компонента. Теперь нужно написать каждый из шести наших обработчиков (Почему из шести? Объясняю: 1- реакия на нажатие пункта меню Наша доска; 2 – отображение основной страницы компонента по умолчанию, т.е. реакция на нажатие подменю пункта Наша доска -> Просмотр и удаление объявлений, 3 – Реакция на нажатие кнопки Редактировать (отображение страницы редактирования объявления); 4 – Реакция на нажатие кнопки Закрыть (отмена редактирования сообщения и возврат к главной странице); 5 – Реакция на нажатие кнопки Удалить; 6 – Реакция на нажатие кнопки Сохранить.)

 

Заметим, что если оставить структуру, созданную раннее без изменений, то некоторые обработчики будут частично повторять друг друга.

Мы поступим следующим образом (для того, чтобы лучше разобраться в возможностях): сначала, напишем обработчики для каждого события компонента, вставляя их в созданную нами структуру; потом учитывая то, что некоторые части повторяются попробуем оптимизировать код администраторской части компонента. В итоге у нас должно получится 2 работоспособных варианта компонента.

Каждый начинающий создатель компонентов сам решит, какой вариант разработки ему нравится больше.

Перед тем как начать непосредственно программировать, рассмотрим основные моменты доступа к базам данных (с помощью встроенных средств Joomla).

Рассматривать буду Joomla 1.0.13 (поэтому гарантировать что описанные мной классы, методы и свойства присутствуют и в следующих версиях не могу, хотя вероятно они вряд ли кардинально изменились).

Для работы с базами данных в Joomla присутствует библиотека ../includes/database.php.

Если вам интересно откройте этот файл и внимательно рассмотрите. В нем описано 2 класса: database и mosDBTable.

Рассмотрим первый из них. Он имеет довольно много свойств и методов, но рассмотрим только те, которые нам пригодятся, а именно: для выполнения запросов к базе данных (выборка и запись информации).

Итак чтобы выполнить какой либо запрос нужно выполнить последовательность следующих действий (команд и .т.д):

 
$database->setQuery(<запрос>);  
$database->query();
 

Запрос может быть следующих видов:

  • select * from jos_user
  • select * from #__users

          Использование комбинации символов #__ вместо префикса таблиц позволяет использовать компонент с разными базами данных joomla (отличающимся префиксом таблиц). В процессе выполнения функции setQuery, #__ заменяется на текущий префикс. Поэтому предпочтительнее использовать второй вид запросов.

Функция query возвращает истину если запрос удачен, и ложь в остальных случаях. Для того чтобы возвратить результат запроса нужно выполнить одну из перечисленных функций (заменив на нее $database->query();). Допустим результат должен быть помещен в переменную $result.

Если мы хотим поместить в переменную массив, состоящий из значений какого-то одного поля таблицы, используем:

 
loadResultArray(<номер поля >);
 

Поля нумеруются с нуля, если значение параметра функции не указано, то по умолчанию считается равным нулю)

Если результат должен быть получен виде ассоциативного массива, используем:

 
loadAssocList();
 

Также существует еще несколько функции расширяющих возможности по обработке результатов запроса. Сейчас не будем акцентировать на них свое внимание.

Попробуем применить полученные знания на практике. Для этого сделаем так чтобы при нажатии на пункт меню нашего компонента «Просмотр и удаление объявлений» появлялся список имен пользователей зарегистрированных в системе.

Открываем файл admin.mybord.php и вставляем вместо строчки

 
echo 'Отображение компонента по умолчанию';
 

следующий код:

 
$query = 'select * from  `#__users`';
$database->setQuery($query);
$result =  $database->loadResultArray(1);
for  ($i=0;$i<count($result);$i++)
{
echo($result[$i]."<br>");
}
 

Или этот (отличаются они только реализацией обхода результирующего массива)

 
$query =  'select * from `#__users`';
$database->setQuery($query);
$result =  $database->loadResultArray(1);
foreach ($result as  $row)
{
echo($row."<br>");
}
 

Теперь как и в предыдущих шагах архивируем файлы компонента и устанавливаем. Смотрим что получилось. В дальнейшем для того чтобы изменить компонент мы не будем удалять его, менять и снова устанавливать.

Поступать будем так: заходим на сервере (локальном или удаленном, удобнее конечно разрабатывать на локальном, например Denwer)

если редактируем часть администратора, то ../administrator/components/com_myboard (в нашем случае!!!)

если редактируем frontend, то ../components/com_myboard

делаем требуемые изменения и проверяем как работает компонент. Если все нормально, то можно скопировать в одно место содержимое этих двух катологов и заархивировать(получим готовый, к установке компонент).

Попробуйте обязательно выполнить какой-нибудь запрос с помощью функции query(); Например создайте таблицу #__proba с любыми полями.

У меня получилось вот что:

 
$query = 'CREATE TABLE  `proba` (
`id_proba` INT NOT NULL  AUTO_INCREMENT ,
`proba` TEXT NOT NULL  ,
PRIMARY KEY (  `id_proba` )
);';
$database->setQuery($query);
if  ($database->query())
{
echo('Таблица успешно создана!');
}
 

На следующем шаге мы рассмотрим основы SQL запросов.


Шаг седьмой. Небольшое отступление. Потренируемся создавать запросы в Joomla.

На предыдущем шаге мы уже попробовали создать несколько простых запросов. Сейчас нашей целью будет рассмотреть основные возможности языка SQL. Подробно описывать теорию я не буду - этого материала полно в сети, написана уйма книг. Поэтому буду упоминать определенную возможность и иллюстрировать её на примере. Примеры будем опробовать, так же как и в шестом шаге – вставляем код в место, где описывается реакция на нажатие подпункта меню Наша доска -> Просмотр и удаление объявлений.

Итак начнем.

 

SQL запросы на выборку данных:

1. SELECT * FROM <Имя таблицы>

SELECT * FROM `#__users` -используя, описанные в предыдущем шаге методы класса database выполните запрос.

 
$query = 'SELECT * FROM  `#__users`';
$database->setQuery($query);
$result =  $database->loadResultArray(3);
foreach ($result as  $row)
{
echo($row."<br>");
}
 

Отобразит список е-мэйлов зарегистрированных в CMS пользователей. Звездочка в запросе означает, что база данных вернет значения всех полей, которыми обладает данная таблица. Если значения каких-то полей не нужны лучше использовать следующий вид запроса.

2. SELECT <Имя поля1>, <Имя поля2>, …, <Имя поляN> FROM <Имя таблицы>

SELECT `id`, `name`, `username` FROM `#__users`

 

 
$query = 'SELECT `id`,  `name`, `username` FROM `#__users`';
$database->setQuery($query);
$result =  $database-> loadAssocList();
foreach ($result as  $row)
{
echo($row['id'].' - '.$row['name'].' -  '.$row['username']."<br>");
}
 

Отображает список, состоящий и идентификатора, имени и логина пользователей, зарегистрированных в системе.

      3. SELECT * FROM `Имя таблицы` WHERE `Имя поля`  <  <Параметр>

SELECT * FROM `Имя таблицы` WHERE `Имя поля`  =  <Параметр>

SELECT * FROM `Имя таблицы` WHERE `Имя поля`  >  <Параметр>

            SELECT * FROM `#__users` WHERE `id`<69

 
$query = 'SELECT * FROM  `#__users` WHERE `id`<69';
$database->setQuery($query);
$result =  $database-> loadAssocList();
foreach ($result as  $row)
{
echo($row['id'].' - '.$row['name'].' -  '.$row['username']."<br>");
}
 

 

Отображает данные только тех пользователей, id которых меньше 69. За ключевым словом WHERE идет условие отбора записей. Условие может быть как простым (в прмере), так и сложным.((Имя поля1 < 1) AND (Имя поля2 > 2)).

 

   4.  SELECT <Имя таблицы1>.<Имя поля3>, <Имя таблицы2>.<Имя поля4>

FROM <Имя таблицы1>,<Имя таблицы2>

WHERE <Имя таблицы1>.<Имя поля1>=<Имя таблицы2>.<Имя поля2>

SELECT `#__content`.`title`, `#__users`.`id` FROM `#__users`, `#__content`

WHERE `#__users`.`id`= `#__content`.`created_by`

 
$query = 'SELECT  `#__content`.`title`, `#__users`.`id` 
FROM `#__users`, `#__content` 
WHERE `#__users`.`id`= `#__content`.`created_by`';
$database->setQuery($query);
$result = $database-> loadAssocList();foreach ($result as $row)
{
echo($row['id'].'-'.$row['title']."<br>");
}
 

 

Отображает список заголовков статей, и идентификатор пользователя, который их создал.

5. SELECT * FROM <Имя таблицы> LIMIT <целое неотрицательное число>

SELECT * FROM `#__content` LIMIT 5

 
$query = 'SELECT * FROM  `#__content` LIMIT 5';
$database->setQuery($query);
$result = $database->  loadAssocList();
foreach ($result as  $row)
{
echo($row['title']."<br>");
}
 

 

Отобразит значения поля title первых пяти записей таблицы #__content

6. SELECT * FROM <Имя таблицы>

LIMIT <целое неотрицательное число1>,<целое неотрицательное число2>

SELECT * FROM `#__content` LIMIT 2, 5

 

 
$query = 'SELECT * FROM  `#__content` LIMIT 2, 5';
$database->setQuery($query);
$result = $database->  loadAssocList();
foreach ($result as  $row)
{
echo($row['title']."<br>");
}
 

Отобразит значения поля title 5 записей из таблицы #__content, начиная с 2 (Нумеруются записи с нуля)

7. SELECT * FROM <Имя таблицы> ORDER BY <Имя поля>

SELECT * FROM `#__content` ORFDER BY `modified`

 

 
$query = 'SELECT * FROM  `#__content` ORDER BY `modified`';
$database->setQuery($query);
$result = $database->  loadAssocList();
foreach ($result as  $row) 
{
echo($row['modified'].' - '.$row['title']."<br>");
}
 

 

Выводятся поля значения полей modified и title всех записей таблицы #__content. Сортировка при выводе идет по полю modified.

            SQL запросы на создание, удаление и редактирование таблиц.

1. CREATE TABLE <Имя таблицы> [(параметры)]

 

 
$query = 'CREATE TABLE  `test` (
`id_test` INT NOT NULL ,
`test` TEXT NOT NULL ,
`description` TEXT NOT NULL ,
PRIMARY KEY ( `id_test` )
);';
$database->setQuery($query);
if  ($database->query()){echo('Успешно<span>');}
else {echo('НЕУспешно');}
</span>

Создает таблицу в текущей базе данных с полями id_test (целочисленное, не нуль), test, description (текстовые). Поле id_test – первичный ключ. (Если запрос выполнится, то будет выведена надпись Успешно, Неуспешно в обратном случае.)

2. ALTER TABLE `test` <параметр>

Основные значения параметра приведены в таблице:

ADD <Имя поля1> <Тип поля>

[FIRST | AFTER <Имя поля2>]

Добавление нового поля в таблицу

Конструкция FIRST добавляет новое поле перед столбцом <Имя поля2>. Конструкция AFTER добавляет поле после поля <Имя поля2>.

ADD INDEX [<Имя индекса>]

(<Имя поля1>, …)

Добавление индекса для поля <Имя поля1>. Если имя индекса не указано, то ему присваивается имя совпадающее с именем поля.

ADD PRIMARY KEY

(<Имя поля1>, …)

Делает поле <Имя поля1> первичным ключом таблицы.

CHANGE <Старое имя поля>

<Новое имя поля> <Тип поля>

Изменение поля <Старое имя поля> на поле <Новое имя поля> с типом <Тип поля>

DROP <Имя поля>

Удаление поля

DROP PRIMARY KEY

Удаление первичного ключа таблицы

DROP INDEX <Имя индекса>

Удаление индекса

 

Например отредактируем таблицу test, созданную ранее. Удалим у неё поле description

 
$query = 'ALTER TABLE  `test` DROP `description`';
$database->setQuery($query);
if  ($database->query()){echo('Успешно<span>');}
else  {echo('</span>НЕУспешно<span>');}
</span>


3. DROP TABLE <Имя таблицы>  

<i>$query = 'DROP TABLE  `test`';
$database->setQuery($query);
if  ($database->query()){echo('Успешно<span>');}
else  {echo('</span>НЕУспешно<span>');}
</span></i>

Удаление таблицы test.

            SQL запросы на вставку, редактирование и удаление данных в таблицах.

                       1. INSERT INTO <Имя таблицы> VALUES (<Значение1>, …) 

<i>$query = 'INSERT INTO  `mdo_message` VALUES (1,"text", 1,1,1)';
$database->setQuery($query);
if  ($database->query()){echo('Успешно');}
else  {echo('НЕУспешно');}
</i>

2. INSERT INTO <Имя таблицы> (<Имя поля1>, …) VALUES (<Значение1>, …)  

<i>$query = 'INSERT INTO `mdo_message` (`message`) VALUES ("text")';
$database->setQuery($query);
if  ($database->query()){echo('Успешно');}
else  {echo('НЕУспешно');}
</i>

 

Вставляет запись в таблицу mdo_message. Значения всех полей кроме message устанавливаются по умолчанию.

                     3. DELETE FROM <Имя таблицы> WHERE <Усвловие> 

<i>$query = 'DELETE FROM  `mdo_message` WHERE `id_message`<1000';
$database->setQuery($query);
if  ($database->query()){echo('Успешно');}
else  {echo('НЕУспешно');}
</i>

Из таблицы mdo_message будут удалены все записи у которых значение поля id_message меньше 1000.

 Итак на этом шаге мы рассмотрели основные виды SQL запросов. Рассмотрели несколько примеров использования их в Joomla. На следующем шаге мы опишем разработку реакции на нажатие подпункта меню Наша доска->Просмотр и удаление объявлений.


 

Шаг восьмой. Разработка реакции на нажатие подпункта меню Наша доска->Просмотр и удаление объявлений. Отображение списка существующих объявлений.

При нажатии на Просмотр и удаление объявлений пользователь видит страницу описанную в шаге 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


Шаг девятый. Удаление сообщений. Небольшая оптимизация кода.

На этом шаге мы напишем реакцию на нажатие кнопки Удалить.

Для того чтобы удалить какие-то сообщения нужно: 1- отметить соответствующие чекбоксы, 2 – нажать кнопку Удалить.

Заметим, что после удаления сообщений должен снова появиться список сообщений (естественно обновившийся). Чтобы не писать один и тот же код несколько раз мы создадим функцию show_mess(), которая будет отображать нам список сообщений, с возможностью фильтрации и постраничной навигацией (т.е. все сделанное нами в 6 шаге).

Итак в файле admin.myboard.php в конце файла (но перед ?>) пишем следующее:

 
function show_mess()
{
}
 

Далее весь код написанный в предыдущем шаге, т.е. код расположенный в секции default конструкции switch ($task), вырезаем и вставляем в функцию show_mess(). Должно получиться вот так:

 
function show_mess()
{
//Сюда  вставляем наш скопированный код
}
 

Теперь, в каждом месте, где нам надо вывести вышеупомянутый список (таблицу), мы будем вставлять код:

 
show_mess();
 

Так как мы уже, сейчас можем сказать, где должны отображаться сообщения, вставим в нужные места вызов, созданной нами функции.

Привожу фрагмент кода:

 
......................
switch ($act)
{
case "view_mess": 
{
switch  ($task)
{
case "edit":
echo 'Редактирование сообщения';
break;
case "remove":
echo(&lsquo;Удаление сообщений &rsquo;);
show_mess();
break;
case "cancel":
echo 'Отмена редактирования сообщения';
show_mess();
break;
case "save":
echo 'Сохраниение сообщения';
show_mess();
break;
default:
show_mess();
break;
}
}
break;
default:
echo 'Выбран пункт наша доска';
show_mess();
break;
}
......................................
 

Сделав изменения, проверим как работает компонент. Если все нормально, то на нажатие всех кнопок тулбара кроме Изменить, результатом будет отображение соответствующего сообщения и списка объявлений.

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

Функция должна получить список идентификаторов сообщений, которые были выделены пользователем. Для этого в самом начале (после <?php) файла admin.mybord.php поместим следующий код:

 
$cid = josGetArrayInts( 'cid' );
 

Функция josGetArrayInts возвращает в переменную $cid массив переданный скрипту, так как мы использовали при создании списка сообщений стандартные средства Joomla, то все чекбоксы были названы (параметр name) cid[]. Таким образом скрипту был передан массив cid. Также можно использовать и функцию mosGetParam:

$cid = mosGetParam( $_REQUEST, 'cid', 0 );

Для удаления сообщений больше не нужно никакой информации поэтому пишем собственно саму функцию:

 
function  delete_mess($cid)
{
global $database;
$flag = true;
for ($i=0;$i<count($cid);$i++)
{
$query = "DELETE FROM  mdo_message".
"\n WHERE id_message=".$cid[$i];
$database->setQuery($query);
if  (!$database->query())
{
$flag=false;
}
}
if  ($flag) {echo("Удаление успешно");}
else {echo("В одном из запросов произошла ошибка");
}
 

В функции мы просматриваем массив $cid и удаляем из базы те записи, которые удовлетворяют равенству id_message=$cid[$i]( все сообщения идентификаторы которых были переданы в массиве $cid).

Переменная $flag используется для того, чтобы выяснить, все ли запросы на удаление были выполнены. Если хоть один запрос не выполнен, то будет выведено соответствующее сообщение.

Теперь имея на руках функцию нужно вызвать ее в нужном месте:

 
switch ($act)
{
case "view_mess": 
{
switch ($task)
{
case "edit":
echo 'Редактирование сообщения';
break;
case "remove":
delete_mess($cid);
//Не забываем передать функции  параметр &ndash; массив $cid
show_mess();
break;
case "cancel":
echo 'Отмена редактирования  сообщения';
show_mess();
break;
case "save":
echo 'Сохраниение сообщения';
show_mess();
break;
default:
show_mess();
break;
}
}
break;
default:
echo 'Выбран пункт наша доска';
show_mess();
break;
}
 

Снова проверяем работоспособность компонента. Если все нормально, то переходим к следующему шагу. На следующем шаге мы рассмотрим редактирование сообщений и напишем соответствующую функцию.

Вариант файла admin.myboard.php  на данном шаге

Важно: очень важно проводить тщательное тестирование на наличие ошибок, проверяйте все возможные случаи использования пользователем вашего компонента.


Шаг десятый. Редактирование сообщений в панели администратора.

Для того чтобы реализовать редактирование сообщения нам нужно написать функцию, которая получив в качестве параметра идентификатор сообщения отобразит форму с полем: объявление. В форме уже присутствует текст сообщения. Пользователю остается ввести другой текст или отредактировать существующий и сохранить сообщение.

Для начала я напомню, что идентификатор сообщения у нас передается в массив $cid. Да, да именно в массив (ведь пользователь может выбрать и несколько сообщений). Так как отредактировать физически мы можем только одно сообщения (ну по крайней мере одновременно 2 и больше я не умею редактировать), то передавать в функцию будем не весь массив а только первый его элемент ($cid[0]).

Сначала напишем пустую функцию и вставим ее вызов (edit_mess($cid[0]);) в место строчки:

 
echo 'Редактирование сообщения';
 

Функция:

 
function edit_mess($id_mess){}
 

Начнем:

1.Не забываем описать глобальную переменную $database

 
global $database;
 

2.Далее нужно запросить данные из базы данных. Нужно взять значение поля message той записи у которой значение поля id_message равно $id_mess. Следующие инструкции выполнят поставленную задачу:

 
//Пишем запрос
$query = "SELECT message FROM mdo_message  WHERE id_message=".$id_mess;
//Устанавливаем значение свойства  query объекта $database
$database->setQuery($query);
//Выполняем запрос и помещаем  результат в переменную
$message =  $database->loadResult();
 

3.Показываем поле <textarea>, с текстом $message:

 
Объявление<br>
<textarea cols="50" rows="6"  name="message" style="width: 500px"><?php echo($message);  ?></textarea>
 

4.Для того, чтобы после нажатия на кнопку Сохранить скрипт передал дальше значение $id_mess нужно вставить поле скрытого типа (hidden):

 
<input type="hidden" name="id_mess" value="<?php echo($id_mess);  ?>">}
 

В результате получается:

 
function edit_mess($id_mess)
{
global  $database;
$query = "SELECT message FROM mdo_message  WHERE id_message=".$id_mess;
$database->setQuery($query);
$message =  $database->loadResult();
?>
Объявление<br>
<textarea cols="50" rows="6"  name="message" style="width: 500px"><?php echo($message);  ?></textarea>
<input type="hidden" name="id_mess"  value="<?php echo($id_mess); ?>">
<?php
}
 

После того как пользователь отредактировал объявление нужно его сохранить, для этого напишем соответствующую функцию (save_mess();). Данная функция не будет иметь параметров, потому что единственный параметр который мы передаем это id_mess. Мы его можем с помощью функции mosGetParam взять прямо в теле функции. Хотя конечно на вкус и цвет…. Можно в начале файла получить значение id_mess и использовать функцию с параметром:

 
function save_mess()
{
global  $database;
$id_mess = intval( mosGetParam( $_REQUEST,  'id_mess', 0 ) );
$message = mosGetParam( $_REQUEST, 'message',  '' );
if (($id_mess<>0) and  ($message<>''))
{
$query = "UPDATE  mdo_message SET message='".$message."' WHERE id_message=".$id_mess;
$database->setQuery($query);
if  ($database->query())
{
echo("<br>Обновление записи успешно<br>");
}
else
{
echo("<br>Ошибка баз данных!<br>");
}
}
else
{
echo("<br>Ошибка! Попробуйте еще раз!<br>");
}
}
 

Вызов функции вставляем вместо строчки:

 
echo 'Сохраниение сообщения';
 

В итоге мы закончили с панелью администратора, в следующем шаге начнем реализовывать лицевую часть компонента.

Оригинал статьи - Создай компонент Joomla свлими руками
© 2008 Created by Dapmoed

 

 

 

Комментарии  

Коммент от
Июл 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
2105
2.
Хак постраничной навигации сайта на CMS Joomla!
882
3.
Дополнительное изменяемое поле "Телефон"
513

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

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