Черновик кода
21.04.2024 01:00:40 pm
Многие написанные мной "примочки" не были использованы в движке, так как менялись планы. В дальнейшем код удалялся, а мог оказаться кому то полезным. Именно это и дало идею написать данную тему. Тут я буду выкладывать разные "примочки" для движка, что начинал писать, но так и не использовал или не дописал до конца / не довел до ума. От того и черновик.
Возможно планы поменяются опять, а код можно взять из черновика (От сюда)!
Возможно планы поменяются опять, а код можно взять из черновика (От сюда)!
- Жалоба
21.04.2024 01:10:51 pm
Я удалил стандартную модификацию рекламных объявлений, сейчас я пишу свой мод рекламы. В нем был написан метод для получения рекламных объявлений
Мне данный метод не понравился, из за того, что он выполняет аж четыре запроса в полной версии сайта. Недавно я его переписал так:
Потом немного улучшил:
В запросе на обновление используется строка вместо массива, что не вписывается в стандартный метод обновления записи phpFox. И я это поправил так: открываю файл: "include/library/phpfox/database/dba.class.php" и правлю метод
Теперь метод обновления, может работать со строками.
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));
}
Теперь метод обновления, может работать со строками.
30.05.2024 07:46:16 am
Для обработки URL я когда то написал функцию
Недавно дошли руки до этой функции, хочу от нее избавиться, переписав все в Nginx. Уже работаю над этим:
- Блог: Nginx: Удаление лишних слэшев в URL
- Блог: Nginx: Добавление слеша в конце URL, если его там нет
- Блог: Nginx: Удаление параметров в 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
26.12.2024 07:20:12 am
Для одного приложения сайта (Мини игра), написал метод, который получает из массива случайное значение, затем пересохраняет файл с массивом, без значения, что уже было получено (Чтобы исключить повторы):
Это первая версия функция. Думаю, можно будет допилить её до ума... Не понравилась мне моя идея написать данный метод, таким образом... Я исправил функцию так:
И тоже мне, что то не нравится...
А так выглядит функция без пересохранения файла, где просто отдаётся случайное значение, и без файлов с ID уже использованных значений:
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)];
}
28.12.2024 06:34:27 am
Недавно писал таймер. Идея была такая: жмём кнопку, кнопка исчезает, появляется таймер и отсчитывает 30 секунд. По истечению времени, таймер исчезает, появляется кнопка. Защита от многократного нажатия, так сказать.
jQuery:
CSS:
HTML:
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>
05.01.2025 07:05:10 pm
Удаление файлов и папок:
// Удаление Директории | Файла
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: Удаление Директории | Файла