Черновик кода

Многие написанные мной "примочки" не были использованы в движке, так как менялись планы. В дальнейшем код удалялся, а мог оказаться кому то полезным. Именно это и дало идею написать данную тему. Тут я буду выкладывать разные "примочки" для движка, что начинал писать, но так и не использовал или не дописал до конца / не довел до ума. От того и черновик.

Возможно планы поменяются опять, а код можно взять из черновика (От сюда)!
Я удалил стандартную модификацию рекламных объявлений, сейчас я пишу свой мод рекламы. В нем был написан метод для получения рекламных объявлений getAds:
	// Получение объявлений для рекламного блока
	public function getAds()
	{
		$ads = $this->database()
			->select('*')
			->from($this->database()->getTable('ad'))
			->where('amount > 0 AND permission = 1 AND activity = 1')
			->order('RAND()')
			->limit(phpfox::isMobile() ? 1 : 3)
			->execute('getSlaveRows');

		if (empty($ads))
		{
			return false;
		}

		foreach ($ads as $key => $ad)
		{
			$sql = [];
			$sql['view'] = ++$ad['view'];
			if ($ad['traffic'] == 'view')
			{
				$sql['amount'] = --$ad['amount'];
			}

			$this->database()->update($this->database()->getTable('ad'), $sql, 'ad_id = ' . (int) $ad['ad_id']);

			$ads[$key]['url'] = phpfox::getLib('url')->makeUrl('ad.url', ['id' => $ad['ad_id']]);
		}

		return $ads;
	} // End: Получение объявлений для рекламного блока

Мне данный метод не понравился, из за того, что он выполняет аж четыре запроса в полной версии сайта. Недавно я его переписал так:
	// Получение объявлений для рекламного блока
	public function getAds()
	{
		$ads = $this->database()
			->select('*')
			->from($this->database()->getTable('ad'))
			->where('amount > 0 AND permission = 1 AND activity = 1')
			->order('RAND()')
			->limit(phpfox::isMobile() ? 1 : 3)
			->execute('getSlaveRows');

		if (empty($ads))
		{
			return false;
		}

		$sql   = null;
		$adIDs = null;

		foreach ($ads as $key => $ad)
		{
			$sql .= 'view = CASE WHEN ad_id = ' . $ad['ad_id'] . ' THEN ' . ++$ad['view'] . ' ELSE view END, ';
			if ($ad['traffic'] == 'show')
			{
				$sql .= 'amount = CASE WHEN ad_id = ' . $ad['ad_id'] . ' THEN ' . --$ad['amount'] . ' ELSE amount END, ';
			}

			$adIDs .= $ad['ad_id'] . ', ';

			$ads[$key]['url'] = phpfox::getLib('url')->makeUrl('ad.url', ['id' => $ad['ad_id']]);
		}

		$sql   = trim($sql, ', ');
		$adIDs = trim($adIDs, ', ');

		$this->database()->update($this->database()->getTable('ad'), $sql, 'ad_id IN (' . $adIDs . ')');

		return $ads;
	} // End: Получение объявлений для рекламного блока

Потом немного улучшил:
	// Получение объявлений для рекламного блока
	public function getAds()
	{
		$ads = $this->database()
			->select('*')
			->from($this->database()->getTable('ad'))
			->where('amount > 0 AND permission = 1 AND activity = 1')
			->order('RAND()')
			->limit(phpfox::isMobile() ? 1 : 3)
			->execute('getSlaveRows');

		if (empty($ads))
		{
			return false;
		}

		$view   = 'view = CASE ad_id';
		$amount = null;
		$adIDs  = null;

		foreach ($ads as $key => $ad)
		{
			$view .= ' WHEN ' . $ad['ad_id'] . ' THEN ' . ++$ad['view'];
			if ($ad['traffic'] == 'view')
			{
				$amount .= ' WHEN ' . $ad['ad_id'] . ' THEN ' . --$ad['amount'];
			}

			$adIDs .= $ad['ad_id'] . ', ';

			$ads[$key]['url'] = phpfox::getLib('url')->makeUrl('ad.url', ['id' => $ad['ad_id']]);
		}

		$sql = $view . ' END' . ($amount != null ? ', amount = CASE ad_id' . $amount . ' ELSE amount END' : '');

		$this->database()->update($this->database()->getTable('ad'), $sql, 'ad_id IN (' . trim($adIDs, ', ') . ')');

		return $ads;
	} // End: Получение объявлений для рекламного блока

