Удаление страницы (Модуль Pages phpFox 3)

17:43 20.06.2017
Модуль Pages предназначен для создания отдельных страниц, что то типа "группы". Каждая созданная страница имеет свой форум, блог, раздел фотографий, раздел событий и видео архив.

Если потребуется удалить страницу, то после удаления останутся записи, что принадлежали страницы: темы форума, блоги, события и так далее. Я решил написать функцию, которая будет удалять все это вместе со страницей. Моя функция по удаляет только темы форума, но скоро мои руки будут посвободнее и я допишу функции до конца.

И так. Открываем: module/pages/include/service/process.class.php, находим функцию delete:
	public function delete($id, $callback = true)
	{
		...
	}

В этой функции, перед:
			return true;
		}

Добавляем:
			$this->deleteOther($page['page_id']);

После функции delete добавляем новую функцию:
	# Удаление всех записей связанных с удаляемой страницей
	private function deleteOther($id)
	{
		# Удаление тем форума
		$threads = $this->database()
			->select('thread_id')
			->from(Phpfox::getT('forum_thread'))
			->where('group_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($threads))
		{
			$process = Phpfox::getService('forum.thread.process');

			foreach ($threads as $thread)
			{
				$process->delete($thread['thread_id']);
			}
		}
		# Удаление тем форума END
	} # Удаление всех записей связанных с удаляемой страницей END

Готово.

Обратите внимание на то, что название моих переменных может отличаться от ваших.

Для удаление статей блогов удаляемой страницы: перед комментарием:
		# Удаление тем форума

Добавляем следующий код:
		# Удаление статей блога
		$blogs = $this->database()
			->select('blog_id')
			->from(Phpfox::getT('blog'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($blogs))
		{
			$process = Phpfox::getService('blog.process');

			foreach ($blogs as $blog)
			{
				$process->delete($blog['blog_id']);
			}
		}
		# Удаление статей блога END

Для удаления музыки, что принадлежит удаляемой страницы, после:
		# Удаление тем форума END

Добавляем:
		# Удаление музыки
		$songs = $this->database()
			->select('song_id')
			->from(Phpfox::getT('music_song'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($songs))
		{
			$process = Phpfox::getService('music.process');

			foreach ($songs as $song)
			{
				$process->delete($song['song_id']);
			}
		}
		# Удаление музыки END

Для удаления видео вставляем код:
		# Удаление видео
		$videos = $this->database()
			->select('video_id')
			->from(Phpfox::getT('video'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($videos))
		{
			$process = Phpfox::getService('video.process');

			foreach ($videos as $video)
			{
				$process->delete($video['video_id']);
			}
		}
		# Удаление видео END

Для удаления событий:
		# Удаление событий
		$events = $this->database()
			->select('event_id')
			->from(Phpfox::getT('event'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($events))
		{
			$process = Phpfox::getService('event.process');

			foreach ($events as $event)
			{
				$process->delete($event['event_id']);
			}
		}
		# Удаление событий END

Фотографии, что были загружены от имени страницы, удаляются вместе со страницей, а те, что загружены от имени пользователя остаются.
Если надо, чтобы удалялись все фотографии, то добавьте в функцию deleteOther следующий код:
		# Удаление фото
		$photos = $this->database()
			->select('photo_id')
			->from(Phpfox::getT('photo'))
			->where('module_id = \'pages\' AND group_id = ' . $id . ' AND user_id NOT IN (\'' . $id . '\')')
			->execute('getSlaveRows');

		if (!empty($photos))
		{
			$process = Phpfox::getService('photo.process');

			foreach ($photos as $photo)
			{
				$process->delete($photo['photo_id']);
			}
		}
		# Удаление фото END

Код всей функции deleteOther, у меня получился таким:
	# Удаление всех записей связанных с удаляемой страницей
	private function deleteOther($id)
	{
		# Удаление статей блога
		$blogs = $this->database()
			->select('blog_id')
			->from(Phpfox::getT('blog'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($blogs))
		{
			$process = Phpfox::getService('blog.process');

			foreach ($blogs as $blog)
			{
				$process->delete($blog['blog_id']);
			}
		}
		# Удаление статей блога END

		# Удаление событий
		$events = $this->database()
			->select('event_id')
			->from(Phpfox::getT('event'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($events))
		{
			$process = Phpfox::getService('event.process');

			foreach ($events as $event)
			{
				$process->delete($event['event_id']);
			}
		}
		# Удаление событий END

		# Удаление тем форума
		$threads = $this->database()
			->select('thread_id')
			->from(Phpfox::getT('forum_thread'))
			->where('group_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($threads))
		{
			$forum = Phpfox::getService('forum.thread.process');

			foreach ($threads as $thread)
			{
				$forum->delete($thread['thread_id']);
			}
		}
		# Удаление тем форума END

		# Удаление музыки
		$songs = $this->database()
			->select('song_id')
			->from(Phpfox::getT('music_song'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($songs))
		{
			$process = Phpfox::getService('music.process');

			foreach ($songs as $song)
			{
				$process->delete($song['song_id']);
			}
		}
		# Удаление музыки END

		# Удаление фото
		$photos = $this->database()
			->select('photo_id')
			->from(Phpfox::getT('photo'))
			->where('module_id = \'pages\' AND group_id = ' . $id . ' AND user_id NOT IN (\'' . $id . '\')')
			->execute('getSlaveRows');

		if (!empty($photos))
		{
			$process = Phpfox::getService('photo.process');

			foreach ($photos as $photo)
			{
				$process->delete($photo['photo_id']);
			}
		}
		# Удаление фото END

		# Удаление видео
		$videos = $this->database()
			->select('video_id')
			->from(Phpfox::getT('video'))
			->where('module_id = \'pages\' AND item_id = ' . $id)
			->execute('getSlaveRows');

		if (!empty($videos))
		{
			$process = Phpfox::getService('video.process');

			foreach ($videos as $video)
			{
				$process->delete($video['video_id']);
			}
		}
		# Удаление видео END
	} # Удаление всех записей связанных с удаляемой страницей END