Browse Source
Add config database table and enable crud page. Also add cache controller, model and view and routes for these pages. Make the JavaScript display a message when changing the state of development mode.master
Riyyi
3 years ago
8 changed files with 261 additions and 39 deletions
@ -0,0 +1,128 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Controllers; |
||||||
|
|
||||||
|
use App\Classes\Config; |
||||||
|
use App\Model\ConfigModel; |
||||||
|
|
||||||
|
class CacheController extends PageController { |
||||||
|
|
||||||
|
public function cacheAction(): void |
||||||
|
{ |
||||||
|
$config = $this->getConfigValues(); |
||||||
|
|
||||||
|
$this->router->service()->config = $config; |
||||||
|
parent::view(); |
||||||
|
} |
||||||
|
|
||||||
|
public function developmentAction(): void |
||||||
|
{ |
||||||
|
if (Config::c('CLOUDFLARE_ENABLED') != '1') { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
$token = Config::c('CLOUDFLARE_TOKEN'); |
||||||
|
$zone = Config::c('CLOUDFLARE_ZONE'); |
||||||
|
|
||||||
|
$url = "https://api.cloudflare.com/client/v4/zones/$zone/settings/development_mode"; |
||||||
|
$headers = [ |
||||||
|
"Authorization: Bearer $token", |
||||||
|
"Content-Type: application/json" |
||||||
|
]; |
||||||
|
|
||||||
|
$config = $this->getConfigValues(); |
||||||
|
$currentState = $config['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED']; |
||||||
|
|
||||||
|
$newState = $currentState == '1' ? 'off' : 'on'; |
||||||
|
$data = '{"value": "' . $newState . '"}'; |
||||||
|
|
||||||
|
$curl = curl_init(); |
||||||
|
curl_setopt($curl, CURLOPT_URL, $url); |
||||||
|
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); |
||||||
|
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); |
||||||
|
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'PATCH'); |
||||||
|
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); |
||||||
|
// curl_setopt($curl, CURLINFO_HEADER_OUT, 1); |
||||||
|
|
||||||
|
$response = curl_exec($curl); |
||||||
|
// $info = curl_getinfo($curl, CURLINFO_HEADER_OUT); |
||||||
|
|
||||||
|
curl_close($curl); |
||||||
|
|
||||||
|
$this->saveConfigValues($response); |
||||||
|
|
||||||
|
echo $response; |
||||||
|
// echo $info; |
||||||
|
} |
||||||
|
|
||||||
|
//-------------------------------------// |
||||||
|
|
||||||
|
private static function getConfigValues(): array |
||||||
|
{ |
||||||
|
$result = []; |
||||||
|
|
||||||
|
$config = [ |
||||||
|
'CLOUDFLARE_DEVELOPMENT_MODE_ENABLED' => '0', |
||||||
|
'CLOUDFLARE_DEVELOPMENT_MODE_UPDATED_AT' => '', |
||||||
|
'CLOUDFLARE_DEVELOPMENT_MODE_EXPIRES_IN' => '', |
||||||
|
]; |
||||||
|
|
||||||
|
foreach ($config as $key => $value) { |
||||||
|
$result[$key] = ConfigModel::firstOrCreate( |
||||||
|
['key' => $key], |
||||||
|
['value' => $value] |
||||||
|
)->value; |
||||||
|
} |
||||||
|
|
||||||
|
if ($result['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED']) { |
||||||
|
$expiresIn = $result['CLOUDFLARE_DEVELOPMENT_MODE_EXPIRES_IN']; |
||||||
|
$updatedAt = $result['CLOUDFLARE_DEVELOPMENT_MODE_UPDATED_AT']; |
||||||
|
|
||||||
|
$expiresAtObject = new \DateTime($updatedAt); |
||||||
|
$expiresAt = $expiresAtObject |
||||||
|
->modify("+ $expiresIn seconds") |
||||||
|
->format('Y-m-d H:i:s'); |
||||||
|
$nowObject = new \DateTime('now'); |
||||||
|
$now = $nowObject->format('Y-m-d H:i:s'); |
||||||
|
|
||||||
|
if ($now >= $expiresAt) { |
||||||
|
ConfigModel::updateOrCreate( |
||||||
|
['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'], |
||||||
|
['value' => 0]); |
||||||
|
$result['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'] = 0; |
||||||
|
} |
||||||
|
else { |
||||||
|
$result['enabled-remaining'] = $expiresAtObject->modify( |
||||||
|
'- ' . $nowObject->getTimestamp() . ' seconds' |
||||||
|
)->format('H:i:s'); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return $result; |
||||||
|
} |
||||||
|
|
||||||
|
private static function saveConfigValues(string $response): void |
||||||
|
{ |
||||||
|
$decodedResponse = json_decode($response, true); |
||||||
|
if ($decodedResponse['success'] == true) { |
||||||
|
$state = $decodedResponse['result']['value']; |
||||||
|
$expiresIn = $decodedResponse['result']['time_remaining']; |
||||||
|
$updatedAt = $decodedResponse['result']['modified_on']; |
||||||
|
|
||||||
|
$updatedAtFormatted = (new \DateTime($updatedAt))->format('Y-m-d H:i:s'); |
||||||
|
|
||||||
|
ConfigModel::updateOrCreate( |
||||||
|
['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'], |
||||||
|
['value' => $state == 'on' ? 1 : 0]); |
||||||
|
|
||||||
|
ConfigModel::updateOrCreate( |
||||||
|
['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_EXPIRES_IN'], |
||||||
|
['value' => $expiresIn]); |
||||||
|
|
||||||
|
ConfigModel::updateOrCreate( |
||||||
|
['key' => 'CLOUDFLARE_DEVELOPMENT_MODE_UPDATED_AT'], |
||||||
|
['value' => $updatedAtFormatted]); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
namespace App\Model; |
||||||
|
|
||||||
|
use App\Traits\Log; |
||||||
|
|
||||||
|
class ConfigModel extends Model { |
||||||
|
|
||||||
|
use Log; |
||||||
|
|
||||||
|
protected $table = 'config'; |
||||||
|
protected $sort = 'key'; |
||||||
|
|
||||||
|
public $title = "Config"; |
||||||
|
|
||||||
|
// Attribute rules |
||||||
|
// Name | Type | Required | Filtered |
||||||
|
public $rules = [ |
||||||
|
["key", "text", 1, 0], |
||||||
|
["value", "text", 0, 0], |
||||||
|
["log_id", "text", 1, 1], |
||||||
|
]; |
||||||
|
} |
@ -0,0 +1,82 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use \App\Classes\Config; |
||||||
|
?> |
||||||
|
<div class="content shadow p-4 mb-4"> |
||||||
|
<h3 class="mb-4">Cache</h3> |
||||||
|
|
||||||
|
<?php if (Config::c('CLOUDFLARE_ENABLED') != '1') { ?> |
||||||
|
To enable the Cloudflare cache options, |
||||||
|
make sure to set the following option in the <p>config.php</p> file: |
||||||
|
<pre class="line-numbers mb-4 language-php"><p class="language-php"><span class="token single-quoted-string string">'CLOUDFLARE_ENABLED'</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token single-quoted-string string">'1'</span><span class="token punctuation">,</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></p></pre> |
||||||
|
</p><?php } else { ?> |
||||||
|
<div> |
||||||
|
<p> |
||||||
|
Cloudflare cache options: |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<hr> |
||||||
|
<div class="row align-items-center"> |
||||||
|
<div class="col-9 col-md-10 col-lg-11"> |
||||||
|
<h5>Purge CSS/JavaScript</h5> |
||||||
|
<p class="mb-0">Granuarly remove .css and .js files from Cloudflare's cache.</p> |
||||||
|
</div> |
||||||
|
<div class="col-3 col-md-2 col-lg-1"> |
||||||
|
<div class="d-flex justify-content-end"> |
||||||
|
<button id="" class="btn btn-dark">Purge</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<hr> |
||||||
|
<div class="row align-items-center"> |
||||||
|
<div class="col-9 col-md-10 col-lg-11"> |
||||||
|
<h5>Purge Fonts/Images</h5> |
||||||
|
<p class="mb-0">Granuarly remove font and images files from Cloudflare's cache.</p> |
||||||
|
</div> |
||||||
|
<div class="col-3 col-md-2 col-lg-1"> |
||||||
|
<div class="d-flex justify-content-end"> |
||||||
|
<button id="" class="btn btn-danger">Purge</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<hr> |
||||||
|
<div class="row align-items-center"> |
||||||
|
<div class="col-9 col-md-10 col-lg-11"> |
||||||
|
<h5>Purge All Files</h5> |
||||||
|
<p class="mb-0">Remove ALL files from Cloudflare's cache.</p> |
||||||
|
</div> |
||||||
|
<div class="col-3 col-md-2 col-lg-1"> |
||||||
|
<div class="d-flex justify-content-end"> |
||||||
|
<button id="" class="btn btn-danger">Purge</button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<hr> |
||||||
|
<div class="row align-items-center"> |
||||||
|
<div class="col-9 col-mlg-10 col-xl-11"> |
||||||
|
<h5>Enable Development Mode</h5> |
||||||
|
<p class="mb-0"> |
||||||
|
This will bypass Cloudflare's accelerated cache and slow down your site, |
||||||
|
but is useful if you are making changes to cacheable content |
||||||
|
(like images, CSS, or JavaScript) and would like to see those changes right away. |
||||||
|
Once entered, development mode will last for 3 hours and then automatically toggle off. |
||||||
|
<?php $state = $this->config['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED']; ?> |
||||||
|
<span id="develop-enabled" style="visibility: <?= $state == '1' ? 'visible' : 'hidden'; ?>;">
|
||||||
|
Enabled for another |
||||||
|
<code id="develop-remaining"> |
||||||
|
<?= $state == '1' ? $this->config['enabled-remaining'] : ''; ?> |
||||||
|
</code> hours. |
||||||
|
</span> |
||||||
|
</p> |
||||||
|
</div> |
||||||
|
<div class="col-3 col-lg-2 col-xl-1"> |
||||||
|
<div class="d-flex justify-content-start"> |
||||||
|
<input type="checkbox" id="development-mode" |
||||||
|
<?= $this->config['CLOUDFLARE_DEVELOPMENT_MODE_ENABLED'] ? 'checked' : ''; ?>>
|
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<?php } ?> |
||||||
|
|
||||||
|
<div class="pb-5"></div> |
||||||
|
</div> |
Loading…
Reference in new issue