В запросе на обновление используется строка вместо массива, что не вписывается в стандартный метод обновления записи phpFox. И я это поправил так: открываю файл: "include/library/phpfox/database/dba.class.php" и правлю метод update, вот так:
	public function update($table, $values = [], $cond = null, $escape = true)
	{
		if (!is_array($values) && count($this->data))
		{
			$cond   = $values;
			$values = $this->data;
			$this->data = [];
		}

		if (is_string($values))
		{
			return $this->query($this->_update($table, $values, $cond));
		}

		$sets = '';
		foreach ($values as $col => $value)
		{
			$cmd = '=';
			if (is_array($value))
			{
				$cmd   = $value[0];
				$value = $value[1];
			}

			$sets .= $col . ' ' . $cmd . ' ' . (is_null($value) ? 'NULL' : ($escape ? "'" . $this->escape($value) . "'" : $value)) . ', ';
		}
		$sets = substr_replace($sets, '  ', -2, 1);

		return $this->query($this->_update($table, $sets, $cond));
	}

Теперь метод обновления, может работать со строками.
Для обработки URL я когда то написал функцию correctURL:
	// Обработка URL
	public function correctURL()
	{
		$request = phpfox::getLib('request');

		$bool   = false;
		$header = null;

		$url = $request->getServer('REQUEST_URI');

		// Удаление WWW из URL
		if (stristr($request->getServer('HTTP_HOST'), 'www.') !== false)
		{
			$bool   = true;
			$header = 301;
		} // Удаление WWW из URL End

		// Удаление "index.php" из URL
		if (stristr($url, 'index.php') !== false)
		{
			$bool   = true;
			$header = 301;

			$url = str_replace('index.php', '', $url);
		} // Удаление "index.php" из URL End

		// Удаление "do=/" из URL
		if (stristr($url, 'do=/') !== false)
		{
			$bool   = true;
			$header = 301;

			$urls = explode('do=/', $url);
			$url  = $urls[1];
		} // Удаление "do=/" из URL End

		// Удаление "page_0" | "page_1" из URL
		if (preg_match('/page_(0|1)?\//i', $url) && stristr($url, 'admincp/') === false)
		{
			$bool   = true;
			$header = 301;

			$url = preg_replace('/page_(0|1)?\//', '', $url);
		} // Удаление "page_0" | "page_1" из URL End

		// Добавление слеша в конце URL, если его там нет
		if (substr($url, -1) != PHPFOX_DS)
		{
			if (!preg_match('/(.*)\.(jpg|jpeg|gif|png|js|css|ico)/i', $url))
			{
				$bool = true;
			}
		} // Добавление слеша в конце URL, если его там нет End

		// Удаление лишних слешев
		if (preg_match('/\/{2,}/i', $url))
		{
			$bool   = true;
			$header = 301;

			$url = preg_replace('/\/{2,}/', '$1/', $url);
		} // Удаление лишних слешев End

		if ($bool)
		{
			$url = str_replace('/', '.', $url);

			$this->send($url, [], null, $header);
		}
	} // Обработка URL End

Недавно дошли руки до этой функции, хочу от нее избавиться, переписав все в Nginx. Уже работаю над этим:
- Блог: Nginx: Удаление лишних слэшев в URL
- Блог: Nginx: Добавление слеша в конце URL, если его там нет
- Блог: Nginx: Удаление параметров в URL
Для одного приложения сайта (Мини игра), написал метод, который получает из массива случайное значение, затем пересохраняет файл с массивом, без значения, что уже было получено (Чтобы исключить повторы):
	public function content($who)
	{
		include ('database/' . USER_ID . '/category.php');

		$category = $data[array_rand($data)];

		$file = APP_DIR . 'database/' . USER_ID . '/' . $category . '/' . $who . '.php';

		if (!file_exists($file))
		{
			if (!file_exists(APP_DIR . 'database/' . USER_ID . '/' . $category))
			{
				mkdir(APP_DIR . 'database/' . USER_ID . '/' . $category, 0777, true);
			}

			include ('content/' . LANG_ID . '/' . $category . '/' . $who . '.php');

			$data  = '<?php' . "\n";
			$data .= '$content = ' . var_export($content, true) . ';';

			file_put_contents($file, $data);
		}

		// Файл для выбора задания
		include ($file);

		$key = array_rand($content);
		$task = $content[$key];

		unset($content[$key]);
		$data  = '<?php' . "\n";
		$data .= '$content = ' . var_export($content, true) . ';';
		file_put_contents($file, $data);

		return $this->language(null, 'category') . ': <strong>' . $this->language(null, $category) . '</strong><br />' . $task;
	}

