Log in / Register
Login to your account
Remember Me
Create an account
Fields marked with an asterisk (*) are required.
Reload Captcha

Удаление файлов при удалении записи из базы данных

Rate this item
(2 votes)

При создании компонентов для 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;
}

Leave a comment