При создании компонентов для Joomla иногда требуется вместе с записью базы данных из админки, удалять какие-либо файлы с сервера записанные в удаляемой таблице. В файле administrator/components/ваш_компонент/view/ваш_шаблон_вида/view.html.php
есть стандартная функция addToolBar
которая добавляет панель с кнопками создания, редактирования, удаления и т.д.
protected function addToolbar()
{
JToolBarHelper::title( JText::_( 'COM_COMPONENT' ) );
$canDo = componentHelper::getActions( 'rooms' );
if ( $canDo->get( 'core.create' ) || ( count( $this->user->getAuthorisedCategories( 'com_component', 'core.create' ) ) ) > 0 ) {
JToolBarHelper::addNew( 'rooms.add' );
}
if ( ( $canDo->get( 'core.edit' ) ) || ( $canDo->get( 'core.edit.own' ) ) ) {
JToolBarHelper::editList( 'rooms.edit' );
}
if ( $canDo->get( 'core.edit.state' ) ) {
JToolBarHelper::divider();
JToolBarHelper::publish( 'roomss.publish', 'JTOOLBAR_PUBLISH', true );
JToolBarHelper::unpublish( 'roomss.unpublish', 'JTOOLBAR_UNPUBLISH', true );
JToolBarHelper::divider();
if ( $canDo->get( 'core.delete' ) ) {
JToolBarHelper::deleteList( 'DELETE_QUERY_STRING', 'roomss.delete', 'JTOOLBAR_DELETE' ); //('заглушка_предупреждения_удаления', 'модель.метод', 'текст_кнопки')
JToolBarHelper::divider();
}
if ( $canDo->get( 'core.admin' ) ) {
JToolBarHelper::preferences( 'com_component' );
JToolBarHelper::divider();
}
}
}
Или добавить кнопку в шаблоне view. Приведу пример из моего компонента фотогалереи который я делал для одного сайта.
administrator/components/ваш_компонент/view/gallery_ams/tmpl/default.php
JToolBarHelper::deleteList('Все записи и прикрепленные файлы будут удалены. Продолжить?', 'gallery_ams.delete', 'JTOOLBAR_DELETE');
Теперь нужно добавить функцию в контроллер
administrator/components/ваш_компонент/controllers/gallery_ams.php
public function delete(){
$model = $this->getModel('gallery_ams'); // инициализация модели к которой будем обращаться
if ($model->remove()){ // функция удаления записи
$message = JText::_('Записи удалены успешно!');
}
else {
$message = JText::_('Невозможно удалить записи!');
$message .= '['.$model->getError().']';
}
$this->setRedirect('index.php?option=com_amgallery', $message); // редирект
}
Этот функция обрабатывает ответ и делает редирект с сообщением об ошибке или успехе.
Перед тем как удалить запись из базы данных. Возьмем имена файлов из колонки 'am_img', подставим путь к папке и удалим файлы. Затем удалим запись в таблице БД.
administrator/components/ваш_компонент/models/gallery_ams.php
function remove(){
$table = $this->getTable('Fotogallery_Am');
$cids = JRequest::getVar('cid', array(0), 'post', 'array'); // массив отмеченных записей
$params = JComponentHelper::getParams('com_amgallery'); // инициализация параметров компонента
$dir = $params->get('full_path'); // путь к папке с файлами
foreach ($cids as $cid){
$query = $this->getDbo()->getQuery( true );
$query->select( 'am_img' )->from( '#__fotogallery_am' )->where( 'id='.$cid ); // берем имена файлов из таблицы
$db = JFactory::getDBO();
$db->setQuery($query);
$name_img = $db->loadResult();
$file = $dir.$name_img; // объединяем путь с именем фалов
jimport( 'joomla.filesystem.file' );
JFile::delete($file); // удаляем файлы
if (!$table->delete($cid)) { // удаляем запись БД
$this->setError($table->getErrorMsg());
return false; // в случае неудачи возвращает false
}
}
return true;
}