Это первая версия функция. Думаю, можно будет допилить её до ума... Не понравилась мне моя идея написать данный метод, таким образом... Я исправил функцию так:
	public function content($who)
	{
		include ('database/' . USER_ID . '/category.php');

		$category = $data[array_rand($data)];

		include ('content/' . LANG_ID . '/' . $category . '/' . $who . '.php');

		$file = APP_DIR . 'database/' . USER_ID . '/task/' . $category . ucfirst($who) . '.php';
		if (!file_exists($file))
		{
			if (!file_exists(APP_DIR . 'database/' . USER_ID . '/task/'))
			{
				mkdir(APP_DIR . 'database/' . USER_ID . '/task/', 0777, true);
			}

			$key = array_rand($content);
			file_put_contents($file, $key);
			$content = $content[$key];
		}
		else
		{
			$exception = file_get_contents($file);
			$exception = explode('|', $exception);

			$array = array_diff_key($content, $exception);
			if (empty($array))
			{
				$content = array_diff($data, [$category]);
				$data  = '<?php' . "\n";
				$data .= '$data = ' . var_export($content, true) . ';';
				file_put_contents('database/' . USER_ID . '/category.php', $data);

				return $this->content($who);
			}

			$key   = array_rand($array);
			file_put_contents($file, '|' . $key, FILE_APPEND);
			$content = $array[$key];
		}

		return $this->language(null, 'category') . ': <strong>' . $this->language(null, $category) . '</strong><br />' . $content;
	}

И тоже мне, что то не нравится...

А так выглядит функция без пересохранения файла, где просто отдаётся случайное значение, и без файлов с ID уже использованных значений:
	public function content($who)
	{
		include ('database/' . USER_ID . '/category.php');

		$category = $data[array_rand($data)];

		include ('content/' . LANG_ID . '/' . $category . '/' . $who . '.php');

		return $this->language(null, 'category') . ': <strong>' . $this->language(null, $category) . '</strong><br />' . $content[array_rand($content)];
	}
Недавно писал таймер. Идея была такая: жмём кнопку, кнопка исчезает, появляется таймер и отсчитывает 30 секунд. По истечению времени, таймер исчезает, появляется кнопка. Защита от многократного нажатия, так сказать.

jQuery:
// Таймера (Обратный отсчёт)
function timer() {
	var timer, sec = 30;

	$('.timer').text(sec);
	$('.timer').css('display', 'inline-block');

	timer = setInterval(function() {
		--sec;
		$('.timer').text(sec);

		if (!sec) {
			clearInterval(timer);
			$('#receiving').css('display', 'block');
			$('.timer').css('display', 'none');
		};
	}, 1000);
}; // End: Таймера (Обратный отсчёт)

CSS:
.timer {
	border-radius: 3px;
	display: none;
	position: absolute;
	right: 5px;
	bottom: 5px;
	display: none;
	background: #FF6A00;
	color: #FFFFFF;
	padding: 6px 18px 6px 18px;
	font-size: 15px;
	font-weight: bold;
}

HTML:
<div href="#" class="timer" title:"{timer}"></div>
Удаление файлов и папок:
	// Удаление Директории | Файла
	public function destruction($path)
	{
		if (is_dir($path) === true)
		{
			$files = array_diff(scandir($path), ['.', '..']);

			foreach ($files as $file)
			{
				$this->destruction(realpath($path) . '/' . $file);
			}

			return rmdir($path);
		}
		else if (is_file($path) === true)
		{
			return unlink($path);
		}
	} // End: Удаление Директории | Файла