From 35aef576ccb050e04a45540d77c910cfcdea03e0 Mon Sep 17 00:00:00 2001 From: vanchelo Date: Sat, 10 Oct 2015 11:48:12 +0300 Subject: [PATCH] PSR-2 --- README.md | 4 +- composer.json | 3 + public/console/js/main.js | 526 ++++++++++++++------------- src/AccessCheck.php | 26 +- src/AccessInterface.php | 4 +- src/Console.php | 58 ++- src/ConsoleService.php | 23 +- src/Controller/ControllerBase.php | 32 +- src/Controller/ExecuteController.php | 20 +- src/Controller/IndexController.php | 10 +- src/config/config.php | 2 +- src/config/routes.php | 1 + src/views/console.phtml | 15 +- src/views/partials/foot.phtml | 10 +- src/views/partials/head.phtml | 24 +- src/views/partials/templates.phtml | 76 ++-- 16 files changed, 425 insertions(+), 409 deletions(-) diff --git a/README.md b/README.md index 1d1a8d0..842c6ae 100644 --- a/README.md +++ b/README.md @@ -115,5 +115,5 @@ define('PHALCONSTART', microtime(true)); ``` A couple of screenshots -![Console Before Execute](http://i58.fastpic.ru/big/2013/1221/9d/fddb76f0f45ab5b665144e8dc7cd6f9d.jpg "Консоль до выполнеиня") -![Console After Execute](http://i58.fastpic.ru/big/2013/1221/19/a60efe026438b9a17b0ff8e73470ec19.jpg "Консоль после выполнеиня") +![Console Before Execute](http://i58.fastpic.ru/big/2013/1221/9d/fddb76f0f45ab5b665144e8dc7cd6f9d.jpg "Console Before Execute") +![Console After Execute](http://i58.fastpic.ru/big/2013/1221/19/a60efe026438b9a17b0ff8e73470ec19.jpg "Console After Execute") diff --git a/composer.json b/composer.json index 43538b8..c14c1ce 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,9 @@ "require": { "php": ">=5.4.0" }, + "require-dev": { + "phalcon/devtools": "~2.0" + }, "autoload": { "psr-4": { "Vanchelo\\Console\\": "src/" diff --git a/public/console/js/main.js b/public/console/js/main.js index 3a449d7..7e1c02a 100644 --- a/public/console/js/main.js +++ b/public/console/js/main.js @@ -9,275 +9,277 @@ * @return {String} */ function niceBytesize(size) { - var i = Math.max(Math.floor(Math.log(0|size) / Math.log(1024)), 0); - return Math.round(size / Math.pow(1024, i), 2).toFixed(0) + ' ' + niceBytesize.units[i]; + var i = Math.max(Math.floor(Math.log(0 | size) / Math.log(1024)), 0); + return Math.round(size / Math.pow(1024, i), 2).toFixed(0) + ' ' + niceBytesize.units[i]; } niceBytesize.units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']; // Simple JavaScript Templating // John Resig - http://ejohn.org/ - MIT Licensed -(function(){ - var cache = {}; - - window.tmpl = function tmpl (str, data) { - data = typeof data === 'string' ? { data: data } : data; - - // Figure out if we're getting a template, or if we need to - // load the template - and be sure to cache the result. - var fn = !/\W/.test(str) ? cache[str] = cache[str] || tmpl(document.getElementById('template_'+str).innerHTML) : - - // Generate a reusable function that will serve as a template - // generator (and which will be cached). - /*jshint evil:true */ - new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + - - // Introduce the data as local variables using with(){} - "with(obj){p.push('" + - - // Convert the template into pure JavaScript - str - .replace(/[\r\t\n]/g, " ") - .split("{{").join("\t") - .replace(/((^|\}\})[^\t]*)'/g, "$1\r") - .replace(/\t=(.*?)\}\}/g, "',$1,'") - .split("\t").join("');") - .split("}}").join("p.push('") - .split("\r").join("\\'") + - "');}return p.join('');"); - - // Provide some basic currying to the user - return data ? fn( data ) : fn; - }; +(function () { + var cache = {}; + + window.tmpl = function tmpl(str, data) { + data = typeof data === 'string' ? {data: data} : data; + + // Figure out if we're getting a template, or if we need to + // load the template - and be sure to cache the result. + var fn = !/\W/.test(str) ? cache[str] = cache[str] || tmpl(document.getElementById('template_' + str).innerHTML) : + + // Generate a reusable function that will serve as a template + // generator (and which will be cached). + /*jshint evil:true */ + new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};" + + + // Introduce the data as local variables using with(){} + "with(obj){p.push('" + + + // Convert the template into pure JavaScript + str + .replace(/[\r\t\n]/g, " ") + .split("{{").join("\t") + .replace(/((^|\}\})[^\t]*)'/g, "$1\r") + .replace(/\t=(.*?)\}\}/g, "',$1,'") + .split("\t").join("');") + .split("}}").join("p.push('") + .split("\r").join("\\'") + + "');}return p.join('');"); + + // Provide some basic currying to the user + return data ? fn(data) : fn; + }; })(); // Application jQuery(function ($) { - var $console = $('#console'); - var $response = $('#response'); - var $controlbar = $('#controlbar'); - var $editor = $('#editor'); - var action = $console.data('action'); - var $execute = $('#execute'); - var $controls = $('#controls'); - var is_focused = 0; - var tabs = { - active: 'output', - initial: 'output', - activeClass: 'active' - }; - var editor = new CodeMirror($editor[0], { - mode: 'text/x-php', - theme: 'laravel', - lineNumbers: true, - indentUnit: 4, - tabSize: 4, - indentWithTabs: true, - autofocus: true - }); - - editor.on('focus', function () { - is_focused = 1; - }); - - editor.on('blur', function () { - is_focused = 0; - }); - - editor.on('change', function () { - if (Modernizr.localstorage && localStorage.remember / 1 === 1) { - localStorage.code = editor.getValue(); - } - }); - - editor.on('cursorActivity', function () { - if (Modernizr.localstorage && localStorage.remember / 1 === 1 && is_focused) { - var cursor = editor.getCursor(); - localStorage.line = cursor.line; - localStorage.char = cursor.ch; - } - }); - - /** - * Send a code to be executed, and handle the response. - * - * @return {Void} - */ - function execute() { - var execution = $.ajax(action, { - type: 'POST', - cache: false, - data: { - code: editor.getValue() - }, - dataType: 'text', - timeout: 30000 - }); - - $controls.html(tmpl('controls_loading')); - execution.then(responseDone, responseFail); -/* - execution.done(function (res) { - console.log('done response:', res); - $response.show(); - - if (res && res.output !== undefined) { - $controls.html(tmpl('controls', res)); - $response.html(tmpl('output', res)); - activate(tabs.active, 1); - } else { - $controls.html(tmpl('ended_unexpectedly')); - $response.html(tmpl('output', res)); - activate(tabs.initial, 1); - } - }).fail(function (res) { - console.log('fail response:', res); - $controls.html(tmpl('controls_error', res)); - $response.html(tmpl('output', res.responseText)); - }).always(function () { - $response.imagesLoaded(resize); - });*/ - } - - /** - * Execution response success handler. - * - * @param {String} res - * - * @return {Void} - */ - function responseDone (res) { - console.log('response:', res); - try { - res = JSON.parse(res); - } catch (e) {} - $response.html(tmpl('output', res)).show(); - $controls.html(tmpl(typeof res === 'object' ? 'controls' : 'ended_unexpectedly', res)); - activate(!tabs.active || typeof res === 'string' || res.error ? tabs.initial : tabs.active); - $response.imagesLoaded(resize); - } - - /** - * Execution response failure handler. - * - * @param {Object} res - * - * @return {Void} - */ - function responseFail (res) { - console.log('fail:', res); - var json; - try { - json = JSON.parse(res.responseText); - } catch (e) {} - $response.html(tmpl('output', json || res.responseText)).show(); - $controls.html(tmpl('controls_error' , res)); - activate(!tabs.active || typeof res === 'string' || res.error ? tabs.initial : tabs.active); - $response.imagesLoaded(resize); - } - - /** - * Activate a tab. - * - * @param {String} tab - * @param {Boolean} force - * - * @return {Void} - */ - function activate (tab) { - var $holders = $response.children(); - var $buttons = $controls.find('[data-show]'); - - $buttons.removeClass(tabs.activeClass).filter('[data-show=' + tab + ']').addClass(tabs.activeClass); - $holders.hide().filter('[data-tab=' + tab + ']').show(); - tabs.active = tab; - resize(); - } - - /** - * Reset code view. - * - * @return {Void} - */ - function reset() { - tabs.active = null; - $response.hide().html(''); - $controls.html(tmpl('controls_intro', { checked: Modernizr.localstorage && localStorage.remember / 1 === 1 })); - resize(); - } - - /** - * Resize sections. - * - * @return {Void} - */ - function resize() { - var output_height = $response.is(':visible') ? $response.outerHeight() : 0; - var newHeight = Math.round($console.outerHeight() - output_height - $controlbar.outerHeight()); - editor.setSize(null, newHeight); - $editor.height(newHeight); - } - - // Execution initiators - $execute.on('click', function () { - execute(); - }); - - jwerty.key('ctrl+enter/cmd+enter', function () { - execute(); - }); - - // Toggle profiler tabs - $controls.on('click', '[data-show]', function () { - activate($(this).data('show')); - }); - - // Reset view - jwerty.key('esc', function () { - reset(); - editor.focus(); - }); - - // Refocus editor on pressing TAB - jwerty.key('tab', function () { - if (!is_focused) { - editor.focus(); - return false; - } - }); - - // Resize window - $(window).on('resize', function () { - resize(); - }); - - // Remember code - if (Modernizr.localstorage) { - var checked_class = 'checked'; - - // Restore the last editor state - if (Modernizr.localstorage && localStorage.remember / 1 === 1) { - editor.setValue(localStorage.code); - editor.setCursor(localStorage.line ? localStorage.line / 1 : 0, localStorage.char ? localStorage.char / 1 : 0); - } - - $controls.on('click', '.remember .button', function () { - var do_remember = localStorage.remember / 1 !== 1; - var cursor = editor.getCursor(); - - $(this)[do_remember ? 'addClass' : 'removeClass'](checked_class); - - if (do_remember) { - localStorage.remember = 1; - localStorage.code = editor.getValue(); - localStorage.line = cursor.line; - localStorage.char = cursor.ch; - } else { - localStorage.clear(); - } - - })[localStorage.remember / 1 === 1 ? 'addClass' : 'removeClass'](checked_class); - } - - // Initiate view reset - reset(); + var $console = $('#console'); + var $response = $('#response'); + var $controlbar = $('#controlbar'); + var $editor = $('#editor'); + var action = $console.data('action'); + var $execute = $('#execute'); + var $controls = $('#controls'); + var is_focused = 0; + var tabs = { + active: 'output', + initial: 'output', + activeClass: 'active' + }; + var editor = new CodeMirror($editor[0], { + mode: 'text/x-php', + theme: 'laravel', + lineNumbers: true, + indentUnit: 4, + tabSize: 4, + indentWithTabs: true, + autofocus: true + }); + + editor.on('focus', function () { + is_focused = 1; + }); + + editor.on('blur', function () { + is_focused = 0; + }); + + editor.on('change', function () { + if (Modernizr.localstorage && localStorage.remember / 1 === 1) { + localStorage.code = editor.getValue(); + } + }); + + editor.on('cursorActivity', function () { + if (Modernizr.localstorage && localStorage.remember / 1 === 1 && is_focused) { + var cursor = editor.getCursor(); + localStorage.line = cursor.line; + localStorage.char = cursor.ch; + } + }); + + /** + * Send a code to be executed, and handle the response. + * + * @return {Void} + */ + function execute() { + var execution = $.ajax(action, { + type: 'POST', + cache: false, + data: { + code: editor.getValue() + }, + dataType: 'text', + timeout: 30000 + }); + + $controls.html(tmpl('controls_loading')); + execution.then(responseDone, responseFail); + /* + execution.done(function (res) { + console.log('done response:', res); + $response.show(); + + if (res && res.output !== undefined) { + $controls.html(tmpl('controls', res)); + $response.html(tmpl('output', res)); + activate(tabs.active, 1); + } else { + $controls.html(tmpl('ended_unexpectedly')); + $response.html(tmpl('output', res)); + activate(tabs.initial, 1); + } + }).fail(function (res) { + console.log('fail response:', res); + $controls.html(tmpl('controls_error', res)); + $response.html(tmpl('output', res.responseText)); + }).always(function () { + $response.imagesLoaded(resize); + });*/ + } + + /** + * Execution response success handler. + * + * @param {String} res + * + * @return {Void} + */ + function responseDone(res) { + console.log('response:', res); + try { + res = JSON.parse(res); + } catch (e) { + } + $response.html(tmpl('output', res)).show(); + $controls.html(tmpl(typeof res === 'object' ? 'controls' : 'ended_unexpectedly', res)); + activate(!tabs.active || typeof res === 'string' || res.error ? tabs.initial : tabs.active); + $response.imagesLoaded(resize); + } + + /** + * Execution response failure handler. + * + * @param {Object} res + * + * @return {Void} + */ + function responseFail(res) { + console.log('fail:', res); + var json; + try { + json = JSON.parse(res.responseText); + } catch (e) { + } + $response.html(tmpl('output', json || res.responseText)).show(); + $controls.html(tmpl('controls_error', res)); + activate(!tabs.active || typeof res === 'string' || res.error ? tabs.initial : tabs.active); + $response.imagesLoaded(resize); + } + + /** + * Activate a tab. + * + * @param {String} tab + * @param {Boolean} force + * + * @return {Void} + */ + function activate(tab) { + var $holders = $response.children(); + var $buttons = $controls.find('[data-show]'); + + $buttons.removeClass(tabs.activeClass).filter('[data-show=' + tab + ']').addClass(tabs.activeClass); + $holders.hide().filter('[data-tab=' + tab + ']').show(); + tabs.active = tab; + resize(); + } + + /** + * Reset code view. + * + * @return {Void} + */ + function reset() { + tabs.active = null; + $response.hide().html(''); + $controls.html(tmpl('controls_intro', {checked: Modernizr.localstorage && localStorage.remember / 1 === 1})); + resize(); + } + + /** + * Resize sections. + * + * @return {Void} + */ + function resize() { + var output_height = $response.is(':visible') ? $response.outerHeight() : 0; + var newHeight = Math.round($console.outerHeight() - output_height - $controlbar.outerHeight()); + editor.setSize(null, newHeight); + $editor.height(newHeight); + } + + // Execution initiators + $execute.on('click', function () { + execute(); + }); + + jwerty.key('ctrl+enter/cmd+enter', function () { + execute(); + }); + + // Toggle profiler tabs + $controls.on('click', '[data-show]', function () { + activate($(this).data('show')); + }); + + // Reset view + jwerty.key('esc', function () { + reset(); + editor.focus(); + }); + + // Refocus editor on pressing TAB + jwerty.key('tab', function () { + if (!is_focused) { + editor.focus(); + return false; + } + }); + + // Resize window + $(window).on('resize', function () { + resize(); + }); + + // Remember code + if (Modernizr.localstorage) { + var checked_class = 'checked'; + + // Restore the last editor state + if (Modernizr.localstorage && localStorage.remember / 1 === 1) { + editor.setValue(localStorage.code); + editor.setCursor(localStorage.line ? localStorage.line / 1 : 0, localStorage.char ? localStorage.char / 1 : 0); + } + + $controls.on('click', '.remember .button', function () { + var do_remember = localStorage.remember / 1 !== 1; + var cursor = editor.getCursor(); + + $(this)[do_remember ? 'addClass' : 'removeClass'](checked_class); + + if (do_remember) { + localStorage.remember = 1; + localStorage.code = editor.getValue(); + localStorage.line = cursor.line; + localStorage.char = cursor.ch; + } else { + localStorage.clear(); + } + + })[localStorage.remember / 1 === 1 ? 'addClass' : 'removeClass'](checked_class); + } + + // Initiate view reset + reset(); }); diff --git a/src/AccessCheck.php b/src/AccessCheck.php index 9a3f230..d94ac6a 100644 --- a/src/AccessCheck.php +++ b/src/AccessCheck.php @@ -1,15 +1,21 @@ -di = $di; } @@ -35,8 +41,7 @@ public function check() { $config = $this->di['console.config']; - if ( ! $config->check_ip) - { + if (!$config->check_ip) { return true; } @@ -44,12 +49,9 @@ public function check() $ips = $config->$filter->toArray(); $ip = $this->di['request']->getClientAddress(); - if ($filter == $config->whitelist and in_array($ip, $ips)) - { + if (($filter == $config->whitelist) && in_array($ip, $ips)) { return true; - } - elseif ($filter == $config->blacklist and ! in_array($ip, $ips)) - { + } elseif (($filter == $config->blacklist) && !in_array($ip, $ips)) { return true; } diff --git a/src/AccessInterface.php b/src/AccessInterface.php index 1a96b40..dfb9f08 100644 --- a/src/AccessInterface.php +++ b/src/AccessInterface.php @@ -1,4 +1,6 @@ - 'E_ERROR', E_WARNING => 'E_WARNING', E_PARSE => 'E_PARSE', @@ -36,27 +38,25 @@ class Console extends Component * @var array */ public $profile = [ - 'memory' => 0, + 'memory' => 0, 'memory_peak' => 0, - 'time' => 0, - 'time_total' => 0, - 'output' => '', + 'time' => 0, + 'time_total' => 0, + 'output' => '', 'output_size' => 0, - 'error' => false + 'error' => false, ]; /** * Adds one or multiple fields into profile. * * @param string $property Property name, or an array of name => value pairs. - * @param mixed $value Property value. + * @param mixed $value Property value. */ public function addProfile($property, $value = null) { - if (gettype($property) === 'array') - { - foreach ($property as $key => $value) - { + if (is_array($property)) { + foreach ($property as $key => $value) { $this->addProfile($key, $value); } @@ -64,10 +64,9 @@ public function addProfile($property, $value = null) } // Normalize properties - $normalizer_name = 'normalize' . ucfirst($property); - if (method_exists(__CLASS__, $normalizer_name)) - { - $value = call_user_func([__CLASS__, $normalizer_name], $value); + $normalizerName = 'normalize' . ucfirst($property); + if (method_exists(__CLASS__, $normalizerName)) { + $value = call_user_func([__CLASS__, $normalizerName], $value); } $this->profile[$property] = $value; @@ -82,9 +81,9 @@ public function getProfile() { // Extend the profile with current data $this->addProfile([ - 'memory' => memory_get_usage(true), + 'memory' => memory_get_usage(true), 'memory_peak' => memory_get_peak_usage(true), - 'time_total' => round((microtime(true) - PHALCONSTART) * 1000), + 'time_total' => round((microtime(true) - PHALCONSTART) * 1000), ]); return $this->profile; @@ -93,7 +92,7 @@ public function getProfile() /** * Executes a code and returns current profile. * - * @param string $code + * @param string $code * * @return array */ @@ -108,16 +107,15 @@ public function execute($code) ob_end_clean(); // Retrieve an error - if ($estatus === false) - { + if ($estatus === false) { $this->addProfile('error', error_get_last()); } // Extend the profile $this->addProfile([ - 'time' => round(($console_execute_end - $console_execute_start) * 1000, 2), - 'output' => $output, - 'output_size' => strlen($output) + 'time' => round(($console_execute_end - $console_execute_start) * 1000, 2), + 'output' => $output, + 'output_size' => strlen($output), ]); return $this->getProfile(); @@ -133,18 +131,14 @@ public function execute($code) public function normalizeError($error, $type = 0) { // Set human readable error type - if (isset($error['type']) and isset($this->error_map[$error['type']])) - { - $error['type'] = $this->error_map[$error['type']]; + if (isset($error['type']) and isset($this->errorMap[$error['type']])) { + $error['type'] = $this->errorMap[$error['type']]; } // Validate and return the error - if (isset($error['type'], $error['message'], $error['file'], $error['line'])) - { + if (isset($error['type'], $error['message'], $error['file'], $error['line'])) { return $error; - } - else - { + } else { return $this->profile['error']; } } diff --git a/src/ConsoleService.php b/src/ConsoleService.php index d932635..874e92f 100644 --- a/src/ConsoleService.php +++ b/src/ConsoleService.php @@ -1,8 +1,11 @@ -di = $di; @@ -30,6 +33,9 @@ public function __construct(DI $di) $this->registerConsoleAccessService(); } + /** + * Register console routes + */ protected function registerRoutes() { $router = $this->di['router']; @@ -44,12 +50,10 @@ protected function registerConsoleService() protected function registerViewService() { - $this->di['console.view'] = function () - { + $this->di['console.view'] = function () { $view = new View(); - if ($this->di->has('view')) - { + if ($this->di->has('view')) { $this->di['view']->disable(); } @@ -63,8 +67,7 @@ protected function registerConfig() { $config = require __DIR__ . '/config/config.php'; - if ($this->di->has('console.config')) - { + if ($this->di->has('console.config')) { $config->merge($this->di->get('console.config')); } diff --git a/src/Controller/ControllerBase.php b/src/Controller/ControllerBase.php index d92a18f..ddd1f6a 100644 --- a/src/Controller/ControllerBase.php +++ b/src/Controller/ControllerBase.php @@ -1,4 +1,6 @@ -di['console.access']->check()) - { + if (!$this->di['console.access']->check()) { throw new DispatcherException('Not Found', 404); } } @@ -26,27 +27,32 @@ public function beforeExecuteRoute(Dispatcher $dispatcher) public function initialize() { $this->response->setContentType('text/html', 'UTF-8'); - if ($this->restful) - { + if ($this->restful) { $this->setJsonResponse(); } } - // Call this func to set json response enabled - public function setJsonResponse() { + /** + * Call this func to set json response enabled + */ + public function setJsonResponse() + { $this->view->disable(); $this->response->setContentType('application/json', 'UTF-8'); } - // After route executed event - public function afterExecuteRoute(Dispatcher $dispatcher) { + /** + * After route executed event + * + * @param Dispatcher $dispatcher + */ + public function afterExecuteRoute(Dispatcher $dispatcher) + { $data = $dispatcher->getReturnedValue(); - if ($this->restful) - { - if (is_array($data)) - { + if ($this->restful) { + if (is_array($data)) { $data = json_encode($data, JSON_UNESCAPED_UNICODE); } diff --git a/src/Controller/ExecuteController.php b/src/Controller/ExecuteController.php index c285001..b567fec 100644 --- a/src/Controller/ExecuteController.php +++ b/src/Controller/ExecuteController.php @@ -1,17 +1,19 @@ -request->getPost('code'); + public function indexAction() + { + $code = $this->request->getPost('code'); - // Execute and profile the code - $response = $this->di['console']->execute($code); + // Execute and profile the code + $response = $this->di['console']->execute($code); - // Response - return $response; - } + // Response + return $response; + } } diff --git a/src/Controller/IndexController.php b/src/Controller/IndexController.php index bf126a3..7da5b28 100644 --- a/src/Controller/IndexController.php +++ b/src/Controller/IndexController.php @@ -1,9 +1,11 @@ -di['console']->render(); - } + } } diff --git a/src/config/config.php b/src/config/config.php index e7f1010..0063ca4 100644 --- a/src/config/config.php +++ b/src/config/config.php @@ -35,7 +35,7 @@ 'whitelist' => [ '127.0.0.1', - '::1' + '::1', ], 'blacklist' => [ diff --git a/src/config/routes.php b/src/config/routes.php index 86d56a5..922d817 100644 --- a/src/config/routes.php +++ b/src/config/routes.php @@ -1,4 +1,5 @@ addGet('/phalcon-console', [ 'module' => null, 'namespace' => 'Vanchelo\Console\Controller', diff --git a/src/views/console.phtml b/src/views/console.phtml index 19e8007..aa3b3f9 100644 --- a/src/views/console.phtml +++ b/src/views/console.phtml @@ -1,16 +1,15 @@ -
- +
+
    - -
    -
    +
    diff --git a/src/views/partials/foot.phtml b/src/views/partials/foot.phtml index d5b8f88..422c424 100644 --- a/src/views/partials/foot.phtml +++ b/src/views/partials/foot.phtml @@ -1,6 +1,6 @@ - - - - - + + + + + \ No newline at end of file diff --git a/src/views/partials/head.phtml b/src/views/partials/head.phtml index b68d89b..29adbc4 100644 --- a/src/views/partials/head.phtml +++ b/src/views/partials/head.phtml @@ -1,16 +1,16 @@ - - - - Phalcon Console - + + + + Phalcon Console + - - - - + + + + - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/views/partials/templates.phtml b/src/views/partials/templates.phtml index 3d514fb..32edc34 100644 --- a/src/views/partials/templates.phtml +++ b/src/views/partials/templates.phtml @@ -1,59 +1,59 @@ -