Week5: Using Twig (Change Calculator)
This commit is contained in:
parent
cd9ab64650
commit
c07b1c984c
1
week-05/homework/.gitignore
vendored
1
week-05/homework/.gitignore
vendored
@ -2,7 +2,6 @@
|
|||||||
.idea
|
.idea
|
||||||
|
|
||||||
# Local System File
|
# Local System File
|
||||||
config.php
|
|
||||||
php.ini
|
php.ini
|
||||||
|
|
||||||
# Vendor directory handling
|
# Vendor directory handling
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
###########################################
|
|
||||||
# ======= Enable the Rewrite Engine =======
|
|
||||||
|
|
||||||
RewriteEngine On
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======= No directory listings =======
|
|
||||||
|
|
||||||
IndexIgnore *
|
|
||||||
Options +FollowSymLinks
|
|
||||||
Options -Indexes
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======== Remove multiple slashes ========
|
|
||||||
|
|
||||||
RewriteCond %{HTTP_HOST} !=""
|
|
||||||
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
|
|
||||||
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
|
|
||||||
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======== Remove trailing slashes ========
|
|
||||||
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
|
||||||
RewriteRule ^(.*)/$ /$1 [R=301,L]
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======== SEF URL Routing ========
|
|
||||||
|
|
||||||
# If the request is not for a static asset
|
|
||||||
RewriteCond %{REQUEST_URI} !^/media/
|
|
||||||
|
|
||||||
# Or for a file that exists in the web directory
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
|
||||||
|
|
||||||
# Rewrite the request to run the application
|
|
||||||
RewriteRule (.*) index.php
|
|
||||||
|
|
||||||
###########################################
|
|
@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "sport/stars",
|
"name": "change/calculator",
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"description": "Sport Stars",
|
"description": "Change Calculator",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"sport",
|
"change",
|
||||||
"star"
|
"calculator"
|
||||||
],
|
],
|
||||||
"homepage": "https://github.com/mychamplain",
|
"homepage": "https://github.com/mychamplain",
|
||||||
"license": "GPL-2.0-or-later",
|
"license": "GPL-2.0-or-later",
|
||||||
@ -21,7 +21,7 @@
|
|||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"Sport\\Stars\\": "libraries/src/"
|
"Change\\Calculator\\": "libraries/src/"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@ -29,12 +29,7 @@
|
|||||||
"ext-json": "*",
|
"ext-json": "*",
|
||||||
"joomla/application": "~2.0",
|
"joomla/application": "~2.0",
|
||||||
"joomla/archive": "~2.0",
|
"joomla/archive": "~2.0",
|
||||||
"joomla/authentication": "~2.0",
|
|
||||||
"joomla/console": "~2.0",
|
|
||||||
"joomla/controller": "~2.0",
|
"joomla/controller": "~2.0",
|
||||||
"joomla/crypt": "~2.0",
|
|
||||||
"joomla/data": "~2.0",
|
|
||||||
"joomla/database": "~2.0",
|
|
||||||
"joomla/di": "~2.0",
|
"joomla/di": "~2.0",
|
||||||
"joomla/event": "~2.0",
|
"joomla/event": "~2.0",
|
||||||
"joomla/filter": "~2.0",
|
"joomla/filter": "~2.0",
|
||||||
@ -44,12 +39,9 @@
|
|||||||
"joomla/model": "~2.0",
|
"joomla/model": "~2.0",
|
||||||
"joomla/preload": "~2.0",
|
"joomla/preload": "~2.0",
|
||||||
"joomla/ldap": "~2.0",
|
"joomla/ldap": "~2.0",
|
||||||
"joomla/oauth1": "~2.0",
|
|
||||||
"joomla/oauth2": "~2.0",
|
|
||||||
"joomla/registry": "~2.0",
|
"joomla/registry": "~2.0",
|
||||||
"joomla/renderer": "~2.0",
|
"joomla/renderer": "~2.0",
|
||||||
"joomla/router": "~2.0",
|
"joomla/router": "~2.0",
|
||||||
"joomla/session": "~2.0",
|
|
||||||
"joomla/string": "~2.0",
|
"joomla/string": "~2.0",
|
||||||
"joomla/uri": "~2.0",
|
"joomla/uri": "~2.0",
|
||||||
"joomla/utilities": "~2.0",
|
"joomla/utilities": "~2.0",
|
||||||
@ -63,10 +55,7 @@
|
|||||||
"defuse/php-encryption": "^2.0",
|
"defuse/php-encryption": "^2.0",
|
||||||
"symfony/asset": "^5.1.2",
|
"symfony/asset": "^5.1.2",
|
||||||
"symfony/process": "^5.1.2",
|
"symfony/process": "^5.1.2",
|
||||||
"symfony/web-link": "^5.1.2",
|
|
||||||
"symfony/yaml": "^5.1.2",
|
|
||||||
"theiconic/php-ga-measurement-protocol": "^2.7.2",
|
|
||||||
"twig/twig": "^2.13",
|
"twig/twig": "^2.13",
|
||||||
"phpmailer/phpmailer": "~6.0"
|
"twig/intl-extra": "^3.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
1328
week-05/homework/composer.lock
generated
1328
week-05/homework/composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,41 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
* -------------------------------------------------------------------------
|
|
||||||
* THIS SHOULD ONLY BE USED AS A LAST RESORT WHEN THE WEB INSTALLER FAILS
|
|
||||||
*
|
|
||||||
* If you are installing Sport Stars! manually ie not using the web browser installer
|
|
||||||
* then rename this file to config.php eg
|
|
||||||
*
|
|
||||||
* UNIX -> mv config.php.example config.php
|
|
||||||
* Windows -> rename config.php.example config.php
|
|
||||||
*
|
|
||||||
* Now edit this file and configure the parameters for your site and
|
|
||||||
* database.
|
|
||||||
*
|
|
||||||
* Finally move this file to the root folder of your Sport Stars installation eg
|
|
||||||
*
|
|
||||||
* UNIX -> mv config.php ../
|
|
||||||
* Windows -> copy config.php ../
|
|
||||||
*
|
|
||||||
* SOURCE: https://github.com/joomla/joomla-cms/blob/4.1-dev/installation/configuration.php-dist
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
class LConfig
|
|
||||||
{
|
|
||||||
public $sitename = 'Sport Stars!'; // Name of Sport Stars site
|
|
||||||
|
|
||||||
/* Database Settings */
|
|
||||||
public $dbtype = 'mysqli'; // Normally mysqli
|
|
||||||
public $host = 'localhost'; // This is normally set to localhost
|
|
||||||
public $user = ''; // Database username
|
|
||||||
public $password = ''; // Database password
|
|
||||||
public $db = ''; // Database name
|
|
||||||
public $dbprefix = 'homework_'; // LEAVE THIS UNCHANGED FOR NOW
|
|
||||||
}
|
|
||||||
|
|
@ -1,52 +0,0 @@
|
|||||||
###########################################
|
|
||||||
# ======= Enable the Rewrite Engine =======
|
|
||||||
|
|
||||||
RewriteEngine On
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======= No directory listings =======
|
|
||||||
|
|
||||||
IndexIgnore *
|
|
||||||
Options +FollowSymLinks
|
|
||||||
Options -Indexes
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======== Remove multiple slashes ========
|
|
||||||
|
|
||||||
RewriteCond %{HTTP_HOST} !=""
|
|
||||||
RewriteCond %{THE_REQUEST} ^[A-Z]+\s//+(.*)\sHTTP/[0-9.]+$ [OR]
|
|
||||||
RewriteCond %{THE_REQUEST} ^[A-Z]+\s(.*/)/+\sHTTP/[0-9.]+$
|
|
||||||
RewriteRule .* http://%{HTTP_HOST}/%1 [R=301,L]
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======== Remove trailing slashes ========
|
|
||||||
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
|
||||||
RewriteRule ^(.*)/$ /$1 [R=301,L]
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
|
|
||||||
|
|
||||||
###########################################
|
|
||||||
# ======== SEF URL Routing ========
|
|
||||||
|
|
||||||
# If the request is not for a static asset
|
|
||||||
RewriteCond %{REQUEST_URI} !^/media/
|
|
||||||
|
|
||||||
# Or for a file that exists in the web directory
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-f
|
|
||||||
RewriteCond %{REQUEST_FILENAME} !-d
|
|
||||||
|
|
||||||
# Rewrite the request to run the application
|
|
||||||
RewriteRule (.*) index.php
|
|
||||||
|
|
||||||
###########################################
|
|
@ -1,15 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Sport\Stars\Factory;
|
|
||||||
|
|
||||||
defined('_LEXEC') or die;
|
defined('_LEXEC') or die;
|
||||||
|
|
||||||
// Option to override defines from root folder
|
// Option to override defines from root folder
|
||||||
@ -44,19 +42,17 @@ require_once LPATH_BASE . '/includes/framework.php';
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
$container = (new Joomla\DI\Container)
|
$container = (new Joomla\DI\Container)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\ConfigurationProvider(LPATH_CONFIGURATION . '/config.php'))
|
->registerServiceProvider(new Change\Calculator\Service\InputProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\InputProvider)
|
->registerServiceProvider(new Change\Calculator\Service\ApplicationProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\ApplicationProvider)
|
->registerServiceProvider(new Change\Calculator\Service\RouterProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\RouterProvider)
|
->registerServiceProvider(new Change\Calculator\Service\MVCProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\MVCProvider)
|
->registerServiceProvider(new Change\Calculator\Service\EventProvider)
|
||||||
->registerServiceProvider(new Joomla\Database\Service\DatabaseProvider)
|
->registerServiceProvider(new Change\Calculator\Service\HttpProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\EventProvider)
|
->registerServiceProvider(new Change\Calculator\Service\LoggingProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\HttpProvider)
|
|
||||||
->registerServiceProvider(new Sport\Stars\Service\LoggingProvider)
|
|
||||||
->registerServiceProvider(new Joomla\Preload\Service\PreloadProvider)
|
->registerServiceProvider(new Joomla\Preload\Service\PreloadProvider)
|
||||||
->registerServiceProvider(new Sport\Stars\Service\TemplatingProvider);
|
->registerServiceProvider(new Change\Calculator\Service\TemplatingProvider);
|
||||||
|
|
||||||
// Alias the web application to Sport Stars's base application class as this is the primary application for the environment
|
// Alias the web application to Change Calculator's base application class as this is the primary application for the environment
|
||||||
$container->alias(Joomla\Application\AbstractApplication::class, Joomla\Application\AbstractWebApplication::class);
|
$container->alias(Joomla\Application\AbstractApplication::class, Joomla\Application\AbstractWebApplication::class);
|
||||||
|
|
||||||
// Alias the web logger to the PSR-3 interface as this is the primary logger for the environment
|
// Alias the web logger to the PSR-3 interface as this is the primary logger for the environment
|
||||||
@ -77,11 +73,8 @@ catch (Throwable $e)
|
|||||||
// source: https://github.com/joomla/framework.joomla.org/blob/master/www/index.php#L85
|
// source: https://github.com/joomla/framework.joomla.org/blob/master/www/index.php#L85
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
$app = $container->get(Joomla\Application\AbstractApplication::class);
|
|
||||||
// Set the application as global app
|
|
||||||
Factory::$application = $app;
|
|
||||||
// Execute the application.
|
// Execute the application.
|
||||||
$app->execute();
|
$container->get(Joomla\Application\AbstractApplication::class)->execute();
|
||||||
}
|
}
|
||||||
catch (Throwable $e)
|
catch (Throwable $e)
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
@ -19,5 +19,4 @@ define('LPATH_SITE', LPATH_ROOT);
|
|||||||
define('LPATH_CONFIGURATION', LPATH_ROOT);
|
define('LPATH_CONFIGURATION', LPATH_ROOT);
|
||||||
define('LPATH_ADMINISTRATOR', LPATH_ROOT . DIRECTORY_SEPARATOR . 'administrator');
|
define('LPATH_ADMINISTRATOR', LPATH_ROOT . DIRECTORY_SEPARATOR . 'administrator');
|
||||||
define('LPATH_LIBRARIES', LPATH_ROOT . DIRECTORY_SEPARATOR . 'libraries');
|
define('LPATH_LIBRARIES', LPATH_ROOT . DIRECTORY_SEPARATOR . 'libraries');
|
||||||
define('LPATH_INSTALLATION', LPATH_ROOT . DIRECTORY_SEPARATOR . 'installation');
|
|
||||||
define('LPATH_TEMPLATES', LPATH_ROOT . DIRECTORY_SEPARATOR . 'templates');
|
define('LPATH_TEMPLATES', LPATH_ROOT . DIRECTORY_SEPARATOR . 'templates');
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
@ -13,23 +13,3 @@ defined('_LEXEC') or die;
|
|||||||
// System includes
|
// System includes
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/includes/framework.php#L14
|
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/includes/framework.php#L14
|
||||||
require_once LPATH_LIBRARIES . '/bootstrap.php';
|
require_once LPATH_LIBRARIES . '/bootstrap.php';
|
||||||
|
|
||||||
// Installation check, and check on removal of the installation directory.
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/includes/framework.php#L17
|
|
||||||
if (!file_exists(LPATH_CONFIGURATION . '/config.php')
|
|
||||||
|| (filesize(LPATH_CONFIGURATION . '/config.php') < 10)
|
|
||||||
|| (file_exists(LPATH_INSTALLATION . '/index.php')))
|
|
||||||
{
|
|
||||||
if (file_exists(LPATH_INSTALLATION . '/index.php'))
|
|
||||||
{
|
|
||||||
header('Location: ' . substr($_SERVER['REQUEST_URI'], 0, strpos($_SERVER['REQUEST_URI'], 'index.php')) . 'installation/index.php');
|
|
||||||
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo 'No configuration file found and no installation code available. Exiting...';
|
|
||||||
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
defined('_LEXEC') or die;
|
|
||||||
|
|
||||||
// Option to override defines from root folder
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/includes/app.php#L15
|
|
||||||
if (file_exists(dirname(__DIR__) . '/defines.php'))
|
|
||||||
{
|
|
||||||
include_once dirname(__DIR__) . '/defines.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load the default defines
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/includes/app.php#L20
|
|
||||||
if (!defined('_LDEFINES'))
|
|
||||||
{
|
|
||||||
define('LPATH_BASE', dirname(__DIR__));
|
|
||||||
require_once LPATH_BASE . '/includes/defines.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
// I have not yet had time to finish this part of the application (CMS)
|
|
||||||
echo file_get_contents(LPATH_ROOT . '/templates/system/install_notice.html');
|
|
||||||
|
|
||||||
exit;
|
|
@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
defined('_LEXEC') or die;
|
|
||||||
|
|
||||||
// Global definitions
|
|
||||||
$parts = explode(DIRECTORY_SEPARATOR, LPATH_BASE);
|
|
||||||
array_pop($parts);
|
|
||||||
|
|
||||||
// Defines.
|
|
||||||
define('LPATH_ROOT', implode(DIRECTORY_SEPARATOR, $parts));
|
|
||||||
define('LPATH_SITE', LPATH_ROOT);
|
|
||||||
define('LPATH_CONFIGURATION', LPATH_ROOT);
|
|
||||||
define('LPATH_ADMINISTRATOR', LPATH_ROOT . DIRECTORY_SEPARATOR . 'administrator');
|
|
||||||
define('LPATH_LIBRARIES', LPATH_ROOT . DIRECTORY_SEPARATOR . 'libraries');
|
|
||||||
define('LPATH_INSTALLATION', LPATH_ROOT . DIRECTORY_SEPARATOR . 'installation');
|
|
@ -1,41 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
defined('_LEXEC') or die;
|
|
||||||
|
|
||||||
// System includes
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/administrator/includes/framework.php#L14
|
|
||||||
require_once LPATH_LIBRARIES . '/bootstrap.php';
|
|
||||||
|
|
||||||
// Installation check, and check on removal of the installation directory.
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/administrator/includes/framework.php#L17
|
|
||||||
if (!file_exists(LPATH_CONFIGURATION . '/config.php')
|
|
||||||
|| (filesize(LPATH_CONFIGURATION . '/config.php') < 10)
|
|
||||||
|| (file_exists(LPATH_INSTALLATION . '/index.php')))
|
|
||||||
{
|
|
||||||
if (file_exists(LPATH_INSTALLATION . '/index.php'))
|
|
||||||
{
|
|
||||||
header('Location: ../installation/index.php');
|
|
||||||
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
echo 'No configuration file found and no installation code available. Exiting...';
|
|
||||||
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pre-Load configuration. Don't remove the Output Buffering due to BOM issues.
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/administrator/includes/framework.php#L36
|
|
||||||
ob_start();
|
|
||||||
require_once LPATH_CONFIGURATION . '/config.php';
|
|
||||||
ob_end_clean();
|
|
@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
// NOTE: This file should remain compatible with PHP 5.2 to allow us to run our PHP minimum check and show a friendly error message
|
|
||||||
// source: https://github.com/joomla/joomla-cms/blob/4.1-dev/index.php#L9
|
|
||||||
|
|
||||||
// Define the application's minimum supported PHP version as a constant, so it can be referenced within the application.
|
|
||||||
define('OCTOLEO_MINIMUM_PHP', '7.2.5');
|
|
||||||
|
|
||||||
if (version_compare(PHP_VERSION, OCTOLEO_MINIMUM_PHP, '<'))
|
|
||||||
{
|
|
||||||
die(
|
|
||||||
str_replace(
|
|
||||||
'{{phpversion}}',
|
|
||||||
OCTOLEO_MINIMUM_PHP,
|
|
||||||
file_get_contents(dirname(__FILE__) . '/../templates/system/incompatible.html')
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constant that is checked in included files to prevent direct access.
|
|
||||||
*/
|
|
||||||
define('_LEXEC', 1);
|
|
||||||
|
|
||||||
// We must setup some house rules, since we can't have all
|
|
||||||
// this code just doing what it wants can we.... <<eWɘ>>yn growling
|
|
||||||
require_once dirname(__FILE__) . '/includes/app.php';
|
|
@ -1,14 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Sport\Stars\Autoload\ClassLoader;
|
use Change\Calculator\Autoload\ClassLoader;
|
||||||
|
|
||||||
defined('_LEXEC') or die;
|
defined('_LEXEC') or die;
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ if (!class_exists('LLoader'))
|
|||||||
// If JLoader still does not exist panic.
|
// If JLoader still does not exist panic.
|
||||||
if (!class_exists('LLoader'))
|
if (!class_exists('LLoader'))
|
||||||
{
|
{
|
||||||
throw new RuntimeException('Sport Stars Platform not loaded.');
|
throw new RuntimeException('Change Calculator Platform not loaded.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ LLoader::setup();
|
|||||||
$loader = require LPATH_LIBRARIES . '/vendor/autoload.php';
|
$loader = require LPATH_LIBRARIES . '/vendor/autoload.php';
|
||||||
|
|
||||||
// We need to pull our decorated class loader into memory before unregistering Composer's loader
|
// We need to pull our decorated class loader into memory before unregistering Composer's loader
|
||||||
class_exists('\\Sport\\Stars\\Autoload\\ClassLoader');
|
class_exists('\\Change\\Calculator\\Autoload\\ClassLoader');
|
||||||
|
|
||||||
$loader->unregister();
|
$loader->unregister();
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* Joomla! Content Management System
|
* Joomla! Content Management System
|
||||||
*
|
*
|
||||||
@ -308,15 +308,15 @@ abstract class LLoader
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to setup the autoloaders for the Sport Stars Platform.
|
* Method to setup the autoloaders for the Change Calculator Platform.
|
||||||
* Since the SPL autoloaders are called in a queue we will add our explicit
|
* Since the SPL autoloaders are called in a queue we will add our explicit
|
||||||
* class-registration based loader first, then fall back on the autoloader based on conventions.
|
* class-registration based loader first, then fall back on the autoloader based on conventions.
|
||||||
* This will allow people to register a class in a specific location and override platform libraries
|
* This will allow people to register a class in a specific location and override platform libraries
|
||||||
* as was previously possible.
|
* as was previously possible.
|
||||||
*
|
*
|
||||||
* @param boolean $enablePsr True to enable autoloading based on PSR-0.
|
* @param boolean $enablePsr True to enable autoloading based on PSR-0.
|
||||||
* @param boolean $enablePrefixes True to enable prefix based class loading (needed to auto load the Sport Stars core).
|
* @param boolean $enablePrefixes True to enable prefix based class loading (needed to auto load the Change Calculator core).
|
||||||
* @param boolean $enableClasses True to enable class map based class loading (needed to auto load the Sport Stars core).
|
* @param boolean $enableClasses True to enable class map based class loading (needed to auto load the Change Calculator core).
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*
|
*
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Application;
|
namespace Change\Calculator\Application;
|
||||||
|
|
||||||
use Joomla\Application\AbstractWebApplication;
|
use Joomla\Application\AbstractWebApplication;
|
||||||
use Joomla\Application\Controller\ControllerResolverInterface;
|
use Joomla\Application\Controller\ControllerResolverInterface;
|
||||||
use Joomla\Application\SessionAwareWebApplicationInterface;
|
|
||||||
use Joomla\Application\SessionAwareWebApplicationTrait;
|
|
||||||
use Joomla\Application\Web\WebClient;
|
use Joomla\Application\Web\WebClient;
|
||||||
use Joomla\Input\Input;
|
use Joomla\Input\Input;
|
||||||
use Joomla\Registry\Registry;
|
use Joomla\Registry\Registry;
|
||||||
@ -25,9 +23,8 @@ use function call_user_func;
|
|||||||
* Site application class
|
* Site application class
|
||||||
* source: https://github.com/joomla/framework.joomla.org/blob/master/src/WebApplication.php
|
* source: https://github.com/joomla/framework.joomla.org/blob/master/src/WebApplication.php
|
||||||
*/
|
*/
|
||||||
class SportStarsApplication extends AbstractWebApplication implements SessionAwareWebApplicationInterface
|
class ChangeCalculatorApplication extends AbstractWebApplication
|
||||||
{
|
{
|
||||||
use SessionAwareWebApplicationTrait;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The application's controller resolver.
|
* The application's controller resolver.
|
||||||
@ -48,20 +45,17 @@ class SportStarsApplication extends AbstractWebApplication implements SessionAwa
|
|||||||
*
|
*
|
||||||
* @param ControllerResolverInterface $controllerResolver The application's controller resolver
|
* @param ControllerResolverInterface $controllerResolver The application's controller resolver
|
||||||
* @param RouterInterface $router The application's router
|
* @param RouterInterface $router The application's router
|
||||||
* @param Input $input An optional argument to provide dependency injection for the application's
|
* @param Input|null $input An optional argument to provide dependency injection for the application's
|
||||||
* input object.
|
* input object.
|
||||||
* @param Registry $config An optional argument to provide dependency injection for the application's
|
* @param WebClient|null $client An optional argument to provide dependency injection for the application's
|
||||||
* config object.
|
|
||||||
* @param WebClient $client An optional argument to provide dependency injection for the application's
|
|
||||||
* client object.
|
* client object.
|
||||||
* @param ResponseInterface $response An optional argument to provide dependency injection for the application's
|
* @param ResponseInterface|null $response An optional argument to provide dependency injection for the application's
|
||||||
* response object.
|
* response object.
|
||||||
*/
|
*/
|
||||||
public function __construct(
|
public function __construct(
|
||||||
ControllerResolverInterface $controllerResolver,
|
ControllerResolverInterface $controllerResolver,
|
||||||
RouterInterface $router,
|
RouterInterface $router,
|
||||||
Input $input = null,
|
Input $input = null,
|
||||||
Registry $config = null,
|
|
||||||
WebClient $client = null,
|
WebClient $client = null,
|
||||||
ResponseInterface $response = null
|
ResponseInterface $response = null
|
||||||
)
|
)
|
||||||
@ -70,7 +64,7 @@ class SportStarsApplication extends AbstractWebApplication implements SessionAwa
|
|||||||
$this->router = $router;
|
$this->router = $router;
|
||||||
|
|
||||||
// Call the constructor as late as possible (it runs `initialise`).
|
// Call the constructor as late as possible (it runs `initialise`).
|
||||||
parent::__construct($input, $config, $client, $response);
|
parent::__construct($input, null, $client, $response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
@ -1,71 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Joomla! Framework Website
|
|
||||||
*
|
|
||||||
* @copyright Copyright (C) 2014 - 2017 Open Source Matters, Inc. All rights reserved.
|
|
||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\Asset;
|
|
||||||
|
|
||||||
use Symfony\Component\Asset\Context\ContextInterface;
|
|
||||||
use Symfony\Component\Asset\Package;
|
|
||||||
use Symfony\Component\Asset\PathPackage;
|
|
||||||
use Symfony\Component\Asset\VersionStrategy\VersionStrategyInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extended path package for resolving assets from a Laravel Mix manifest
|
|
||||||
* source: https://github.com/joomla/framework.joomla.org/blob/master/src/Asset/MixPathPackage.php
|
|
||||||
*/
|
|
||||||
class MixPathPackage extends PathPackage
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Decorated Package instance
|
|
||||||
*
|
|
||||||
* @var Package
|
|
||||||
*/
|
|
||||||
private $decoratedPackage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param Package $decoratedPackage Decorated Package instance
|
|
||||||
* @param string $basePath The base path to be prepended to relative paths
|
|
||||||
* @param VersionStrategyInterface $versionStrategy The version strategy
|
|
||||||
* @param ContextInterface $context The context
|
|
||||||
*/
|
|
||||||
public function __construct(
|
|
||||||
Package $decoratedPackage,
|
|
||||||
string $basePath,
|
|
||||||
VersionStrategyInterface $versionStrategy,
|
|
||||||
ContextInterface $context = null
|
|
||||||
) {
|
|
||||||
parent::__construct($basePath, $versionStrategy, $context);
|
|
||||||
|
|
||||||
$this->decoratedPackage = $decoratedPackage;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an absolute or root-relative public path.
|
|
||||||
*
|
|
||||||
* @param string $path A path
|
|
||||||
*
|
|
||||||
* @return string The public path
|
|
||||||
*/
|
|
||||||
public function getUrl($path)
|
|
||||||
{
|
|
||||||
if ($this->isAbsoluteUrl($path))
|
|
||||||
{
|
|
||||||
return $path;
|
|
||||||
}
|
|
||||||
|
|
||||||
$versionedPath = $this->getVersionStrategy()->applyVersion("/$path");
|
|
||||||
|
|
||||||
if ($versionedPath === $path)
|
|
||||||
{
|
|
||||||
return $this->decoratedPackage->getUrl($path);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->getBasePath() . ltrim($versionedPath, '/');
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,7 +6,7 @@
|
|||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Autoload;
|
namespace Change\Calculator\Autoload;
|
||||||
|
|
||||||
defined('_LEXEC') or die;
|
defined('_LEXEC') or die;
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ use LLoader;
|
|||||||
use function defined;
|
use function defined;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decorate Composer ClassLoader for Sport Stars!
|
* Decorate Composer ClassLoader for Change Calculator!
|
||||||
*
|
*
|
||||||
* For backward compatibility due to class aliasing in the CMS, the loadClass() method was modified to call
|
* For backward compatibility due to class aliasing in the CMS, the loadClass() method was modified to call
|
||||||
* the LLoader::applyAliasFor() method.
|
* the LLoader::applyAliasFor() method.
|
||||||
|
@ -1,47 +1,47 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Controller;
|
namespace Change\Calculator\Controller;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
use Joomla\Application\AbstractApplication;
|
use Joomla\Application\AbstractApplication;
|
||||||
use Joomla\Controller\AbstractController;
|
use Joomla\Controller\AbstractController;
|
||||||
use Joomla\Input\Input;
|
use Joomla\Input\Input;
|
||||||
use Sport\Stars\Application\SportStarsApplication;
|
use Change\Calculator\Application\ChangeCalculatorApplication;
|
||||||
use Sport\Stars\View\TableHtmlView;
|
use Change\Calculator\View\CalculatorHtmlView;
|
||||||
use Laminas\Diactoros\Response\HtmlResponse;
|
use Laminas\Diactoros\Response\HtmlResponse;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller handling the site's dashboard
|
* Controller handling the site's dashboard
|
||||||
*
|
*
|
||||||
* @method SportStarsApplication getApplication() Get the application object.
|
* @method ChangeCalculatorApplication getApplication() Get the application object.
|
||||||
* @property-read SportStarsApplication $app Application object
|
* @property-read ChangeCalculatorApplication $app Application object
|
||||||
*/
|
*/
|
||||||
class TableController extends AbstractController
|
class CalculatorController extends AbstractController
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The view object.
|
* The view object.
|
||||||
*
|
*
|
||||||
* @var TableHtmlView
|
* @var CalculatorHtmlView
|
||||||
*/
|
*/
|
||||||
private $view;
|
private $view;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
*
|
*
|
||||||
* @param TableHtmlView $view The view object.
|
* @param CalculatorHtmlView $view The view object.
|
||||||
* @param Input $input The input object.
|
* @param Input|null $input The input object.
|
||||||
* @param AbstractApplication $app The application object.
|
* @param AbstractApplication|null $app The application object.
|
||||||
*/
|
*/
|
||||||
public function __construct(TableHtmlView $view, Input $input = null, AbstractApplication $app = null)
|
public function __construct(CalculatorHtmlView $view, Input $input = null, AbstractApplication $app = null)
|
||||||
{
|
{
|
||||||
parent::__construct($input, $app);
|
parent::__construct($input, $app);
|
||||||
|
|
||||||
@ -59,6 +59,10 @@ class TableController extends AbstractController
|
|||||||
// Do not Enable browser caching
|
// Do not Enable browser caching
|
||||||
$this->getApplication()->allowCache(false);
|
$this->getApplication()->allowCache(false);
|
||||||
|
|
||||||
|
// get the input
|
||||||
|
$this->view->setCost($this->getInput()->getFloat('cost', 0.00));
|
||||||
|
$this->view->setPayment($this->getInput()->getFloat('payment', 0.00));
|
||||||
|
|
||||||
// render the table
|
// render the table
|
||||||
$this->getApplication()->setResponse(new HtmlResponse($this->view->render()));
|
$this->getApplication()->setResponse(new HtmlResponse($this->view->render()));
|
||||||
|
|
@ -1,185 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\Controller;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use Joomla\Application\AbstractApplication;
|
|
||||||
use Joomla\Controller\AbstractController;
|
|
||||||
use Joomla\Input\Input;
|
|
||||||
use Joomla\String\StringHelper;
|
|
||||||
use Joomla\Uri\Uri;
|
|
||||||
use Sport\Stars\Application\SportStarsApplication;
|
|
||||||
use Sport\Stars\Model\EditModel;
|
|
||||||
use Sport\Stars\View\EditHtmlView;
|
|
||||||
use Laminas\Diactoros\Response\HtmlResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Controller handling the edit area
|
|
||||||
*
|
|
||||||
* @method SportStarsApplication getApplication() Get the application object.
|
|
||||||
* @property-read SportStarsApplication $app Application object
|
|
||||||
*/
|
|
||||||
class EditController extends AbstractController
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The page model object.
|
|
||||||
*
|
|
||||||
* @var EditModel
|
|
||||||
*/
|
|
||||||
private $model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The view object.
|
|
||||||
*
|
|
||||||
* @var EditHtmlView
|
|
||||||
*/
|
|
||||||
private $view;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param EditModel $model The page model object.
|
|
||||||
* @param EditHtmlView $view The view object.
|
|
||||||
* @param Input $input The input object.
|
|
||||||
* @param AbstractApplication $app The application object.
|
|
||||||
*/
|
|
||||||
public function __construct(EditModel $model, EditHtmlView $view, Input $input = null, AbstractApplication $app = null)
|
|
||||||
{
|
|
||||||
parent::__construct($input, $app);
|
|
||||||
|
|
||||||
$this->model = $model;
|
|
||||||
$this->view = $view;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the controller.
|
|
||||||
*
|
|
||||||
* @return boolean
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function execute(): bool
|
|
||||||
{
|
|
||||||
// Do not Enable browser caching
|
|
||||||
$this->getApplication()->allowCache(false);
|
|
||||||
|
|
||||||
$method = $this->getInput()->getMethod();
|
|
||||||
$id = $this->getInput()->getInt('id', 0);
|
|
||||||
$task = $this->getInput()->getString('task', '');
|
|
||||||
|
|
||||||
// if task is delete
|
|
||||||
if ('delete' === $task)
|
|
||||||
{
|
|
||||||
// delete the item
|
|
||||||
if ($id > 0 && $this->model->delete($id))
|
|
||||||
{
|
|
||||||
$this->model->enqueueMessage('Item was deleted!', 'success');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$this->model->enqueueMessage('Item could not be deleted!', 'error');
|
|
||||||
}
|
|
||||||
// go to set page
|
|
||||||
$this->redirect();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('POST' === $method)
|
|
||||||
{
|
|
||||||
$id = $this->setItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->view->setActiveItem($id);
|
|
||||||
|
|
||||||
// check if user is allowed to access
|
|
||||||
$this->getApplication()->setResponse(new HtmlResponse($this->view->render()));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set an item
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
protected function setItem(): int
|
|
||||||
{
|
|
||||||
// get the post
|
|
||||||
$post = $this->getInput()->getInputForRequestMethod();
|
|
||||||
|
|
||||||
// we get all the needed items
|
|
||||||
$tempItem = [];
|
|
||||||
$tempItem['id'] = $post->getInt('item_id', 0);
|
|
||||||
$tempItem['name'] = $post->getString('name', '');
|
|
||||||
$tempItem['age'] = $post->getInt('age', 0);
|
|
||||||
$tempItem['sport'] = $post->getString('sport', '');
|
|
||||||
|
|
||||||
// check that we have a Title
|
|
||||||
$can_save = true;
|
|
||||||
if (empty($tempItem['name']) || is_numeric($tempItem['name']) || StringHelper::strlen($tempItem['name']) > 100)
|
|
||||||
{
|
|
||||||
// we show a warning message
|
|
||||||
$tempItem['name'] = '';
|
|
||||||
$this->model->enqueueMessage('Name field is required.', 'error');
|
|
||||||
$can_save = false;
|
|
||||||
}
|
|
||||||
// we actually can also not continue if we don't have age
|
|
||||||
if (empty($tempItem['age']) || $tempItem['age'] > 120 || $tempItem['age'] < 1)
|
|
||||||
{
|
|
||||||
// we show a warning message
|
|
||||||
$tempItem['age'] = '';
|
|
||||||
$this->model->enqueueMessage('Age field is required.', 'error');
|
|
||||||
$can_save = false;
|
|
||||||
}
|
|
||||||
// we actually can also not continue if we don't have sport
|
|
||||||
if (empty($tempItem['sport']) || is_numeric($tempItem['sport']) || StringHelper::strlen($tempItem['sport']) > 100)
|
|
||||||
{
|
|
||||||
// we show a warning message
|
|
||||||
$tempItem['sport'] = '';
|
|
||||||
$this->model->enqueueMessage('Sport field is required.', 'error');
|
|
||||||
$can_save = false;
|
|
||||||
}
|
|
||||||
// can we save the item
|
|
||||||
if ($can_save)
|
|
||||||
{
|
|
||||||
return $this->model->setItem(
|
|
||||||
$tempItem['id'],
|
|
||||||
$tempItem['name'],
|
|
||||||
$tempItem['age'],
|
|
||||||
$tempItem['sport']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add to model the post values
|
|
||||||
$this->model->tempItem = $tempItem;
|
|
||||||
|
|
||||||
return $tempItem['id'];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string|null $target
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
private function redirect()
|
|
||||||
{
|
|
||||||
// get uri request to get host
|
|
||||||
$uri = new Uri($this->getApplication()->get('uri.request'));
|
|
||||||
|
|
||||||
// fix the path
|
|
||||||
$path = $uri->getPath();
|
|
||||||
$path = substr($path, 0, strripos($path, '/'));
|
|
||||||
|
|
||||||
// redirect to the set area
|
|
||||||
$this->getApplication()->redirect($uri->getScheme() . '://' . $uri->getHost() . $path);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,18 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Controller;
|
namespace Change\Calculator\Controller;
|
||||||
|
|
||||||
use Joomla\Controller\AbstractController;
|
use Joomla\Controller\AbstractController;
|
||||||
use Laminas\Diactoros\Response\TextResponse;
|
use Laminas\Diactoros\Response\TextResponse;
|
||||||
use Sport\Stars\Application\SiteApplication;
|
use Change\Calculator\Application\SiteApplication;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Controller class to display a message to individuals looking for the wrong CMS
|
* Controller class to display a message to individuals looking for the wrong CMS
|
||||||
|
@ -1,491 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Joomla! Content Management System
|
|
||||||
*
|
|
||||||
* @copyright (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\Date;
|
|
||||||
|
|
||||||
use DateInterval;
|
|
||||||
use DateTime;
|
|
||||||
use DateTimeInterface;
|
|
||||||
use DateTimeZone;
|
|
||||||
use Exception;
|
|
||||||
use Joomla\Database\DatabaseInterface;
|
|
||||||
use ReturnTypeWillChange;
|
|
||||||
use Sport\Stars\Factory;
|
|
||||||
use function is_string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Date is a class that stores a date and provides logic to manipulate
|
|
||||||
* and render that date in a variety of formats.
|
|
||||||
*
|
|
||||||
* @method Date|bool add(DateInterval $interval) Adds an amount of days, months, years, hours, minutes and seconds to a Date object.
|
|
||||||
* @method Date|bool sub(DateInterval $interval) Subtracts an amount of days, months, years, hours, minutes and seconds from a Date object.
|
|
||||||
* @method Date|bool modify(string $modify) Alter the timestamp of this object by incre/decre-menting in a format accepted by strtotime().
|
|
||||||
*
|
|
||||||
* @property-read string $daysinmonth t - Number of days in the given month.
|
|
||||||
* @property-read string $dayofweek N - ISO-8601 numeric representation of the day of the week.
|
|
||||||
* @property-read string $dayofyear z - The day of the year (starting from 0).
|
|
||||||
* @property-read boolean $isleapyear L - Whether it's a leap year.
|
|
||||||
* @property-read string $day d - Day of the month, 2 digits with leading zeros.
|
|
||||||
* @property-read string $hour H - 24-hour format of an hour with leading zeros.
|
|
||||||
* @property-read string $minute i - Minutes with leading zeros.
|
|
||||||
* @property-read string $second s - Seconds with leading zeros.
|
|
||||||
* @property-read string $microsecond u - Microseconds with leading zeros.
|
|
||||||
* @property-read string $month m - Numeric representation of a month, with leading zeros.
|
|
||||||
* @property-read string $ordinal S - English ordinal suffix for the day of the month, 2 characters.
|
|
||||||
* @property-read string $week W - ISO-8601 week number of year, weeks starting on Monday.
|
|
||||||
* @property-read string $year Y - A full numeric representation of a year, 4 digits.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
class Date extends DateTime
|
|
||||||
{
|
|
||||||
const DAY_ABBR = "\x021\x03";
|
|
||||||
const DAY_NAME = "\x022\x03";
|
|
||||||
const MONTH_ABBR = "\x023\x03";
|
|
||||||
const MONTH_NAME = "\x024\x03";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The format string to be applied when using the __toString() magic method.
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public static $format = 'Y-m-d H:i:s';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Placeholder for a \DateTimeZone object with GMT as the time zone.
|
|
||||||
*
|
|
||||||
* @var object
|
|
||||||
* @since 1.7.0
|
|
||||||
*
|
|
||||||
* @deprecated 5.0 Without replacement
|
|
||||||
*/
|
|
||||||
protected static $gmt;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Placeholder for a \DateTimeZone object with the default server
|
|
||||||
* time zone as the time zone.
|
|
||||||
*
|
|
||||||
* @var object
|
|
||||||
* @since 1.7.0
|
|
||||||
*
|
|
||||||
* @deprecated 5.0 Without replacement
|
|
||||||
*/
|
|
||||||
protected static $stz;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The \DateTimeZone object for usage in rending dates as strings.
|
|
||||||
*
|
|
||||||
* @var DateTimeZone
|
|
||||||
* @since 3.0.0
|
|
||||||
*/
|
|
||||||
protected $tz;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param string $date String in a format accepted by strtotime(), defaults to "now".
|
|
||||||
* @param mixed $tz Time zone to be used for the date. Might be a string or a DateTimeZone object.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function __construct($date = 'now', $tz = null)
|
|
||||||
{
|
|
||||||
// Create the base GMT and server time zone objects.
|
|
||||||
if (empty(self::$gmt) || empty(self::$stz))
|
|
||||||
{
|
|
||||||
// @TODO: This code block stays here only for B/C, can be removed in 5.0
|
|
||||||
self::$gmt = new DateTimeZone('GMT');
|
|
||||||
self::$stz = new DateTimeZone(@date_default_timezone_get());
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the time zone object is not set, attempt to build it.
|
|
||||||
if (!($tz instanceof DateTimeZone))
|
|
||||||
{
|
|
||||||
if (is_string($tz))
|
|
||||||
{
|
|
||||||
$tz = new DateTimeZone($tz);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$tz = new DateTimeZone('UTC');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Backup active time zone
|
|
||||||
$activeTZ = date_default_timezone_get();
|
|
||||||
|
|
||||||
// Force UTC timezone for correct time handling
|
|
||||||
date_default_timezone_set('UTC');
|
|
||||||
|
|
||||||
// If the date is numeric assume a unix timestamp and convert it.
|
|
||||||
$date = is_numeric($date) ? date('c', $date) : $date;
|
|
||||||
|
|
||||||
// Call the DateTime constructor.
|
|
||||||
parent::__construct($date, $tz);
|
|
||||||
|
|
||||||
// Restore previously active timezone
|
|
||||||
date_default_timezone_set($activeTZ);
|
|
||||||
|
|
||||||
// Set the timezone object for access later.
|
|
||||||
$this->tz = $tz;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Magic method to access properties of the date given by class to the format method.
|
|
||||||
*
|
|
||||||
* @param string $name The name of the property.
|
|
||||||
*
|
|
||||||
* @return mixed A value if the property name is valid, null otherwise.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function __get($name)
|
|
||||||
{
|
|
||||||
$value = null;
|
|
||||||
|
|
||||||
switch ($name)
|
|
||||||
{
|
|
||||||
case 'daysinmonth':
|
|
||||||
$value = $this->format('t', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'dayofweek':
|
|
||||||
$value = $this->format('N', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'dayofyear':
|
|
||||||
$value = $this->format('z', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'isleapyear':
|
|
||||||
$value = (boolean) $this->format('L', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'day':
|
|
||||||
$value = $this->format('d', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'hour':
|
|
||||||
$value = $this->format('H', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'minute':
|
|
||||||
$value = $this->format('i', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'second':
|
|
||||||
$value = $this->format('s', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'month':
|
|
||||||
$value = $this->format('m', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'ordinal':
|
|
||||||
$value = $this->format('S', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'week':
|
|
||||||
$value = $this->format('W', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'year':
|
|
||||||
$value = $this->format('Y', true);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
$trace = debug_backtrace();
|
|
||||||
trigger_error(
|
|
||||||
'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'],
|
|
||||||
E_USER_NOTICE
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Magic method to render the date object in the format specified in the public
|
|
||||||
* static member Date::$format.
|
|
||||||
*
|
|
||||||
* @return string The date as a formatted string.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return (string) parent::format(self::$format);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Proxy for new Date().
|
|
||||||
*
|
|
||||||
* @param string $date String in a format accepted by strtotime(), defaults to "now".
|
|
||||||
* @param mixed $tz Time zone to be used for the date.
|
|
||||||
*
|
|
||||||
* @return Date
|
|
||||||
*
|
|
||||||
* @since 1.7.3
|
|
||||||
*/
|
|
||||||
public static function getInstance($date = 'now', $tz = null)
|
|
||||||
{
|
|
||||||
return new static($date, $tz);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translates day of week number to a string.
|
|
||||||
*
|
|
||||||
* @param integer $day The numeric day of the week.
|
|
||||||
* @param boolean $abbr Return the abbreviated day string?
|
|
||||||
*
|
|
||||||
* @return string The day of the week.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function dayToString($day, $abbr = false)
|
|
||||||
{
|
|
||||||
switch ($day)
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
return $abbr ? 'Sun' : 'Sunday';
|
|
||||||
case 1:
|
|
||||||
return $abbr ? 'Mon' : 'Monday';
|
|
||||||
case 2:
|
|
||||||
return $abbr ? 'Tue' : 'Tuesday';
|
|
||||||
case 3:
|
|
||||||
return $abbr ? 'Wed' : 'Wednesday';
|
|
||||||
case 4:
|
|
||||||
return $abbr ? 'Thu' : 'Thursday';
|
|
||||||
case 5:
|
|
||||||
return $abbr ? 'Fri' : 'Friday';
|
|
||||||
case 6:
|
|
||||||
return $abbr ? 'Sat' : 'Saturday';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the date as a formatted string in a local calendar.
|
|
||||||
*
|
|
||||||
* @param string $format The date format specification string (see {@link PHP_MANUAL#date})
|
|
||||||
* @param boolean $local True to return the date string in the local time zone, false to return it in GMT.
|
|
||||||
* @param boolean $translate True to translate localised strings
|
|
||||||
*
|
|
||||||
* @return string The date string in the specified format format.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function calendar($format, $local = false, $translate = true)
|
|
||||||
{
|
|
||||||
return $this->format($format, $local, $translate);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the date as a formatted string.
|
|
||||||
*
|
|
||||||
* @param string $format The date format specification string (see {@link PHP_MANUAL#date})
|
|
||||||
* @param boolean $local True to return the date string in the local time zone, false to return it in GMT.
|
|
||||||
* @param boolean $translate True to translate localised strings
|
|
||||||
*
|
|
||||||
* @return string The date string in the specified format format.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
#[ReturnTypeWillChange]
|
|
||||||
public function format($format, $local = false, $translate = true)
|
|
||||||
{
|
|
||||||
if ($translate)
|
|
||||||
{
|
|
||||||
// Do string replacements for date format options that can be translated.
|
|
||||||
$format = preg_replace('/(^|[^\\\])D/', "\\1" . self::DAY_ABBR, $format);
|
|
||||||
$format = preg_replace('/(^|[^\\\])l/', "\\1" . self::DAY_NAME, $format);
|
|
||||||
$format = preg_replace('/(^|[^\\\])M/', "\\1" . self::MONTH_ABBR, $format);
|
|
||||||
$format = preg_replace('/(^|[^\\\])F/', "\\1" . self::MONTH_NAME, $format);
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the returned time should not be local use UTC.
|
|
||||||
if ($local == false)
|
|
||||||
{
|
|
||||||
parent::setTimezone(new DateTimeZone('UTC'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Format the date.
|
|
||||||
$return = parent::format($format);
|
|
||||||
|
|
||||||
if ($translate)
|
|
||||||
{
|
|
||||||
// Manually modify the month and day strings in the formatted time.
|
|
||||||
if (strpos($return, self::DAY_ABBR) !== false)
|
|
||||||
{
|
|
||||||
$return = str_replace(self::DAY_ABBR, $this->dayToString(parent::format('w'), true), $return);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($return, self::DAY_NAME) !== false)
|
|
||||||
{
|
|
||||||
$return = str_replace(self::DAY_NAME, $this->dayToString(parent::format('w')), $return);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($return, self::MONTH_ABBR) !== false)
|
|
||||||
{
|
|
||||||
$return = str_replace(self::MONTH_ABBR, $this->monthToString(parent::format('n'), true), $return);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strpos($return, self::MONTH_NAME) !== false)
|
|
||||||
{
|
|
||||||
$return = str_replace(self::MONTH_NAME, $this->monthToString(parent::format('n')), $return);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($local == false && $this->tz !== null)
|
|
||||||
{
|
|
||||||
parent::setTimezone($this->tz);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the time offset from GMT in hours or seconds.
|
|
||||||
*
|
|
||||||
* @param boolean $hours True to return the value in hours.
|
|
||||||
*
|
|
||||||
* @return float The time offset from GMT either in hours or in seconds.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function getOffsetFromGmt($hours = false)
|
|
||||||
{
|
|
||||||
return (float) $hours ? ($this->tz->getOffset($this) / 3600) : $this->tz->getOffset($this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translates month number to a string.
|
|
||||||
*
|
|
||||||
* @param integer $month The numeric month of the year.
|
|
||||||
* @param boolean $abbr If true, return the abbreviated month string
|
|
||||||
*
|
|
||||||
* @return string The month of the year.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function monthToString($month, $abbr = false)
|
|
||||||
{
|
|
||||||
switch ($month)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
return $abbr ? 'Jan' : 'January'; //
|
|
||||||
case 2:
|
|
||||||
return $abbr ? 'Feb' : 'February';
|
|
||||||
case 3:
|
|
||||||
return $abbr ? 'Mar' : 'March';
|
|
||||||
case 4:
|
|
||||||
return $abbr ? 'Apr' : 'April';
|
|
||||||
case 5:
|
|
||||||
return 'May';
|
|
||||||
case 6:
|
|
||||||
return $abbr ? 'Jun' : 'June';
|
|
||||||
case 7:
|
|
||||||
return $abbr ? 'Jul' : 'July';
|
|
||||||
case 8:
|
|
||||||
return $abbr ? 'Aug' : 'August';
|
|
||||||
case 9:
|
|
||||||
return $abbr ? 'Sep' : 'September';
|
|
||||||
case 10:
|
|
||||||
return $abbr ? 'Oct' : 'October';
|
|
||||||
case 11:
|
|
||||||
return $abbr ? 'Nov' : 'November';
|
|
||||||
case 12:
|
|
||||||
return $abbr ? 'Dec' : 'December';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method to wrap the setTimezone() function and set the internal time zone object.
|
|
||||||
*
|
|
||||||
* @param DateTimeZone $tz The new \DateTimeZone object.
|
|
||||||
*
|
|
||||||
* @return Date
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
* @note This method can't be type hinted due to a PHP bug: https://bugs.php.net/bug.php?id=61483
|
|
||||||
*/
|
|
||||||
#[ReturnTypeWillChange]
|
|
||||||
public function setTimezone($tz)
|
|
||||||
{
|
|
||||||
$this->tz = $tz;
|
|
||||||
|
|
||||||
return parent::setTimezone($tz);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the date as an ISO 8601 string. IETF RFC 3339 defines the ISO 8601 format
|
|
||||||
* and it can be found at the IETF Web site.
|
|
||||||
*
|
|
||||||
* @param boolean $local True to return the date string in the local time zone, false to return it in GMT.
|
|
||||||
*
|
|
||||||
* @return string The date string in ISO 8601 format.
|
|
||||||
*
|
|
||||||
* @link http://www.ietf.org/rfc/rfc3339.txt
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function toISO8601($local = false)
|
|
||||||
{
|
|
||||||
return $this->format(DateTimeInterface::RFC3339, $local, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the date as an SQL datetime string.
|
|
||||||
*
|
|
||||||
* @param boolean $local True to return the date string in the local time zone, false to return it in GMT.
|
|
||||||
* @param DatabaseInterface $db The database driver or null to use Factory::getDbo()
|
|
||||||
*
|
|
||||||
* @return string The date string in SQL datetime format.
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
* @since 2.5.0
|
|
||||||
* @link http://dev.mysql.com/doc/refman/5.0/en/datetime.html
|
|
||||||
*/
|
|
||||||
public function toSql($local = false, DatabaseInterface $db = null)
|
|
||||||
{
|
|
||||||
if ($db === null)
|
|
||||||
{
|
|
||||||
/** @var DatabaseInterface $db */
|
|
||||||
$db = Factory::getContainer()->get(DatabaseInterface::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->format($db->getDateFormat(), $local, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the date as an RFC 822 string. IETF RFC 2822 supercedes RFC 822 and its definition
|
|
||||||
* can be found at the IETF Web site.
|
|
||||||
*
|
|
||||||
* @param boolean $local True to return the date string in the local time zone, false to return it in GMT.
|
|
||||||
*
|
|
||||||
* @return string The date string in RFC 822 format.
|
|
||||||
*
|
|
||||||
* @link http://www.ietf.org/rfc/rfc2822.txt
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function toRFC822($local = false)
|
|
||||||
{
|
|
||||||
return $this->format(DateTimeInterface::RFC2822, $local, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the date as UNIX time stamp.
|
|
||||||
*
|
|
||||||
* @return integer The date as a UNIX timestamp.
|
|
||||||
*
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public function toUnix()
|
|
||||||
{
|
|
||||||
return (int) parent::format('U');
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,14 +6,12 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\EventListener;
|
namespace Change\Calculator\EventListener;
|
||||||
|
|
||||||
|
use Change\Calculator\Application\ChangeCalculatorApplication;
|
||||||
use Joomla\Application\ApplicationEvents;
|
use Joomla\Application\ApplicationEvents;
|
||||||
use Joomla\Application\Event\ApplicationErrorEvent;
|
use Joomla\Application\Event\ApplicationErrorEvent;
|
||||||
use Joomla\Console\ConsoleEvents;
|
|
||||||
use Joomla\Console\Event\ApplicationErrorEvent as ConsoleApplicationErrorEvent;
|
|
||||||
use Joomla\Event\SubscriberInterface;
|
use Joomla\Event\SubscriberInterface;
|
||||||
use Sport\Stars\Application\SiteApplication;
|
|
||||||
use Joomla\Renderer\RendererInterface;
|
use Joomla\Renderer\RendererInterface;
|
||||||
use Joomla\Router\Exception\MethodNotAllowedException;
|
use Joomla\Router\Exception\MethodNotAllowedException;
|
||||||
use Joomla\Router\Exception\RouteNotFoundException;
|
use Joomla\Router\Exception\RouteNotFoundException;
|
||||||
@ -57,23 +55,10 @@ class ErrorSubscriber implements SubscriberInterface, LoggerAwareInterface
|
|||||||
public static function getSubscribedEvents(): array
|
public static function getSubscribedEvents(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
ApplicationEvents::ERROR => 'handleWebError',
|
ApplicationEvents::ERROR => 'handleWebError'
|
||||||
ConsoleEvents::APPLICATION_ERROR => 'handleConsoleError',
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle console application errors.
|
|
||||||
*
|
|
||||||
* @param ConsoleApplicationErrorEvent $event Event object
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function handleConsoleError(ConsoleApplicationErrorEvent $event): void
|
|
||||||
{
|
|
||||||
$this->logError($event->getError());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle web application errors.
|
* Handle web application errors.
|
||||||
*
|
*
|
||||||
@ -83,7 +68,7 @@ class ErrorSubscriber implements SubscriberInterface, LoggerAwareInterface
|
|||||||
*/
|
*/
|
||||||
public function handleWebError(ApplicationErrorEvent $event): void
|
public function handleWebError(ApplicationErrorEvent $event): void
|
||||||
{
|
{
|
||||||
/** @var SiteApplication $app */
|
/** @var ChangeCalculatorApplication $app */
|
||||||
$app = $event->getApplication();
|
$app = $event->getApplication();
|
||||||
|
|
||||||
switch (true)
|
switch (true)
|
||||||
@ -145,7 +130,7 @@ class ErrorSubscriber implements SubscriberInterface, LoggerAwareInterface
|
|||||||
*/
|
*/
|
||||||
private function prepareResponse(ApplicationErrorEvent $event): void
|
private function prepareResponse(ApplicationErrorEvent $event): void
|
||||||
{
|
{
|
||||||
/** @var SiteApplication $app */
|
/** @var ChangeCalculatorApplication $app */
|
||||||
$app = $event->getApplication();
|
$app = $event->getApplication();
|
||||||
|
|
||||||
$app->allowCache(false);
|
$app->allowCache(false);
|
||||||
|
@ -1,302 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars;
|
|
||||||
|
|
||||||
defined('LPATH_PLATFORM') or die;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use Joomla\Application\WebApplicationInterface;
|
|
||||||
use Joomla\Database\Service\DatabaseProvider;
|
|
||||||
use Joomla\DI\Container;
|
|
||||||
use Joomla\Registry\Registry;
|
|
||||||
use LConfig;
|
|
||||||
use PHPMailer\PHPMailer\Exception as phpmailerException;
|
|
||||||
use function defined;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sport Stars Platform Factory class.
|
|
||||||
*
|
|
||||||
* @since 1.0.0
|
|
||||||
*
|
|
||||||
* SOURCE: https://github.com/joomla/joomla-cms/blob/4.1-dev/libraries/src/Factory.php#L39
|
|
||||||
*/
|
|
||||||
abstract class Factory
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Global application object
|
|
||||||
*
|
|
||||||
* @var WebApplicationInterface
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
public static $application = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Global configuration object
|
|
||||||
*
|
|
||||||
* @var LConfig
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
public static $config = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Global container object
|
|
||||||
*
|
|
||||||
* @var Container
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
public static $container = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Global mailer object
|
|
||||||
*
|
|
||||||
* @var Mail
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
public static $mailer = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the global application object. When the global application doesn't exist, an exception is thrown.
|
|
||||||
*
|
|
||||||
* @return WebApplicationInterface object
|
|
||||||
*
|
|
||||||
* @since 1.0.0
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static function getApplication() : WebApplicationInterface
|
|
||||||
{
|
|
||||||
if (!self::$application)
|
|
||||||
{
|
|
||||||
throw new Exception('Failed to start application', 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$application;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a container object
|
|
||||||
*
|
|
||||||
* Returns the global service container object, only creating it if it doesn't already exist.
|
|
||||||
*
|
|
||||||
* This method is only suggested for use in code whose responsibility is to create new services
|
|
||||||
* and needs to be able to resolve the dependencies, and should therefore only be used when the
|
|
||||||
* container is not accessible by other means. Valid uses of this method include:
|
|
||||||
*
|
|
||||||
* - A static `getInstance()` method calling a factory service from the container,
|
|
||||||
* see `Joomla\CMS\Toolbar\Toolbar::getInstance()` as an example
|
|
||||||
* - An application front controller loading and executing the Joomla application class,
|
|
||||||
* see the `cli/joomla.php` file as an example
|
|
||||||
* - Retrieving optional constructor dependencies when not injected into a class during a transitional
|
|
||||||
* period to retain backward compatibility, in this case a deprecation notice should also be emitted to
|
|
||||||
* notify developers of changes needed in their code
|
|
||||||
*
|
|
||||||
* This method is not suggested for use as a one-for-one replacement of static calls, such as
|
|
||||||
* replacing calls to `Factory::getDbo()` with calls to `Factory::getContainer()->get('db')`, code
|
|
||||||
* should be refactored to support dependency injection instead of making this change.
|
|
||||||
*
|
|
||||||
* @return Container
|
|
||||||
*
|
|
||||||
* @since 4.0.0
|
|
||||||
*/
|
|
||||||
public static function getContainer(): Container
|
|
||||||
{
|
|
||||||
if (!self::$container)
|
|
||||||
{
|
|
||||||
self::$container = self::createContainer();
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$container;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a mailer object.
|
|
||||||
*
|
|
||||||
* Returns the global {@link Mail} object, only creating it if it doesn't already exist.
|
|
||||||
*
|
|
||||||
* @return Mail object
|
|
||||||
*
|
|
||||||
* @see Mail
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public static function getMailer()
|
|
||||||
{
|
|
||||||
if (!self::$mailer)
|
|
||||||
{
|
|
||||||
self::$mailer = self::createMailer();
|
|
||||||
}
|
|
||||||
|
|
||||||
$copy = clone self::$mailer;
|
|
||||||
|
|
||||||
return $copy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a container object
|
|
||||||
*
|
|
||||||
* @return Container
|
|
||||||
*
|
|
||||||
* @since 4.0.0
|
|
||||||
*/
|
|
||||||
protected static function createContainer(): Container
|
|
||||||
{
|
|
||||||
return (new Container)
|
|
||||||
->registerServiceProvider(new Service\ConfigurationProvider(LPATH_CONFIGURATION . '/octoconfig.php'))
|
|
||||||
->registerServiceProvider(new Service\InputProvider)
|
|
||||||
->registerServiceProvider(new DatabaseProvider)
|
|
||||||
->registerServiceProvider(new Service\EventProvider)
|
|
||||||
->registerServiceProvider(new Service\HttpProvider)
|
|
||||||
->registerServiceProvider(new Service\LoggingProvider);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a configuration object
|
|
||||||
*
|
|
||||||
* Returns the global {@link \JConfig} object, only creating it if it doesn't already exist.
|
|
||||||
*
|
|
||||||
* @param string $file The path to the configuration file
|
|
||||||
* @param string $type The type of the configuration file
|
|
||||||
* @param string $namespace The namespace of the configuration file
|
|
||||||
*
|
|
||||||
* @return Registry
|
|
||||||
*
|
|
||||||
* @see Registry
|
|
||||||
* @since 1.1.1
|
|
||||||
*/
|
|
||||||
public static function getConfig($file = null, $type = 'PHP', $namespace = '')
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* If there is an application object, fetch the configuration from there.
|
|
||||||
* Check it's not null because LanguagesModel can make it null and if it's null
|
|
||||||
* we would want to re-init it from configuration.php.
|
|
||||||
*/
|
|
||||||
if (self::$application && self::$application->getConfig() !== null)
|
|
||||||
{
|
|
||||||
return self::$application->getConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!self::$config)
|
|
||||||
{
|
|
||||||
if ($file === null)
|
|
||||||
{
|
|
||||||
$file = JPATH_CONFIGURATION . '/octoconfig.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
self::$config = self::createConfig($file, $type, $namespace);
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a configuration object
|
|
||||||
*
|
|
||||||
* @param string $file The path to the configuration file.
|
|
||||||
* @param string $type The type of the configuration file.
|
|
||||||
* @param string $namespace The namespace of the configuration file.
|
|
||||||
*
|
|
||||||
* @return Registry
|
|
||||||
*
|
|
||||||
* @see Registry
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
protected static function createConfig($file, $type = 'PHP', $namespace = '')
|
|
||||||
{
|
|
||||||
if (is_file($file))
|
|
||||||
{
|
|
||||||
include_once $file;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the registry with a default namespace of config
|
|
||||||
$registry = new Registry;
|
|
||||||
|
|
||||||
// Sanitize the namespace.
|
|
||||||
$namespace = ucfirst((string) preg_replace('/[^A-Z_]/i', '', $namespace));
|
|
||||||
|
|
||||||
// Build the config name.
|
|
||||||
$name = 'LConfig' . $namespace;
|
|
||||||
|
|
||||||
// Handle the PHP configuration type.
|
|
||||||
if ($type === 'PHP' && class_exists($name))
|
|
||||||
{
|
|
||||||
// Create the LConfig object
|
|
||||||
$config = new $name;
|
|
||||||
|
|
||||||
// Load the configuration values into the registry
|
|
||||||
$registry->loadObject($config);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $registry;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a mailer object
|
|
||||||
*
|
|
||||||
* @return Mail object
|
|
||||||
*
|
|
||||||
* @see Mail
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
protected static function createMailer()
|
|
||||||
{
|
|
||||||
// $conf = self::getConfig();
|
|
||||||
//
|
|
||||||
// $smtpauth = ($conf->get('smtpauth') == 0) ? null : 1;
|
|
||||||
// $smtpuser = $conf->get('smtpuser');
|
|
||||||
// $smtppass = $conf->get('smtppass');
|
|
||||||
// $smtphost = $conf->get('smtphost');
|
|
||||||
// $smtpsecure = $conf->get('smtpsecure');
|
|
||||||
// $smtpport = $conf->get('smtpport');
|
|
||||||
// $mailfrom = $conf->get('mailfrom');
|
|
||||||
// $fromname = $conf->get('fromname');
|
|
||||||
// $mailer = $conf->get('mailer');
|
|
||||||
//
|
|
||||||
// // Create a Mail object
|
|
||||||
// $mail = Mail::getInstance();
|
|
||||||
//
|
|
||||||
// // Clean the email address
|
|
||||||
// $mailfrom = MailHelper::cleanLine($mailfrom);
|
|
||||||
//
|
|
||||||
// // Set default sender without Reply-to if the mailfrom is a valid address
|
|
||||||
// if (MailHelper::isEmailAddress($mailfrom))
|
|
||||||
// {
|
|
||||||
// // Wrap in try/catch to catch phpmailerExceptions if it is throwing them
|
|
||||||
// try
|
|
||||||
// {
|
|
||||||
// // Check for a false return value if exception throwing is disabled
|
|
||||||
// if ($mail->setFrom($mailfrom, MailHelper::cleanLine($fromname), false) === false)
|
|
||||||
// {
|
|
||||||
// Log::add(__METHOD__ . '() could not set the sender data.', Log::WARNING, 'mail');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// catch (phpmailerException $e)
|
|
||||||
// {
|
|
||||||
// Log::add(__METHOD__ . '() could not set the sender data.', Log::WARNING, 'mail');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // Default mailer is to use PHP's mail function
|
|
||||||
// switch ($mailer)
|
|
||||||
// {
|
|
||||||
// case 'smtp':
|
|
||||||
// $mail->useSmtp($smtpauth, $smtphost, $smtpuser, $smtppass, $smtpsecure, $smtpport);
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// case 'sendmail':
|
|
||||||
// $mail->isSendmail();
|
|
||||||
// break;
|
|
||||||
//
|
|
||||||
// default:
|
|
||||||
// $mail->isMail();
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return $mail;
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,9 +6,9 @@
|
|||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Filter;
|
namespace Change\Calculator\Filter;
|
||||||
|
|
||||||
use Sport\Stars\String\PunycodeHelper;
|
use Change\Calculator\String\PunycodeHelper;
|
||||||
use Joomla\Filter\InputFilter as BaseInputFilter;
|
use Joomla\Filter\InputFilter as BaseInputFilter;
|
||||||
use function chr;
|
use function chr;
|
||||||
use function count;
|
use function count;
|
||||||
|
341
week-05/homework/libraries/src/Model/CalculatorModel.php
Normal file
341
week-05/homework/libraries/src/Model/CalculatorModel.php
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @package Change Calculator
|
||||||
|
*
|
||||||
|
* @created 24th April 2022
|
||||||
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Change\Calculator\Model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Model class for calculations
|
||||||
|
*/
|
||||||
|
class CalculatorModel
|
||||||
|
{
|
||||||
|
const MSG_INFO = 'info';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $values = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $messages = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the change
|
||||||
|
*
|
||||||
|
* @param float $cost
|
||||||
|
* @param float $payment
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getChange(float $cost, float $payment): array
|
||||||
|
{
|
||||||
|
if (empty($cost) && empty($payment))
|
||||||
|
{
|
||||||
|
// show a heads-up message
|
||||||
|
$this->enqueueMessage('Add your transaction cost and payment received values', 'info');
|
||||||
|
|
||||||
|
// return no change
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
// check that we have a cost value
|
||||||
|
elseif (empty($cost))
|
||||||
|
{
|
||||||
|
// show a warning message
|
||||||
|
$this->enqueueMessage('Add a transaction cost value', 'warning');
|
||||||
|
// keep payment
|
||||||
|
$this->values['payment'] = $payment;
|
||||||
|
|
||||||
|
// return no change
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
// check that we have a payment value
|
||||||
|
elseif (empty($payment))
|
||||||
|
{
|
||||||
|
// show a warning message
|
||||||
|
$this->enqueueMessage('Add a payment received value', 'warning');
|
||||||
|
// keep cost
|
||||||
|
$this->values['cost'] = $cost;
|
||||||
|
|
||||||
|
// return no change
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
// last check make sure the payment is more than the cost
|
||||||
|
if ($payment <= $cost)
|
||||||
|
{
|
||||||
|
// show a warning message
|
||||||
|
$this->enqueueMessage('Add a higher payment received value, that is more than the cost value', 'warning');
|
||||||
|
// keep cost
|
||||||
|
$this->values['cost'] = $cost;
|
||||||
|
|
||||||
|
// return no change
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
// good we have both values to lets calculate
|
||||||
|
return ['cost' => $cost, 'payment' => $payment, 'result' => $this->calculateChange($cost, $payment)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get already submitted form values
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getFormValues(): array
|
||||||
|
{
|
||||||
|
return $this->values;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enqueue a system message.
|
||||||
|
*
|
||||||
|
* @param string $message The message to enqueue.
|
||||||
|
* @param string $type The message type. Default is message.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public function enqueueMessage(string $message, string $type = self::MSG_INFO)
|
||||||
|
{
|
||||||
|
// Don't add empty messages.
|
||||||
|
if (empty($message) || trim($message) === '')
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!\in_array($message, $this->messages))
|
||||||
|
{
|
||||||
|
// Enqueue the message.
|
||||||
|
$this->messages[] = ['type' => $type, 'message' => $message];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the message queue.
|
||||||
|
*
|
||||||
|
* @return array The system message queue.
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
public function getMessageQueue(): array
|
||||||
|
{
|
||||||
|
// Get messages
|
||||||
|
return $this->messages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Do calculation of the change
|
||||||
|
*
|
||||||
|
* @return array The change breakdown
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
private function calculateChange(float $cost, float $payment): array
|
||||||
|
{
|
||||||
|
// the denomination breakdown to pennies
|
||||||
|
$denominations = [
|
||||||
|
(object) ['names' => '$100 bills', 'name' => '$100 bill', 'value' => '100.00', 'pennies' => 10000],
|
||||||
|
(object) ['names' => '$50 bills', 'name' => '$50 bill', 'value' => '50.00', 'pennies' => 5000],
|
||||||
|
(object) ['names' => '$20 bills', 'name' => '$20 bill', 'value' => '20.00', 'pennies' => 2000],
|
||||||
|
(object) ['names' => '$10 bills', 'name' => '$10 bill', 'value' => '10.00', 'pennies' => 1000],
|
||||||
|
(object) ['names' => '$5 bills', 'name' => '$5 bill', 'value' => '5.00', 'pennies' => 500],
|
||||||
|
(object) ['names' => '$1 bills', 'name' => '$1 bill', 'value' => '1.00', 'pennies' => 100],
|
||||||
|
(object) ['names' => 'quarters', 'name' => 'quarter', 'value' => '0.25', 'pennies' => 25],
|
||||||
|
(object) ['names' => 'dimes', 'name' => 'dime', 'value' => '0.10', 'pennies' => 10],
|
||||||
|
(object) ['names' => 'nickles', 'name' => 'nickle', 'value' => '0.05', 'pennies' => 5],
|
||||||
|
(object) ['names' => 'pennies', 'name' => 'penny', 'value' => '0.01', 'pennies' => 1]
|
||||||
|
];
|
||||||
|
// the current change
|
||||||
|
$change = $this->bc('sub', $payment, $cost, 2);
|
||||||
|
// convert to pennies
|
||||||
|
$pennies = $this->bc('mul', $change, 100);
|
||||||
|
// the breakdown
|
||||||
|
$breakdown = [];
|
||||||
|
// work out the number of pennies per denomination
|
||||||
|
foreach ($denominations as $denomination)
|
||||||
|
{
|
||||||
|
if ($pennies >= $denomination->pennies)
|
||||||
|
{
|
||||||
|
// get the number of times this denomination goes into the change
|
||||||
|
$number_of = floor($this->bc('div', $pennies, $denomination->pennies, 2));
|
||||||
|
// get the number of pennies to deduct from total pennies remaining
|
||||||
|
$deduction = $this->bc('mul', $denomination->pennies, $number_of);
|
||||||
|
// make the deduction
|
||||||
|
$pennies = $this->bc('sub', $pennies, $deduction);
|
||||||
|
// spacer for any
|
||||||
|
$spacer = ', ';
|
||||||
|
// spacer for last
|
||||||
|
if ($pennies < 1)
|
||||||
|
{
|
||||||
|
$spacer = ', and ';
|
||||||
|
}
|
||||||
|
// spacer for one or first
|
||||||
|
if (count($breakdown) == 0)
|
||||||
|
{
|
||||||
|
$spacer = '';
|
||||||
|
}
|
||||||
|
// set the current change of this denomination
|
||||||
|
$breakdown[] = [
|
||||||
|
'name' => ($number_of == 1) ? $denomination->name : $denomination->names,
|
||||||
|
'value' => $denomination->value,
|
||||||
|
'number' => $number_of,
|
||||||
|
'total' => $this->bc('mul', $number_of, (float) $denomination->value, 2),
|
||||||
|
'number_name' => ($number_of == 1) ? 'a' : $this->numberName($number_of),
|
||||||
|
'spacer' => $spacer
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['change' => $change, 'breakdown' => $breakdown];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bc math wrapper (very basic not for accounting)
|
||||||
|
* I wrote this a few years ago for a private project
|
||||||
|
*
|
||||||
|
* @param string $type The type bc math
|
||||||
|
* @param float $val1 The first value
|
||||||
|
* @param float $val2 The second value
|
||||||
|
* @param int $scale The scale value
|
||||||
|
*
|
||||||
|
* @return bool|string
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
private function bc(string $type, float $val1, float $val2, int $scale = 0)
|
||||||
|
{
|
||||||
|
// build function name
|
||||||
|
$function = 'bc' . $type;
|
||||||
|
// use the bcmath function if available
|
||||||
|
if (function_exists($function))
|
||||||
|
{
|
||||||
|
return $function($val1, $val2, $scale);
|
||||||
|
}
|
||||||
|
// if function does not exist we use +-*/ operators (fallback - not ideal)
|
||||||
|
switch ($type)
|
||||||
|
{
|
||||||
|
// Multiply two numbers
|
||||||
|
case 'mul':
|
||||||
|
return (string) round($val1 * $val2, $scale);
|
||||||
|
// Divide of two numbers
|
||||||
|
case 'div':
|
||||||
|
return (string) round($val1 / $val2, $scale);
|
||||||
|
// Adding two numbers
|
||||||
|
case 'add':
|
||||||
|
return (string) round($val1 + $val2, $scale);
|
||||||
|
// Subtract one number from the other
|
||||||
|
case 'sub':
|
||||||
|
return (string) round($val1 - $val2, $scale);
|
||||||
|
// Raise an arbitrary precision number to another
|
||||||
|
case 'pow':
|
||||||
|
return (string) round(pow($val1, $val2), $scale);
|
||||||
|
// Compare two arbitrary precision numbers
|
||||||
|
case 'comp':
|
||||||
|
return (round($val1, 2) == round($val2, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an integer into an English word string
|
||||||
|
* Thanks to Tom Nicholson <http://php.net/manual/en/function.strval.php#41988>
|
||||||
|
*
|
||||||
|
* @input int
|
||||||
|
* @returns string
|
||||||
|
*
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
private function numberName($x)
|
||||||
|
{
|
||||||
|
$nwords = array("zero", "one", "two", "three", "four", "five", "six", "seven",
|
||||||
|
"eight", "nine", "ten", "eleven", "twelve", "thirteen",
|
||||||
|
"fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
|
||||||
|
"nineteen", "twenty", 30 => "thirty", 40 => "forty",
|
||||||
|
50 => "fifty", 60 => "sixty", 70 => "seventy", 80 => "eighty",
|
||||||
|
90 => "ninety");
|
||||||
|
|
||||||
|
if (!is_numeric($x))
|
||||||
|
{
|
||||||
|
$w = $x;
|
||||||
|
}
|
||||||
|
elseif (fmod($x, 1) != 0)
|
||||||
|
{
|
||||||
|
$w = $x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ($x < 0)
|
||||||
|
{
|
||||||
|
$w = 'minus ';
|
||||||
|
$x = -$x;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$w = '';
|
||||||
|
// ... now $x is a non-negative integer.
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($x < 21) // 0 to 20
|
||||||
|
{
|
||||||
|
$w .= $nwords[$x];
|
||||||
|
}
|
||||||
|
elseif ($x < 100) // 21 to 99
|
||||||
|
{
|
||||||
|
$w .= $nwords[10 * floor($x / 10)];
|
||||||
|
$r = fmod($x, 10);
|
||||||
|
if ($r > 0)
|
||||||
|
{
|
||||||
|
$w .= ' ' . $nwords[$r];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($x < 1000) // 100 to 999
|
||||||
|
{
|
||||||
|
$w .= $nwords[floor($x / 100)] . ' hundred';
|
||||||
|
$r = fmod($x, 100);
|
||||||
|
if ($r > 0)
|
||||||
|
{
|
||||||
|
$w .= ' and ' . $this->numberName($r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elseif ($x < 1000000) // 1000 to 999999
|
||||||
|
{
|
||||||
|
$w .= $this->numberName(floor($x / 1000)) . ' thousand';
|
||||||
|
$r = fmod($x, 1000);
|
||||||
|
if ($r > 0)
|
||||||
|
{
|
||||||
|
$w .= ' ';
|
||||||
|
if ($r < 100)
|
||||||
|
{
|
||||||
|
$w .= 'and ';
|
||||||
|
}
|
||||||
|
$w .= $this->numberName($r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // millions
|
||||||
|
{
|
||||||
|
$w .= $this->numberName(floor($x / 1000000)) . ' million';
|
||||||
|
$r = fmod($x, 1000000);
|
||||||
|
if ($r > 0)
|
||||||
|
{
|
||||||
|
$w .= ' ';
|
||||||
|
if ($r < 100)
|
||||||
|
{
|
||||||
|
$w .= 'and ';
|
||||||
|
}
|
||||||
|
$w .= $this->numberName($r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $w;
|
||||||
|
}
|
||||||
|
}
|
@ -1,229 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\Model;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use Joomla\Database\DatabaseDriver;
|
|
||||||
use Joomla\Database\ParameterType;
|
|
||||||
use Joomla\Model\DatabaseModelInterface;
|
|
||||||
use Joomla\Model\DatabaseModelTrait;
|
|
||||||
use RuntimeException;
|
|
||||||
use stdClass;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Model class for items
|
|
||||||
*/
|
|
||||||
class EditModel implements DatabaseModelInterface
|
|
||||||
{
|
|
||||||
use DatabaseModelTrait;
|
|
||||||
|
|
||||||
const MSG_INFO = 'info';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
public $tempItem;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $messages = [];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate the model.
|
|
||||||
*
|
|
||||||
* @param DatabaseDriver $db The database adapter.
|
|
||||||
*/
|
|
||||||
public function __construct(DatabaseDriver $db)
|
|
||||||
{
|
|
||||||
$this->setDb($db);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add an item
|
|
||||||
*
|
|
||||||
* @param int $id
|
|
||||||
* @param string $name
|
|
||||||
* @param int $age
|
|
||||||
* @param string $sport
|
|
||||||
*
|
|
||||||
* @return int
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function setItem(
|
|
||||||
int $id,
|
|
||||||
string $name,
|
|
||||||
int $age,
|
|
||||||
string $sport): int
|
|
||||||
{
|
|
||||||
$db = $this->getDb();
|
|
||||||
|
|
||||||
$data = [
|
|
||||||
'name' => (string) $name,
|
|
||||||
'age' => (int) $age,
|
|
||||||
'sport' => (string) $sport
|
|
||||||
];
|
|
||||||
|
|
||||||
// if we have ID update
|
|
||||||
if ($id > 0)
|
|
||||||
{
|
|
||||||
$data['id'] = (int) $id;
|
|
||||||
// change to object
|
|
||||||
$data = (object) $data;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$db->updateObject('#__sportstars', $data, 'id');
|
|
||||||
}
|
|
||||||
catch (RuntimeException $exception)
|
|
||||||
{
|
|
||||||
throw new RuntimeException($exception->getMessage(), 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $id;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// change to object
|
|
||||||
$data = (object) $data;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$db->insertObject('#__sportstars', $data);
|
|
||||||
}
|
|
||||||
catch (RuntimeException $exception)
|
|
||||||
{
|
|
||||||
throw new RuntimeException($exception->getMessage(), 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $db->insertid();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an item
|
|
||||||
*
|
|
||||||
* @param int|null $id
|
|
||||||
*
|
|
||||||
* @return stdClass
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function getItem(?int $id): stdClass
|
|
||||||
{
|
|
||||||
$db = $this->getDb();
|
|
||||||
// default object (use posted values if set)
|
|
||||||
if (is_array($this->tempItem))
|
|
||||||
{
|
|
||||||
$default = (object) $this->tempItem;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$default = new \stdClass();
|
|
||||||
}
|
|
||||||
// to be sure ;)
|
|
||||||
$default->post_key = "?task=create";
|
|
||||||
|
|
||||||
// we return the default if id not correct
|
|
||||||
if (!is_numeric($id))
|
|
||||||
{
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
|
|
||||||
$query = $db->getQuery(true)
|
|
||||||
->select('*')
|
|
||||||
->from($db->quoteName('#__sportstars'))
|
|
||||||
->where($db->quoteName('id') . ' = :id')
|
|
||||||
->bind(':id', $id, ParameterType::INTEGER)
|
|
||||||
->setLimit(1);
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$result = $db->setQuery($query)->loadObject();
|
|
||||||
}
|
|
||||||
catch (RuntimeException $e)
|
|
||||||
{
|
|
||||||
// we ignore this and just return an empty object
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($result) && $result instanceof stdClass)
|
|
||||||
{
|
|
||||||
$result->post_key = "?id=$id&task=edit";
|
|
||||||
return $result;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $id
|
|
||||||
*
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function delete(int $id): bool
|
|
||||||
{
|
|
||||||
$db = $this->getDb();
|
|
||||||
// Purge the session
|
|
||||||
$query = $db->getQuery(true)
|
|
||||||
->delete($db->quoteName('#__sportstars'))
|
|
||||||
->where($db->quoteName('id') . ' = :id')
|
|
||||||
->bind(':id', $id, ParameterType::INTEGER);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
$db->setQuery($query)->execute();
|
|
||||||
}
|
|
||||||
catch (RuntimeException $e)
|
|
||||||
{
|
|
||||||
// delete failed
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Enqueue a system message.
|
|
||||||
*
|
|
||||||
* @param string $message The message to enqueue.
|
|
||||||
* @param string $type The message type. Default is message.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
public function enqueueMessage(string $message, string $type = self::MSG_INFO)
|
|
||||||
{
|
|
||||||
// Don't add empty messages.
|
|
||||||
if (empty($message) || trim($message) === '')
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!\in_array($message, $this->messages))
|
|
||||||
{
|
|
||||||
// Enqueue the message.
|
|
||||||
$this->messages[] = ['type' => $type, 'message' => $message];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the message queue.
|
|
||||||
*
|
|
||||||
* @return array The system message queue.
|
|
||||||
*
|
|
||||||
* @since 1.0.0
|
|
||||||
*/
|
|
||||||
public function getMessageQueue(): array
|
|
||||||
{
|
|
||||||
// Get messages
|
|
||||||
return $this->messages;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,50 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\Model;
|
|
||||||
|
|
||||||
use Joomla\Database\DatabaseDriver;
|
|
||||||
use Joomla\Model\DatabaseModelInterface;
|
|
||||||
use Joomla\Model\DatabaseModelTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Model class for items
|
|
||||||
*/
|
|
||||||
class TableModel implements DatabaseModelInterface
|
|
||||||
{
|
|
||||||
use DatabaseModelTrait;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate the model.
|
|
||||||
*
|
|
||||||
* @param DatabaseDriver $db The database adapter.
|
|
||||||
*/
|
|
||||||
public function __construct(DatabaseDriver $db)
|
|
||||||
{
|
|
||||||
$this->setDb($db);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the table values sportstars
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public function getTable(): array
|
|
||||||
{
|
|
||||||
$db = $this->getDb();
|
|
||||||
|
|
||||||
$query = $db->getQuery(true)
|
|
||||||
->select('*')
|
|
||||||
->from($db->quoteName('#__sportstars'));
|
|
||||||
|
|
||||||
return $db->setQuery($query)->loadObjectList('id');
|
|
||||||
}
|
|
||||||
}
|
|
@ -6,7 +6,7 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Renderer;
|
namespace Change\Calculator\Renderer;
|
||||||
|
|
||||||
use Joomla\Application\AbstractApplication;
|
use Joomla\Application\AbstractApplication;
|
||||||
use Joomla\Application\AbstractWebApplication;
|
use Joomla\Application\AbstractWebApplication;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Renderer;
|
namespace Change\Calculator\Renderer;
|
||||||
|
|
||||||
use Symfony\Component\Asset\Packages;
|
use Symfony\Component\Asset\Packages;
|
||||||
use Twig\Extension\AbstractExtension;
|
use Twig\Extension\AbstractExtension;
|
||||||
@ -24,11 +24,11 @@ class FrameworkExtension extends AbstractExtension
|
|||||||
*
|
*
|
||||||
* @return TwigFilter[] An array of TwigFilter instances
|
* @return TwigFilter[] An array of TwigFilter instances
|
||||||
*/
|
*/
|
||||||
public function getFilters()
|
public function getFilters(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
new TwigFilter('get_class', 'get_class'),
|
new TwigFilter('get_class', 'get_class'),
|
||||||
new TwigFilter('strip_root_path', [$this, 'stripRootPath']),
|
new TwigFilter('strip_root_path', [$this, 'stripRootPath'])
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,14 +37,13 @@ class FrameworkExtension extends AbstractExtension
|
|||||||
*
|
*
|
||||||
* @return TwigFunction[] An array of TwigFunction instances
|
* @return TwigFunction[] An array of TwigFunction instances
|
||||||
*/
|
*/
|
||||||
public function getFunctions()
|
public function getFunctions(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
new TwigFunction('asset', [Packages::class, 'getUrl']),
|
new TwigFunction('asset', [Packages::class, 'getUrl']),
|
||||||
new TwigFunction('preload', [FrameworkTwigRuntime::class, 'preloadAsset']),
|
new TwigFunction('preload', [FrameworkTwigRuntime::class, 'preloadAsset']),
|
||||||
new TwigFunction('request_uri', [FrameworkTwigRuntime::class, 'getRequestUri']),
|
new TwigFunction('request_uri', [FrameworkTwigRuntime::class, 'getRequestUri']),
|
||||||
new TwigFunction('route', [FrameworkTwigRuntime::class, 'getRouteUri']),
|
new TwigFunction('route', [FrameworkTwigRuntime::class, 'getRouteUri']),
|
||||||
new TwigFunction('sri', [FrameworkTwigRuntime::class, 'getSriAttributes'], ['is_safe' => ['html']]),
|
|
||||||
new TwigFunction('message_queue', [FrameworkTwigRuntime::class, 'getMessageQueue']),
|
new TwigFunction('message_queue', [FrameworkTwigRuntime::class, 'getMessageQueue']),
|
||||||
new TwigFunction('shorten_string', [FrameworkTwigRuntime::class, 'shortenString']),
|
new TwigFunction('shorten_string', [FrameworkTwigRuntime::class, 'shortenString']),
|
||||||
];
|
];
|
||||||
|
@ -6,12 +6,11 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Renderer;
|
namespace Change\Calculator\Renderer;
|
||||||
|
|
||||||
use InvalidArgumentException;
|
use InvalidArgumentException;
|
||||||
use Joomla\Application\AbstractApplication;
|
use Joomla\Application\AbstractApplication;
|
||||||
use Joomla\Preload\PreloadManager;
|
use Joomla\Preload\PreloadManager;
|
||||||
use RuntimeException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Twig runtime class
|
* Twig runtime class
|
||||||
@ -33,32 +32,16 @@ class FrameworkTwigRuntime
|
|||||||
*/
|
*/
|
||||||
private $preloadManager;
|
private $preloadManager;
|
||||||
|
|
||||||
/**
|
|
||||||
* The SRI manifest data
|
|
||||||
*
|
|
||||||
* @var array|null
|
|
||||||
*/
|
|
||||||
private $sriManifestData;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The path to the SRI manifest data
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $sriManifestPath;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param AbstractApplication $app The application object
|
* @param AbstractApplication $app The application object
|
||||||
* @param PreloadManager $preloadManager The HTTP/2 preload manager
|
* @param PreloadManager $preloadManager The HTTP/2 preload manager
|
||||||
* @param string $sriManifestPath The path to the SRI manifest data
|
|
||||||
*/
|
*/
|
||||||
public function __construct(AbstractApplication $app, PreloadManager $preloadManager, string $sriManifestPath)
|
public function __construct(AbstractApplication $app, PreloadManager $preloadManager)
|
||||||
{
|
{
|
||||||
$this->app = $app;
|
$this->app = $app;
|
||||||
$this->preloadManager = $preloadManager;
|
$this->preloadManager = $preloadManager;
|
||||||
$this->sriManifestPath = $sriManifestPath;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -108,7 +91,6 @@ class FrameworkTwigRuntime
|
|||||||
{
|
{
|
||||||
if (is_string($string) && strlen($string) > $length)
|
if (is_string($string) && strlen($string) > $length)
|
||||||
{
|
{
|
||||||
$initial = strlen($string);
|
|
||||||
$words = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
|
$words = preg_split('/([\s\n\r]+)/', $string, null, PREG_SPLIT_DELIM_CAPTURE);
|
||||||
$words_count = count((array)$words);
|
$words_count = count((array)$words);
|
||||||
|
|
||||||
@ -143,54 +125,6 @@ class FrameworkTwigRuntime
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the SRI attributes for an asset
|
|
||||||
*
|
|
||||||
* @param string $path A public path
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getSriAttributes(string $path): string
|
|
||||||
{
|
|
||||||
if ($this->sriManifestData === null)
|
|
||||||
{
|
|
||||||
if (!file_exists($this->sriManifestPath))
|
|
||||||
{
|
|
||||||
throw new RuntimeException(sprintf('SRI manifest file "%s" does not exist.', $this->sriManifestPath));
|
|
||||||
}
|
|
||||||
|
|
||||||
$sriManifestContents = file_get_contents($this->sriManifestPath);
|
|
||||||
|
|
||||||
if ($sriManifestContents === false)
|
|
||||||
{
|
|
||||||
throw new RuntimeException(sprintf('Could not read SRI manifest file "%s".', $this->sriManifestPath));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->sriManifestData = json_decode($sriManifestContents, true);
|
|
||||||
|
|
||||||
if (0 < json_last_error())
|
|
||||||
{
|
|
||||||
throw new RuntimeException(sprintf('Error parsing JSON from SRI manifest file "%s" - %s', $this->sriManifestPath, json_last_error_msg()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$assetKey = "/$path";
|
|
||||||
|
|
||||||
if (!isset($this->sriManifestData[$assetKey]))
|
|
||||||
{
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$attributes = '';
|
|
||||||
|
|
||||||
foreach ($this->sriManifestData[$assetKey] as $key => $value)
|
|
||||||
{
|
|
||||||
$attributes .= ' ' . $key . '="' . $value . '"';
|
|
||||||
}
|
|
||||||
|
|
||||||
return $attributes;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preload a resource
|
* Preload a resource
|
||||||
*
|
*
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\Application\AbstractWebApplication;
|
use Joomla\Application\AbstractWebApplication;
|
||||||
use Joomla\Application\Controller\ControllerResolverInterface;
|
use Joomla\Application\Controller\ControllerResolverInterface;
|
||||||
@ -17,7 +17,7 @@ use Joomla\DI\Container;
|
|||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
use Joomla\Event\DispatcherInterface;
|
use Joomla\Event\DispatcherInterface;
|
||||||
|
|
||||||
use Sport\Stars\Application\SportStarsApplication;
|
use Change\Calculator\Application\ChangeCalculatorApplication;
|
||||||
|
|
||||||
use Joomla\Input\Input;
|
use Joomla\Input\Input;
|
||||||
use Joomla\Router\RouterInterface;
|
use Joomla\Router\RouterInterface;
|
||||||
@ -43,8 +43,8 @@ class ApplicationProvider implements ServiceProviderInterface
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// This service cannot be protected as it is decorated when the debug bar is available
|
// This service cannot be protected as it is decorated when the debug bar is available
|
||||||
$container->alias(SportStarsApplication::class, AbstractWebApplication::class)
|
$container->alias(ChangeCalculatorApplication::class, AbstractWebApplication::class)
|
||||||
->share(AbstractWebApplication::class, [$this, 'getSportStarsApplicationClassService']);
|
->share(AbstractWebApplication::class, [$this, 'getChangeCalculatorApplicationClassService']);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Application Helpers and Dependencies
|
* Application Helpers and Dependencies
|
||||||
@ -57,16 +57,14 @@ class ApplicationProvider implements ServiceProviderInterface
|
|||||||
*
|
*
|
||||||
* @param Container $container The DI container.
|
* @param Container $container The DI container.
|
||||||
*
|
*
|
||||||
* @return SportStarsApplication
|
* @return ChangeCalculatorApplication
|
||||||
*/
|
*/
|
||||||
public function getSportStarsApplicationClassService(Container $container): SportStarsApplication
|
public function getChangeCalculatorApplicationClassService(Container $container): ChangeCalculatorApplication
|
||||||
{
|
{
|
||||||
/** @var SportStarsApplication $application */
|
$application = new ChangeCalculatorApplication(
|
||||||
$application = new SportStarsApplication(
|
|
||||||
$container->get(ControllerResolverInterface::class),
|
$container->get(ControllerResolverInterface::class),
|
||||||
$container->get(RouterInterface::class),
|
$container->get(RouterInterface::class),
|
||||||
$container->get(Input::class),
|
$container->get(Input::class),
|
||||||
$container->get('config'),
|
|
||||||
$container->get(WebClient::class)
|
$container->get(WebClient::class)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
|
||||||
|
|
||||||
use Joomla\DI\Container;
|
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
|
||||||
use Joomla\Registry\Registry;
|
|
||||||
use LConfig;
|
|
||||||
use RuntimeException;
|
|
||||||
|
|
||||||
class ConfigurationProvider implements ServiceProviderInterface
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Configuration instance
|
|
||||||
*
|
|
||||||
* @var Registry
|
|
||||||
*/
|
|
||||||
private $config;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor.
|
|
||||||
*
|
|
||||||
* @param string $file Path to the config file.
|
|
||||||
*
|
|
||||||
* @throws RuntimeException
|
|
||||||
*/
|
|
||||||
public function __construct(string $file)
|
|
||||||
{
|
|
||||||
// Verify the configuration exists and is readable.
|
|
||||||
if (!is_readable($file))
|
|
||||||
{
|
|
||||||
throw new RuntimeException('Configuration file does not exist or is unreadable.');
|
|
||||||
}
|
|
||||||
|
|
||||||
// load the class
|
|
||||||
include_once $file;
|
|
||||||
$this->config = new Registry(new LConfig());
|
|
||||||
|
|
||||||
// Set database values based on config values
|
|
||||||
$this->config->loadObject( (object) [
|
|
||||||
'database' => [
|
|
||||||
'driver' => $this->config->get('dbtype'),
|
|
||||||
'host' => $this->config->get('host'),
|
|
||||||
'port' => $this->config->get('port', ''),
|
|
||||||
'user' => $this->config->get('user'),
|
|
||||||
'password' => $this->config->get('password'),
|
|
||||||
'database' => $this->config->get('db'),
|
|
||||||
'prefix' => $this->config->get('dbprefix')
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers the service provider with a DI container.
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function register(Container $container): void
|
|
||||||
{
|
|
||||||
$container->share(
|
|
||||||
'config',
|
|
||||||
function (): Registry
|
|
||||||
{
|
|
||||||
return $this->config;
|
|
||||||
},
|
|
||||||
true
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,18 +1,18 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* Joomla! Framework Website
|
* Joomla! Framework Website
|
||||||
*
|
*
|
||||||
* @copyright Copyright (C) 2014 - 2017 Open Source Matters, Inc. All rights reserved.
|
* @copyright Copyright (C) 2014 - 2017 Open Source Matters, Inc. All rights reserved.
|
||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
use Joomla\Event\Dispatcher;
|
use Joomla\Event\Dispatcher;
|
||||||
use Joomla\Event\DispatcherInterface;
|
use Joomla\Event\DispatcherInterface;
|
||||||
use Sport\Stars\EventListener\ErrorSubscriber;
|
use Change\Calculator\EventListener\ErrorSubscriber;
|
||||||
use Joomla\Renderer\RendererInterface;
|
use Joomla\Renderer\RendererInterface;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
|
@ -6,11 +6,10 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
use Joomla\Registry\Registry;
|
|
||||||
use Monolog\Handler\StreamHandler;
|
use Monolog\Handler\StreamHandler;
|
||||||
use Monolog\Logger;
|
use Monolog\Logger;
|
||||||
use Monolog\Processor\PsrLogMessageProcessor;
|
use Monolog\Processor\PsrLogMessageProcessor;
|
||||||
@ -59,10 +58,7 @@ class LoggingProvider implements ServiceProviderInterface
|
|||||||
*/
|
*/
|
||||||
public function getMonologHandlerApplicationService(Container $container): StreamHandler
|
public function getMonologHandlerApplicationService(Container $container): StreamHandler
|
||||||
{
|
{
|
||||||
/** @var Registry $config */
|
$level = 'ERROR';
|
||||||
$config = $container->get('config');
|
|
||||||
|
|
||||||
$level = strtoupper($config->get('log.application', $config->get('log.level', 'error')));
|
|
||||||
|
|
||||||
return new StreamHandler(LPATH_ROOT . '/logs/framework.log', constant('\\Monolog\\Logger::' . $level));
|
return new StreamHandler(LPATH_ROOT . '/logs/framework.log', constant('\\Monolog\\Logger::' . $level));
|
||||||
}
|
}
|
||||||
|
@ -1,29 +1,25 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\Application\Controller\ContainerControllerResolver;
|
use Joomla\Application\Controller\ContainerControllerResolver;
|
||||||
use Joomla\Application\Controller\ControllerResolverInterface;
|
use Joomla\Application\Controller\ControllerResolverInterface;
|
||||||
use Joomla\Database\DatabaseInterface;
|
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
|
|
||||||
use Sport\Stars\Controller\TableController;
|
use Change\Calculator\Controller\CalculatorController;
|
||||||
use Sport\Stars\Controller\EditController;
|
use Change\Calculator\Controller\WrongCmsController;
|
||||||
use Sport\Stars\Controller\WrongCmsController;
|
use Change\Calculator\Model\CalculatorModel;
|
||||||
use Sport\Stars\Model\TableModel;
|
use Change\Calculator\View\CalculatorHtmlView;
|
||||||
use Sport\Stars\Model\EditModel;
|
use Change\Calculator\Application\ChangeCalculatorApplication;
|
||||||
use Sport\Stars\View\TableHtmlView;
|
|
||||||
use Sport\Stars\View\EditHtmlView;
|
|
||||||
use Sport\Stars\Application\SportStarsApplication;
|
|
||||||
|
|
||||||
use Joomla\Input\Input;
|
use Joomla\Input\Input;
|
||||||
|
|
||||||
@ -46,28 +42,19 @@ class MVCProvider implements ServiceProviderInterface
|
|||||||
->share(ControllerResolverInterface::class, [$this, 'getControllerResolverService']);
|
->share(ControllerResolverInterface::class, [$this, 'getControllerResolverService']);
|
||||||
|
|
||||||
// Controllers
|
// Controllers
|
||||||
$container->alias(TableController::class, 'controller.table')
|
$container->alias(CalculatorController::class, 'controller.calculator')
|
||||||
->share('controller.table', [$this, 'getControllerTableService'], true);
|
->share('controller.calculator', [$this, 'getControllerCalculatorService'], true);
|
||||||
|
|
||||||
$container->alias(EditController::class, 'controller.edit')
|
|
||||||
->share('controller.edit', [$this, 'getControllerEditService'], true);
|
|
||||||
|
|
||||||
$container->alias(WrongCmsController::class, 'controller.wrong.cms')
|
$container->alias(WrongCmsController::class, 'controller.wrong.cms')
|
||||||
->share('controller.wrong.cms', [$this, 'getControllerWrongCmsService'], true);
|
->share('controller.wrong.cms', [$this, 'getControllerWrongCmsService'], true);
|
||||||
|
|
||||||
// Models
|
// Models
|
||||||
$container->alias(TableModel::class, 'model.table')
|
$container->alias(CalculatorModel::class, 'model.calculator')
|
||||||
->share('model.table', [$this, 'getModelTableService'], true);
|
->share('model.calculator', [$this, 'getModelCalculatorService'], true);
|
||||||
|
|
||||||
$container->alias(EditModel::class, 'model.edit')
|
|
||||||
->share('model.edit', [$this, 'getModelEditService'], true);
|
|
||||||
|
|
||||||
// Views
|
// Views
|
||||||
$container->alias(TableHtmlView::class, 'view.table.html')
|
$container->alias(CalculatorHtmlView::class, 'view.calculator.html')
|
||||||
->share('view.table.html', [$this, 'getViewTableHtmlService'], true);
|
->share('view.calculator.html', [$this, 'getViewCalculatorHtmlService'], true);
|
||||||
|
|
||||||
$container->alias(EditHtmlView::class, 'view.edit.html')
|
|
||||||
->share('view.edit.html', [$this, 'getViewEditHtmlService'], true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -93,102 +80,53 @@ class MVCProvider implements ServiceProviderInterface
|
|||||||
{
|
{
|
||||||
return new WrongCmsController(
|
return new WrongCmsController(
|
||||||
$container->get(Input::class),
|
$container->get(Input::class),
|
||||||
$container->get(SportStarsApplication::class)
|
$container->get(ChangeCalculatorApplication::class)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the `controller.table` service
|
* Get the `controller.calculator` service
|
||||||
*
|
*
|
||||||
* @param Container $container The DI container.
|
* @param Container $container The DI container.
|
||||||
*
|
*
|
||||||
* @return TableController
|
* @return CalculatorController
|
||||||
*/
|
*/
|
||||||
public function getControllerTableService(Container $container): TableController
|
public function getControllerCalculatorService(Container $container): CalculatorController
|
||||||
{
|
{
|
||||||
return new TableController(
|
return new CalculatorController(
|
||||||
$container->get(TableHtmlView::class),
|
$container->get(CalculatorHtmlView::class),
|
||||||
$container->get(Input::class),
|
$container->get(Input::class),
|
||||||
$container->get(SportStarsApplication::class)
|
$container->get(ChangeCalculatorApplication::class)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the `controller.edit` service
|
* Get the `model.calculator` service
|
||||||
*
|
*
|
||||||
* @param Container $container The DI container.
|
* @param Container $container The DI container.
|
||||||
*
|
*
|
||||||
* @return EditController
|
* @return CalculatorModel
|
||||||
*/
|
*/
|
||||||
public function getControllerEditService(Container $container): EditController
|
public function getModelCalculatorService(Container $container): CalculatorModel
|
||||||
{
|
{
|
||||||
return new EditController(
|
return new CalculatorModel();
|
||||||
$container->get(EditModel::class),
|
|
||||||
$container->get(EditHtmlView::class),
|
|
||||||
$container->get(Input::class),
|
|
||||||
$container->get(SportStarsApplication::class)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the `model.table` service
|
* Get the `view.calculator.html` service
|
||||||
*
|
*
|
||||||
* @param Container $container The DI container.
|
* @param Container $container The DI container.
|
||||||
*
|
*
|
||||||
* @return TableModel
|
* @return CalculatorHtmlView
|
||||||
*/
|
*/
|
||||||
public function getModelTableService(Container $container): TableModel
|
public function getViewCalculatorHtmlService(Container $container): CalculatorHtmlView
|
||||||
{
|
{
|
||||||
return new TableModel($container->get(DatabaseInterface::class));
|
$view = new CalculatorHtmlView(
|
||||||
}
|
$container->get('model.calculator'),
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the `model.edit` service
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return EditModel
|
|
||||||
*/
|
|
||||||
public function getModelEditService(Container $container): EditModel
|
|
||||||
{
|
|
||||||
return new EditModel($container->get(DatabaseInterface::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the `view.table.html` service
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return TableHtmlView
|
|
||||||
*/
|
|
||||||
public function getViewTableHtmlService(Container $container): TableHtmlView
|
|
||||||
{
|
|
||||||
$view = new TableHtmlView(
|
|
||||||
$container->get('model.edit'),
|
|
||||||
$container->get('model.table'),
|
|
||||||
$container->get('renderer')
|
$container->get('renderer')
|
||||||
);
|
);
|
||||||
|
|
||||||
$view->setLayout('table.twig');
|
$view->setLayout('calculator.twig');
|
||||||
|
|
||||||
return $view;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the `view.edit.html` service
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return EditHtmlView
|
|
||||||
*/
|
|
||||||
public function getViewEditHtmlService(Container $container): EditHtmlView
|
|
||||||
{
|
|
||||||
$view = new EditHtmlView(
|
|
||||||
$container->get('model.edit'),
|
|
||||||
$container->get('renderer')
|
|
||||||
);
|
|
||||||
|
|
||||||
$view->setLayout('edit.twig');
|
|
||||||
|
|
||||||
return $view;
|
return $view;
|
||||||
}
|
}
|
||||||
|
@ -1,20 +1,19 @@
|
|||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* @package Sport Stars
|
* @package Change Calculator
|
||||||
*
|
*
|
||||||
* @created 19th April 2022
|
* @created 24th April 2022
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
|
|
||||||
use Sport\Stars\Controller\TableController;
|
use Change\Calculator\Controller\CalculatorController;
|
||||||
use Sport\Stars\Controller\EditController;
|
|
||||||
|
|
||||||
use Joomla\Router\Router;
|
use Joomla\Router\Router;
|
||||||
use Joomla\Router\RouterInterface;
|
use Joomla\Router\RouterInterface;
|
||||||
@ -52,15 +51,11 @@ class RouterProvider implements ServiceProviderInterface
|
|||||||
$router = new Router;
|
$router = new Router;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sports Stars
|
* Change Calculator
|
||||||
**/
|
**/
|
||||||
$router->get(
|
|
||||||
'/',
|
|
||||||
TableController::class
|
|
||||||
);
|
|
||||||
$router->all(
|
$router->all(
|
||||||
'/edit',
|
'/',
|
||||||
EditController::class
|
CalculatorController::class
|
||||||
);
|
);
|
||||||
|
|
||||||
return $router;
|
return $router;
|
||||||
|
@ -6,40 +6,23 @@
|
|||||||
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
* @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License Version 2 or Later
|
||||||
*/
|
*/
|
||||||
|
|
||||||
namespace Sport\Stars\Service;
|
namespace Change\Calculator\Service;
|
||||||
|
|
||||||
use Joomla\Application\AbstractApplication;
|
use Joomla\Application\AbstractApplication;
|
||||||
use Joomla\DI\Container;
|
use Joomla\DI\Container;
|
||||||
use Joomla\DI\ServiceProviderInterface;
|
use Joomla\DI\ServiceProviderInterface;
|
||||||
use Joomla\Registry\Registry;
|
use Change\Calculator\Renderer\FrameworkExtension;
|
||||||
use Sport\Stars\Asset\MixPathPackage;
|
use Change\Calculator\Renderer\FrameworkTwigRuntime;
|
||||||
use Sport\Stars\Renderer\ApplicationContext;
|
|
||||||
use Sport\Stars\Renderer\FrameworkExtension;
|
|
||||||
use Sport\Stars\Renderer\FrameworkTwigRuntime;
|
|
||||||
use Joomla\Preload\PreloadManager;
|
use Joomla\Preload\PreloadManager;
|
||||||
use Joomla\Renderer\RendererInterface;
|
use Joomla\Renderer\RendererInterface;
|
||||||
use Joomla\Renderer\TwigRenderer;
|
use Joomla\Renderer\TwigRenderer;
|
||||||
use Symfony\Component\Asset\Packages;
|
|
||||||
use Symfony\Component\Asset\PathPackage;
|
|
||||||
use Symfony\Component\Asset\VersionStrategy\EmptyVersionStrategy;
|
|
||||||
use Symfony\Component\Asset\VersionStrategy\JsonManifestVersionStrategy;
|
|
||||||
use Twig\Cache\CacheInterface;
|
|
||||||
use Twig\Cache\FilesystemCache;
|
|
||||||
use Twig\Cache\NullCache;
|
|
||||||
use Twig\Environment;
|
use Twig\Environment;
|
||||||
use Twig\Extension\DebugExtension;
|
use Twig\Extension\DebugExtension;
|
||||||
use Twig\Extension\ProfilerExtension;
|
use Twig\Extra\Intl\IntlExtension;
|
||||||
use Twig\Loader\FilesystemLoader;
|
use Twig\Loader\FilesystemLoader;
|
||||||
use Twig\Loader\LoaderInterface;
|
use Twig\Loader\LoaderInterface;
|
||||||
use Twig\Profiler\Profile;
|
use Twig\Profiler\Profile;
|
||||||
use Twig\RuntimeLoader\ContainerRuntimeLoader;
|
use Twig\RuntimeLoader\ContainerRuntimeLoader;
|
||||||
use Twig_CacheInterface;
|
|
||||||
use Twig_ContainerRuntimeLoader;
|
|
||||||
use Twig_Environment;
|
|
||||||
use Twig_Extension_Debug;
|
|
||||||
use Twig_Extension_Profiler;
|
|
||||||
use Twig_LoaderInterface;
|
|
||||||
use Twig_Profiler_Profile;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Templating service provider
|
* Templating service provider
|
||||||
@ -56,84 +39,34 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
*/
|
*/
|
||||||
public function register(Container $container): void
|
public function register(Container $container): void
|
||||||
{
|
{
|
||||||
$container->alias(Packages::class, 'asset.packages')
|
|
||||||
->share('asset.packages', [$this, 'getAssetPackagesService'], true);
|
|
||||||
|
|
||||||
$container->alias(RendererInterface::class, 'renderer')
|
$container->alias(RendererInterface::class, 'renderer')
|
||||||
->alias(TwigRenderer::class, 'renderer')
|
->alias(TwigRenderer::class, 'renderer')
|
||||||
->share('renderer', [$this, 'getRendererService'], true);
|
->share('renderer', [$this, 'getRendererService'], true);
|
||||||
|
|
||||||
$container->alias(CacheInterface::class, 'twig.cache')
|
|
||||||
->alias(Twig_CacheInterface::class, 'twig.cache')
|
|
||||||
->share('twig.cache', [$this, 'getTwigCacheService'], true);
|
|
||||||
|
|
||||||
$container->alias(Environment::class, 'twig.environment')
|
$container->alias(Environment::class, 'twig.environment')
|
||||||
->alias(Twig_Environment::class, 'twig.environment')
|
|
||||||
->share('twig.environment', [$this, 'getTwigEnvironmentService'], true);
|
->share('twig.environment', [$this, 'getTwigEnvironmentService'], true);
|
||||||
|
|
||||||
$container->alias(DebugExtension::class, 'twig.extension.debug')
|
$container->alias(DebugExtension::class, 'twig.extension.debug')
|
||||||
->alias(Twig_Extension_Debug::class, 'twig.extension.debug')
|
|
||||||
->share('twig.extension.debug', [$this, 'getTwigExtensionDebugService'], true);
|
->share('twig.extension.debug', [$this, 'getTwigExtensionDebugService'], true);
|
||||||
|
|
||||||
$container->alias(FrameworkExtension::class, 'twig.extension.framework')
|
$container->alias(FrameworkExtension::class, 'twig.extension.framework')
|
||||||
->share('twig.extension.framework', [$this, 'getTwigExtensionFrameworkService'], true);
|
->share('twig.extension.framework', [$this, 'getTwigExtensionFrameworkService'], true);
|
||||||
|
|
||||||
// This service cannot be protected as it is decorated when the debug bar is available
|
|
||||||
$container->alias(ProfilerExtension::class, 'twig.extension.profiler')
|
|
||||||
->alias(Twig_Extension_Profiler::class, 'twig.extension.profiler')
|
|
||||||
->share('twig.extension.profiler', [$this, 'getTwigExtensionProfilerService']);
|
|
||||||
|
|
||||||
$container->alias(LoaderInterface::class, 'twig.loader')
|
$container->alias(LoaderInterface::class, 'twig.loader')
|
||||||
->alias(Twig_LoaderInterface::class, 'twig.loader')
|
|
||||||
->share('twig.loader', [$this, 'getTwigLoaderService'], true);
|
->share('twig.loader', [$this, 'getTwigLoaderService'], true);
|
||||||
|
|
||||||
$container->alias(Profile::class, 'twig.profiler.profile')
|
$container->alias(Profile::class, 'twig.profiler.profile')
|
||||||
->alias(Twig_Profiler_Profile::class, 'twig.profiler.profile')
|
|
||||||
->share('twig.profiler.profile', [$this, 'getTwigProfilerProfileService'], true);
|
->share('twig.profiler.profile', [$this, 'getTwigProfilerProfileService'], true);
|
||||||
|
|
||||||
$container->alias(FrameworkTwigRuntime::class, 'twig.runtime.framework')
|
$container->alias(FrameworkTwigRuntime::class, 'twig.runtime.framework')
|
||||||
->share('twig.runtime.framework', [$this, 'getTwigRuntimeFrameworkService'], true);
|
->share('twig.runtime.framework', [$this, 'getTwigRuntimeFrameworkService'], true);
|
||||||
|
|
||||||
$container->alias(ContainerRuntimeLoader::class, 'twig.runtime.loader')
|
$container->alias(ContainerRuntimeLoader::class, 'twig.runtime.loader')
|
||||||
->alias(Twig_ContainerRuntimeLoader::class, 'twig.runtime.loader')
|
|
||||||
->share('twig.runtime.loader', [$this, 'getTwigRuntimeLoaderService'], true);
|
->share('twig.runtime.loader', [$this, 'getTwigRuntimeLoaderService'], true);
|
||||||
|
|
||||||
$this->tagTwigExtensions($container);
|
$this->tagTwigExtensions($container);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the `asset.packages` service
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return Packages
|
|
||||||
*/
|
|
||||||
public function getAssetPackagesService(Container $container): Packages
|
|
||||||
{
|
|
||||||
/** @var AbstractApplication $app */
|
|
||||||
$app = $container->get(AbstractApplication::class);
|
|
||||||
|
|
||||||
$context = new ApplicationContext($app);
|
|
||||||
|
|
||||||
$mediaPath = $app->get('uri.media.path', '/media/');
|
|
||||||
|
|
||||||
$defaultPackage = new PathPackage($mediaPath, new EmptyVersionStrategy, $context);
|
|
||||||
|
|
||||||
$mixStrategy = new MixPathPackage(
|
|
||||||
$defaultPackage,
|
|
||||||
$mediaPath,
|
|
||||||
new JsonManifestVersionStrategy(LPATH_ROOT . '/media/mix-manifest.json'),
|
|
||||||
$context
|
|
||||||
);
|
|
||||||
|
|
||||||
return new Packages(
|
|
||||||
$defaultPackage,
|
|
||||||
[
|
|
||||||
'mix' => $mixStrategy,
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the `renderer` service
|
* Get the `renderer` service
|
||||||
*
|
*
|
||||||
@ -146,31 +79,6 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
return new TwigRenderer($container->get('twig.environment'));
|
return new TwigRenderer($container->get('twig.environment'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the `twig.cache` service
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return Twig_CacheInterface
|
|
||||||
*/
|
|
||||||
public function getTwigCacheService(Container $container): Twig_CacheInterface
|
|
||||||
{
|
|
||||||
/** @var Registry $config */
|
|
||||||
$config = $container->get('config');
|
|
||||||
|
|
||||||
// Pull down the renderer config
|
|
||||||
$cacheEnabled = $config->get('template.cache.enabled', false);
|
|
||||||
$cachePath = $config->get('template.cache.path', 'cache/twig');
|
|
||||||
$debug = $config->get('template.debug', false);
|
|
||||||
|
|
||||||
if ($debug === false && $cacheEnabled !== false)
|
|
||||||
{
|
|
||||||
return new FilesystemCache(LPATH_ROOT . '/' . $cachePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new NullCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the `twig.environment` service
|
* Get the `twig.environment` service
|
||||||
*
|
*
|
||||||
@ -180,10 +88,7 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
*/
|
*/
|
||||||
public function getTwigEnvironmentService(Container $container): Environment
|
public function getTwigEnvironmentService(Container $container): Environment
|
||||||
{
|
{
|
||||||
/** @var Registry $config */
|
$debug = false;
|
||||||
$config = $container->get('config');
|
|
||||||
|
|
||||||
$debug = $config->get('template.debug', false);
|
|
||||||
|
|
||||||
$environment = new Environment(
|
$environment = new Environment(
|
||||||
$container->get('twig.loader'),
|
$container->get('twig.loader'),
|
||||||
@ -193,14 +98,14 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
// Add the runtime loader
|
// Add the runtime loader
|
||||||
$environment->addRuntimeLoader($container->get('twig.runtime.loader'));
|
$environment->addRuntimeLoader($container->get('twig.runtime.loader'));
|
||||||
|
|
||||||
// Set up the environment's caching service
|
|
||||||
$environment->setCache($container->get('twig.cache'));
|
|
||||||
|
|
||||||
// Add the Twig extensions
|
// Add the Twig extensions
|
||||||
$environment->setExtensions($container->getTagged('twig.extension'));
|
$environment->setExtensions($container->getTagged('twig.extension'));
|
||||||
|
|
||||||
|
// add international
|
||||||
|
$environment->addExtension(new IntlExtension());
|
||||||
|
|
||||||
// Add a global tracking the debug states
|
// Add a global tracking the debug states
|
||||||
$environment->addGlobal('appDebug', $config->get('debug', false));
|
$environment->addGlobal('appDebug', false);
|
||||||
$environment->addGlobal('fwDebug', $debug);
|
$environment->addGlobal('fwDebug', $debug);
|
||||||
|
|
||||||
return $environment;
|
return $environment;
|
||||||
@ -230,26 +135,14 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
return new FrameworkExtension;
|
return new FrameworkExtension;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the `twig.extension.profiler` service
|
|
||||||
*
|
|
||||||
* @param Container $container The DI container.
|
|
||||||
*
|
|
||||||
* @return ProfilerExtension
|
|
||||||
*/
|
|
||||||
public function getTwigExtensionProfilerService(Container $container): ProfilerExtension
|
|
||||||
{
|
|
||||||
return new ProfilerExtension($container->get('twig.profiler.profile'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the `twig.loader` service
|
* Get the `twig.loader` service
|
||||||
*
|
*
|
||||||
* @param Container $container The DI container.
|
* @param Container $container The DI container.
|
||||||
*
|
*
|
||||||
* @return Twig_LoaderInterface
|
* @return FilesystemLoader
|
||||||
*/
|
*/
|
||||||
public function getTwigLoaderService(Container $container): Twig_LoaderInterface
|
public function getTwigLoaderService(Container $container): FilesystemLoader
|
||||||
{
|
{
|
||||||
return new FilesystemLoader([LPATH_TEMPLATES]);
|
return new FilesystemLoader([LPATH_TEMPLATES]);
|
||||||
}
|
}
|
||||||
@ -277,8 +170,7 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
{
|
{
|
||||||
return new FrameworkTwigRuntime(
|
return new FrameworkTwigRuntime(
|
||||||
$container->get(AbstractApplication::class),
|
$container->get(AbstractApplication::class),
|
||||||
$container->get(PreloadManager::class),
|
$container->get(PreloadManager::class)
|
||||||
LPATH_ROOT . '/media/sri-manifest.json'
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,18 +195,6 @@ class TemplatingProvider implements ServiceProviderInterface
|
|||||||
*/
|
*/
|
||||||
private function tagTwigExtensions(Container $container): void
|
private function tagTwigExtensions(Container $container): void
|
||||||
{
|
{
|
||||||
/** @var Registry $config */
|
$container->tag('twig.extension', ['twig.extension.framework']);
|
||||||
$config = $container->get('config');
|
|
||||||
|
|
||||||
$debug = $config->get('template.debug', false);
|
|
||||||
|
|
||||||
$twigExtensions = ['twig.extension.framework'];
|
|
||||||
|
|
||||||
if ($debug)
|
|
||||||
{
|
|
||||||
$twigExtensions[] = 'twig.extension.debug';
|
|
||||||
}
|
|
||||||
|
|
||||||
$container->tag('twig.extension', $twigExtensions);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,260 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Joomla! Content Management System
|
|
||||||
*
|
|
||||||
* @copyright (C) 2013 Open Source Matters, Inc. <https://www.joomla.org>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\String;
|
|
||||||
|
|
||||||
use Algo26\IdnaConvert\ToIdn;
|
|
||||||
use Algo26\IdnaConvert\ToUnicode;
|
|
||||||
use Joomla\Uri\UriHelper;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Joomla Platform String Punycode Class
|
|
||||||
*
|
|
||||||
* Class for handling UTF-8 URLs
|
|
||||||
* Wraps the Punycode library
|
|
||||||
* All functions assume the validity of utf-8 URLs.
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
abstract class PunycodeHelper
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Transforms a UTF-8 string to a Punycode string
|
|
||||||
*
|
|
||||||
* @param string $utfString The UTF-8 string to transform
|
|
||||||
*
|
|
||||||
* @return string The punycode string
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
public static function toPunycode($utfString)
|
|
||||||
{
|
|
||||||
return (new ToIdn)->convert($utfString);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transforms a Punycode string to a UTF-8 string
|
|
||||||
*
|
|
||||||
* @param string $punycodeString The Punycode string to transform
|
|
||||||
*
|
|
||||||
* @return string The UF-8 URL
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
public static function fromPunycode($punycodeString)
|
|
||||||
{
|
|
||||||
return (new ToUnicode)->convert($punycodeString);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transforms a UTF-8 URL to a Punycode URL
|
|
||||||
*
|
|
||||||
* @param string $uri The UTF-8 URL to transform
|
|
||||||
*
|
|
||||||
* @return string The punycode URL
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
public static function urlToPunycode($uri)
|
|
||||||
{
|
|
||||||
$parsed = UriHelper::parse_url($uri);
|
|
||||||
|
|
||||||
if (!isset($parsed['host']) || $parsed['host'] == '')
|
|
||||||
{
|
|
||||||
// If there is no host we do not need to convert it.
|
|
||||||
return $uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = $parsed['host'];
|
|
||||||
$hostExploded = explode('.', $host);
|
|
||||||
$newhost = '';
|
|
||||||
|
|
||||||
foreach ($hostExploded as $hostex)
|
|
||||||
{
|
|
||||||
$hostex = static::toPunycode($hostex);
|
|
||||||
$newhost .= $hostex . '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$newhost = substr($newhost, 0, -1);
|
|
||||||
$newuri = '';
|
|
||||||
|
|
||||||
if (!empty($parsed['scheme']))
|
|
||||||
{
|
|
||||||
// Assume :// is required although it is not always.
|
|
||||||
$newuri .= $parsed['scheme'] . '://';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($newhost))
|
|
||||||
{
|
|
||||||
$newuri .= $newhost;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['port']))
|
|
||||||
{
|
|
||||||
$newuri .= ':' . $parsed['port'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['path']))
|
|
||||||
{
|
|
||||||
$newuri .= $parsed['path'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['query']))
|
|
||||||
{
|
|
||||||
$newuri .= '?' . $parsed['query'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['fragment']))
|
|
||||||
{
|
|
||||||
$newuri .= '#' . $parsed['fragment'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $newuri;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transforms a Punycode URL to a UTF-8 URL
|
|
||||||
*
|
|
||||||
* @param string $uri The Punycode URL to transform
|
|
||||||
*
|
|
||||||
* @return string The UTF-8 URL
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
public static function urlToUTF8($uri)
|
|
||||||
{
|
|
||||||
if (empty($uri))
|
|
||||||
{
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$parsed = UriHelper::parse_url($uri);
|
|
||||||
|
|
||||||
if (!isset($parsed['host']) || $parsed['host'] == '')
|
|
||||||
{
|
|
||||||
// If there is no host we do not need to convert it.
|
|
||||||
return $uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
$host = $parsed['host'];
|
|
||||||
$hostExploded = explode('.', $host);
|
|
||||||
$newhost = '';
|
|
||||||
|
|
||||||
foreach ($hostExploded as $hostex)
|
|
||||||
{
|
|
||||||
$hostex = self::fromPunycode($hostex);
|
|
||||||
$newhost .= $hostex . '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$newhost = substr($newhost, 0, -1);
|
|
||||||
$newuri = '';
|
|
||||||
|
|
||||||
if (!empty($parsed['scheme']))
|
|
||||||
{
|
|
||||||
// Assume :// is required although it is not always.
|
|
||||||
$newuri .= $parsed['scheme'] . '://';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($newhost))
|
|
||||||
{
|
|
||||||
$newuri .= $newhost;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['port']))
|
|
||||||
{
|
|
||||||
$newuri .= ':' . $parsed['port'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['path']))
|
|
||||||
{
|
|
||||||
$newuri .= $parsed['path'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['query']))
|
|
||||||
{
|
|
||||||
$newuri .= '?' . $parsed['query'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($parsed['fragment']))
|
|
||||||
{
|
|
||||||
$newuri .= '#' . $parsed['fragment'];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $newuri;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transforms a UTF-8 email to a Punycode email
|
|
||||||
* This assumes a valid email address
|
|
||||||
*
|
|
||||||
* @param string $email The UTF-8 email to transform
|
|
||||||
*
|
|
||||||
* @return string The punycode email
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
public static function emailToPunycode($email)
|
|
||||||
{
|
|
||||||
$explodedAddress = explode('@', $email);
|
|
||||||
|
|
||||||
// Not addressing UTF-8 user names
|
|
||||||
$newEmail = $explodedAddress[0];
|
|
||||||
|
|
||||||
if (!empty($explodedAddress[1]))
|
|
||||||
{
|
|
||||||
$domainExploded = explode('.', $explodedAddress[1]);
|
|
||||||
$newdomain = '';
|
|
||||||
|
|
||||||
foreach ($domainExploded as $domainex)
|
|
||||||
{
|
|
||||||
$domainex = static::toPunycode($domainex);
|
|
||||||
$newdomain .= $domainex . '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$newdomain = substr($newdomain, 0, -1);
|
|
||||||
$newEmail = $newEmail . '@' . $newdomain;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $newEmail;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Transforms a Punycode email to a UTF-8 email
|
|
||||||
* This assumes a valid email address
|
|
||||||
*
|
|
||||||
* @param string $email The punycode email to transform
|
|
||||||
*
|
|
||||||
* @return string The punycode email
|
|
||||||
*
|
|
||||||
* @since 3.1.2
|
|
||||||
*/
|
|
||||||
public static function emailToUTF8($email)
|
|
||||||
{
|
|
||||||
$explodedAddress = explode('@', $email);
|
|
||||||
|
|
||||||
// Not addressing UTF-8 user names
|
|
||||||
$newEmail = $explodedAddress[0];
|
|
||||||
|
|
||||||
if (!empty($explodedAddress[1]))
|
|
||||||
{
|
|
||||||
$domainExploded = explode('.', $explodedAddress[1]);
|
|
||||||
$newdomain = '';
|
|
||||||
|
|
||||||
foreach ($domainExploded as $domainex)
|
|
||||||
{
|
|
||||||
$domainex = static::fromPunycode($domainex);
|
|
||||||
$newdomain .= $domainex . '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
$newdomain = substr($newdomain, 0, -1);
|
|
||||||
$newEmail = $newEmail . '@' . $newdomain;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $newEmail;
|
|
||||||
}
|
|
||||||
}
|
|
101
week-05/homework/libraries/src/View/CalculatorHtmlView.php
Normal file
101
week-05/homework/libraries/src/View/CalculatorHtmlView.php
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* @package Change Calculator
|
||||||
|
*
|
||||||
|
* @created 24th April 2022
|
||||||
|
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
||||||
|
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
||||||
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Change\Calculator\View;
|
||||||
|
|
||||||
|
use Change\Calculator\Model\CalculatorModel;
|
||||||
|
use Joomla\Renderer\RendererInterface;
|
||||||
|
use Joomla\View\HtmlView;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Page HTML view class for the application
|
||||||
|
*/
|
||||||
|
class CalculatorHtmlView extends HtmlView
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The table model object.
|
||||||
|
*
|
||||||
|
* @var CalculatorModel
|
||||||
|
*/
|
||||||
|
private $model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The payment amount
|
||||||
|
*
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $payment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The cost amount
|
||||||
|
*
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $cost;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instantiate the view.
|
||||||
|
*
|
||||||
|
* @param CalculatorModel $model The calculator model object.
|
||||||
|
* @param RendererInterface $renderer The renderer object.
|
||||||
|
*/
|
||||||
|
public function __construct(CalculatorModel $model, RendererInterface $renderer)
|
||||||
|
{
|
||||||
|
parent::__construct($renderer);
|
||||||
|
|
||||||
|
$this->model = $model;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to render the view
|
||||||
|
*
|
||||||
|
* @return string The rendered view
|
||||||
|
*/
|
||||||
|
public function render(): string
|
||||||
|
{
|
||||||
|
// start the data bucket
|
||||||
|
$data = [];
|
||||||
|
// only load the change if there is any
|
||||||
|
$data['change'] = $this->model->getChange($this->cost, $this->payment);
|
||||||
|
// if we still have from values we load them back
|
||||||
|
$data['form'] = $this->model->getFormValues();
|
||||||
|
// add any messages we may have in the model
|
||||||
|
$data['messages_queue'] = $this->model->getMessageQueue();
|
||||||
|
|
||||||
|
// now set the data
|
||||||
|
$this->setData($data);
|
||||||
|
|
||||||
|
return parent::render();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to set the cost
|
||||||
|
*
|
||||||
|
* @param float $cost The cost amount
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setCost(float $cost)
|
||||||
|
{
|
||||||
|
$this->cost = $cost;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method to set the payment
|
||||||
|
*
|
||||||
|
* @param float $payment The payment amount
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setPayment(float $payment)
|
||||||
|
{
|
||||||
|
$this->payment = $payment;
|
||||||
|
}
|
||||||
|
}
|
@ -1,79 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\View;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use Sport\Stars\Model\EditModel;
|
|
||||||
use Joomla\Renderer\RendererInterface;
|
|
||||||
use Joomla\View\HtmlView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Page HTML view class for the application
|
|
||||||
*/
|
|
||||||
class EditHtmlView extends HtmlView
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The active item
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
private $id = 0;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The model object.
|
|
||||||
*
|
|
||||||
* @var EditModel
|
|
||||||
*/
|
|
||||||
private $model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate the view.
|
|
||||||
*
|
|
||||||
* @param EditModel $model The page model object.
|
|
||||||
* @param RendererInterface $renderer The renderer object.
|
|
||||||
*/
|
|
||||||
public function __construct(EditModel $model, RendererInterface $renderer)
|
|
||||||
{
|
|
||||||
parent::__construct($renderer);
|
|
||||||
|
|
||||||
$this->model = $model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method to render the view
|
|
||||||
*
|
|
||||||
* @return string The rendered view
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function render()
|
|
||||||
{
|
|
||||||
$this->setData(
|
|
||||||
[
|
|
||||||
'form' => $this->model->getItem($this->id),
|
|
||||||
'messages_queue' => $this->model->getMessageQueue()
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
return parent::render();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the active item
|
|
||||||
*
|
|
||||||
* @param string $id The active item
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function setActiveItem(int $id): void
|
|
||||||
{
|
|
||||||
$this->id = $id;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,68 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* @package Sport Stars
|
|
||||||
*
|
|
||||||
* @created 19th April 2022
|
|
||||||
* @author Llewellyn van der Merwe <https://git.vdm.dev/Llewellyn>
|
|
||||||
* @git WEBD-325-45 <https://git.vdm.dev/Llewellyn/WEBD-325-45>
|
|
||||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Sport\Stars\View;
|
|
||||||
|
|
||||||
use Sport\Stars\Model\EditModel;
|
|
||||||
use Sport\Stars\Model\TableModel;
|
|
||||||
use Joomla\Renderer\RendererInterface;
|
|
||||||
use Joomla\View\HtmlView;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Page HTML view class for the application
|
|
||||||
*/
|
|
||||||
class TableHtmlView extends HtmlView
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The edit model object.
|
|
||||||
*
|
|
||||||
* @var EditModel
|
|
||||||
*/
|
|
||||||
private $model;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The table model object.
|
|
||||||
*
|
|
||||||
* @var TableModel
|
|
||||||
*/
|
|
||||||
private $tableModel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiate the view.
|
|
||||||
*
|
|
||||||
* @param EditModel $model The edit model object.
|
|
||||||
* @param TableModel $tableModel The table model object.
|
|
||||||
* @param RendererInterface $renderer The renderer object.
|
|
||||||
*/
|
|
||||||
public function __construct(EditModel $model, TableModel $tableModel, RendererInterface $renderer)
|
|
||||||
{
|
|
||||||
parent::__construct($renderer);
|
|
||||||
|
|
||||||
$this->tableModel = $tableModel;
|
|
||||||
$this->model = $model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method to render the view
|
|
||||||
*
|
|
||||||
* @return string The rendered view
|
|
||||||
*/
|
|
||||||
public function render()
|
|
||||||
{
|
|
||||||
$this->setData(
|
|
||||||
[
|
|
||||||
'list' => $this->tableModel->getTable(),
|
|
||||||
'messages_queue' => $this->model->getMessageQueue()
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
return parent::render();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
# If the Joomla site is installed within a folder
|
|
||||||
# eg www.example.com/joomla/ then the robots.txt file
|
|
||||||
# MUST be moved to the site root
|
|
||||||
# eg www.example.com/robots.txt
|
|
||||||
# AND the joomla folder name MUST be prefixed to all of the
|
|
||||||
# paths.
|
|
||||||
# eg the Disallow rule for the /administrator/ folder MUST
|
|
||||||
# be changed to read
|
|
||||||
# Disallow: /joomla/administrator/
|
|
||||||
#
|
|
||||||
# For more information about the robots.txt standard, see:
|
|
||||||
# https://www.robotstxt.org/orig.html
|
|
||||||
|
|
||||||
User-agent: *
|
|
||||||
Disallow: /administrator/
|
|
||||||
Disallow: /bin/
|
|
||||||
Disallow: /cache/
|
|
||||||
Disallow: /cli/
|
|
||||||
Disallow: /components/
|
|
||||||
Disallow: /includes/
|
|
||||||
Disallow: /installation/
|
|
||||||
Disallow: /language/
|
|
||||||
Disallow: /layouts/
|
|
||||||
Disallow: /libraries/
|
|
||||||
Disallow: /logs/
|
|
||||||
Disallow: /modules/
|
|
||||||
Disallow: /plugins/
|
|
||||||
Disallow: /tmp/
|
|
@ -1 +0,0 @@
|
|||||||
<!DOCTYPE html><title></title>
|
|
@ -1,18 +0,0 @@
|
|||||||
--
|
|
||||||
-- DATABASE STRUCTURE FOR SPORT STARS
|
|
||||||
--
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Table structure for table `homework_sportstars`
|
|
||||||
--
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS `homework_sportstars` (
|
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
|
||||||
`name` varchar(100) NOT NULL COMMENT 'The star name.',
|
|
||||||
`age` int(3) NOT NULL DEFAULT 0 COMMENT 'The star age.',
|
|
||||||
`sport` varchar(100) NOT NULL COMMENT 'The star sport name.',
|
|
||||||
PRIMARY KEY (`id`),
|
|
||||||
KEY `idx_name` (`name`(100)),
|
|
||||||
KEY `idx_age` (`age`),
|
|
||||||
KEY `idx_sport` (`sport`(100))
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=0;
|
|
79
week-05/homework/templates/calculator.twig
Normal file
79
week-05/homework/templates/calculator.twig
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
{% extends "index.twig" %}
|
||||||
|
|
||||||
|
{% block title %}Change Calculator{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="uk-container uk-margin">
|
||||||
|
<h1 class="uk-article-title">Change Calculator</h1>
|
||||||
|
{{ block("messages_queue", "message_queue.twig") }}
|
||||||
|
<form class="uk-form-stacked" action="{{ route() }}" method="post">
|
||||||
|
<div class="uk-child-width-1-2 uk-margin" uk-grid>
|
||||||
|
<div>
|
||||||
|
<label class="uk-form-label">Transaction Cost</label>
|
||||||
|
<div class="uk-form-controls">
|
||||||
|
<input name="cost" class="uk-input uk-width-1-1" type="text" placeholder="Add the cost here..." value="{{ form.cost|default('') }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<label class="uk-form-label">Payment Received</label>
|
||||||
|
<div class="uk-form-controls">
|
||||||
|
<input name="payment" class="uk-input uk-width-1-1" type="text" placeholder="Add the exact amount of money that the customer handed over to pay..." value="{{ form.payment|default('') }}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="submit" class="uk-button uk-button-primary uk-width-1-1" value="Calculate"/>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% if change %}
|
||||||
|
<div class="uk-container uk-margin">
|
||||||
|
<h1 class="uk-article-title">Here is your change</h1>
|
||||||
|
<div class="uk-alert-success" uk-alert>
|
||||||
|
<h3>Your last transaction</h3>
|
||||||
|
<dl class="uk-description-list">
|
||||||
|
<dt>Cost:</dt>
|
||||||
|
<dd>{{ change.cost|format_currency('USD') }}</dd>
|
||||||
|
<dt>Payment:</dt>
|
||||||
|
<dd>{{ change.payment|format_currency('USD') }}</dd>
|
||||||
|
{% if change.result.change %}
|
||||||
|
<dt>Change:</dt>
|
||||||
|
<dd>{{ change.result.change|format_currency('USD') }}</dd>
|
||||||
|
{% endif %}
|
||||||
|
</dl>
|
||||||
|
{% if change.result.breakdown %}
|
||||||
|
<p>The cashier should return {{ change.result.change|format_currency('USD') }} to the customer as
|
||||||
|
{% for denomination in change.result.breakdown %}{{ denomination.spacer }}{{ denomination.number_name }} {{ denomination.name }}{% endfor %}
|
||||||
|
</p>
|
||||||
|
{% else %}
|
||||||
|
There has been an error, please try again.
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if change.result.breakdown %}
|
||||||
|
<table class="uk-table uk-table-small uk-table-divider uk-table-responsive">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Denomination</th>
|
||||||
|
<th class="uk-table-shrink">Number</th>
|
||||||
|
<th class="uk-table-shrink">Total</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for denomination in change.result.breakdown %}
|
||||||
|
<tr>
|
||||||
|
<td>{{ denomination.value|format_currency('USD') }}</td>
|
||||||
|
<td>{{ denomination.number }}</td>
|
||||||
|
<td>{{ denomination.total|format_currency('USD') }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td >Total:</td>
|
||||||
|
<td>{{ change.result.change|format_currency('USD') }}</td>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
@ -1,49 +0,0 @@
|
|||||||
{% extends "index.twig" %}
|
|
||||||
|
|
||||||
{% block title %}Athlete{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="uk-container uk-margin">
|
|
||||||
<h1 class="uk-article-title">Athlete</h1>
|
|
||||||
{{ block("messages_queue", "message_queue.twig") }}
|
|
||||||
<form class="uk-form-stacked" action="{{ route() }}edit{{ form.post_key|default('') }}" method="post">
|
|
||||||
<div class="uk-button-group uk-width-1-1 uk-margin">
|
|
||||||
<input type="submit" class="uk-button uk-button-primary uk-width-1-2" value="Save"/>
|
|
||||||
<a href="{{ route() }}" type="button" class="uk-button uk-button-danger uk-width-1-2">Close</a>
|
|
||||||
</div>
|
|
||||||
<div class="uk-child-width-1-2 uk-margin" uk-grid>
|
|
||||||
<div>
|
|
||||||
<label class="uk-form-label">Name</label>
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
<input name="name" class="uk-input uk-width-1-1" type="text" placeholder="Add the name here..." value="{{ form.name|default('') }}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="uk-form-label">Age</label>
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
<input name="age" class="uk-input uk-width-1-1" type="text" placeholder="Your age..." value="{{ form.age|default('') }}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label class="uk-form-label">Sport</label>
|
|
||||||
<div class="uk-form-controls">
|
|
||||||
<input name="sport" class="uk-input uk-width-1-1" type="text" placeholder="Your sport name..." value="{{ form.sport|default('') }}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="hidden" name="item_id" value="{{ form.id|default(0) }}">
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
ClassicEditor.create(document.querySelector(`#item-text`), {
|
|
||||||
toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote' ],
|
|
||||||
heading: {
|
|
||||||
options: [
|
|
||||||
{ model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' },
|
|
||||||
{ model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' },
|
|
||||||
{ model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}).catch(error => { console.error(error);});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{% block bodyNavigation %}{% endblock %}
|
{% block bodyNavigation %}{% endblock %}
|
||||||
|
|
||||||
{% block title %}Sport Stars Error{% endblock %}
|
{% block title %}Change Calculator Error{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="uk-container uk-margin">
|
<div class="uk-container uk-margin">
|
||||||
@ -11,7 +11,7 @@
|
|||||||
<p class="lead">Sorry, we couldn't find the page matching your request. Try using the navigation to find what you were looking for?</p>
|
<p class="lead">Sorry, we couldn't find the page matching your request. Try using the navigation to find what you were looking for?</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
<h2>Ouch, That's an Error</h2>
|
<h2>Ouch, That's an Error</h2>
|
||||||
<p class="lead">Well this is embarrassing, seems there was an error processing this request. Perhaps try again? Or <a href="https://github.com/sportstars/crm/issues/new?title=[FW Site]&body=Please state the nature of your development emergency">file an issue</a> so we can address it.</p>
|
<p class="lead">Well this is embarrassing, seems there was an error processing this request. Perhaps try again? Or <a href="https://github.com/changecalculator/crm/issues/new?title=[FW Site]&body=Please state the nature of your development emergency">file an issue</a> so we can address it.</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if appDebug %}
|
{% if appDebug %}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="uk-section uk-section-primary">
|
<div class="uk-section uk-section-primary">
|
||||||
<div class="uk-container uk-container-small">
|
<div class="uk-container uk-container-small">
|
||||||
<div class="uk-text-center uk-card-body">
|
<div class="uk-text-center uk-card-body">
|
||||||
<small>Copyright © Sport Stars. All Rights Reserved.</small>
|
<small>Copyright © Change Calculator. All Rights Reserved.</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -17,18 +17,18 @@
|
|||||||
<!-- End for Responsive -->
|
<!-- End for Responsive -->
|
||||||
|
|
||||||
<!-- For SEO -->
|
<!-- For SEO -->
|
||||||
<title>{% block title %}Sport Stars!{% endblock %}</title>
|
<title>{% block title %}Change Calculator!{% endblock %}</title>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="description" content="{% block metaDescription %}The Sport Stars!{% endblock %}">
|
<meta name="description" content="{% block metaDescription %}The Change Calculator!{% endblock %}">
|
||||||
<meta name="generator" content="Sport Stars!" />
|
<meta name="generator" content="Change Calculator!" />
|
||||||
<meta property="og:description" content="{{ block('metaDescription') }}" />
|
<meta property="og:description" content="{{ block('metaDescription') }}" />
|
||||||
<meta property="og:locale" content="en_US" />
|
<meta property="og:locale" content="en_US" />
|
||||||
<meta property="og:site_name" content="Sport Stars!" />
|
<meta property="og:site_name" content="Change Calculator!" />
|
||||||
<meta property="og:title" content="{{ block('title') }}" />
|
<meta property="og:title" content="{{ block('title') }}" />
|
||||||
<meta property="og:type" content="{% block metaOgType %}website{% endblock %}" />
|
<meta property="og:type" content="{% block metaOgType %}website{% endblock %}" />
|
||||||
<meta property="og:url" content="{{ request_uri() }}" />
|
<meta property="og:url" content="{{ request_uri() }}" />
|
||||||
<meta name="twitter:card" content="summary" />
|
<meta name="twitter:card" content="summary" />
|
||||||
<meta name="twitter:site" content="@SportStars" />
|
<meta name="twitter:site" content="@ChangeCalculator" />
|
||||||
<meta name="twitter:description" content="{{ block('metaDescription') }}" />
|
<meta name="twitter:description" content="{{ block('metaDescription') }}" />
|
||||||
<meta name="twitter:title" content="{{ block('title') }}" />
|
<meta name="twitter:title" content="{{ block('title') }}" />
|
||||||
{% block metadata %}{% endblock %}
|
{% block metadata %}{% endblock %}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<meta http-equiv="Content-Language" content="en-GB">
|
<meta http-equiv="Content-Language" content="en-GB">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Sport Stars: Environment Setup Incomplete</title><!-- Sets the page title, IMPORTANT DO NOT REMOVE -->
|
<title>Change Calculator: Environment Setup Incomplete</title><!-- Sets the page title, IMPORTANT DO NOT REMOVE -->
|
||||||
<style>html{background:#ee2a00;background:radial-gradient(ellipse at center,#f1f1f1 0,#ee2a00 100%);background-attachment:fixed;background-repeat:no-repeat}body{background-color:transparent;color:#555;font:14px/18px sans-serif}body,ol,ul{margin:0;padding:0}ol,ul{list-style:none}a{color:#0084b4;text-decoration:none}a:focus,a:hover{text-decoration:underline}p a{line-height:inherit}.container{align-items:center;display:flex;flex-direction:column;height:100vh;justify-content:center;margin:0 auto;overflow:hidden;position:relative;width:100%}.alert-main{background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,.05);display:block;margin:0 20px;padding:20px 60px;position:relative}svg{bottom:-120px;position:absolute;right:-70px;-webkit-transform:rotate(10deg);transform:rotate(10deg);width:400px;z-index:-1}h1,p{text-rendering:optimizeLegibility;position:relative;text-align:center;z-index:10}h1{font-size:40px;font-weight:200;line-height:1;margin:18px 0 0;text-shadow:0 1px 2px rgba(0,0,0,.2)}label,p{color:#777;font-size:18px;font-weight:300;line-height:25px;margin:10px 0 20px}p a{color:#1c3d5c;font-weight:700}.link-help{background-color:#f5f5f5;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;font-size:1rem;font-weight:400;padding:.4rem .85rem;text-decoration:none}.link-help:hover{background-color:#eee;text-decoration:none}.footer{font-size:11px;margin:8px 20px;text-align:left}.footer ul{margin-bottom:5px}.footer li{display:inline;line-height:20px;margin:0 5px}.footer a,.footer li{color:#1c3d5c}.footer a:hover{color:#59b0ff}.links{display:block;font-size:1rem;margin-left:auto;margin-right:auto;margin-top:4rem;text-align:center}.links li{display:inline-block;margin-top:20px}@media screen and (max-width:480px){.container{height:auto;padding-bottom:20px;padding-top:20px}h1{font-size:30px}.link-help{white-space:nowrap}}</style><!-- Sets the page styling, IMPORTANT DO NOT REMOVE -->
|
<style>html{background:#ee2a00;background:radial-gradient(ellipse at center,#f1f1f1 0,#ee2a00 100%);background-attachment:fixed;background-repeat:no-repeat}body{background-color:transparent;color:#555;font:14px/18px sans-serif}body,ol,ul{margin:0;padding:0}ol,ul{list-style:none}a{color:#0084b4;text-decoration:none}a:focus,a:hover{text-decoration:underline}p a{line-height:inherit}.container{align-items:center;display:flex;flex-direction:column;height:100vh;justify-content:center;margin:0 auto;overflow:hidden;position:relative;width:100%}.alert-main{background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,.05);display:block;margin:0 20px;padding:20px 60px;position:relative}svg{bottom:-120px;position:absolute;right:-70px;-webkit-transform:rotate(10deg);transform:rotate(10deg);width:400px;z-index:-1}h1,p{text-rendering:optimizeLegibility;position:relative;text-align:center;z-index:10}h1{font-size:40px;font-weight:200;line-height:1;margin:18px 0 0;text-shadow:0 1px 2px rgba(0,0,0,.2)}label,p{color:#777;font-size:18px;font-weight:300;line-height:25px;margin:10px 0 20px}p a{color:#1c3d5c;font-weight:700}.link-help{background-color:#f5f5f5;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;font-size:1rem;font-weight:400;padding:.4rem .85rem;text-decoration:none}.link-help:hover{background-color:#eee;text-decoration:none}.footer{font-size:11px;margin:8px 20px;text-align:left}.footer ul{margin-bottom:5px}.footer li{display:inline;line-height:20px;margin:0 5px}.footer a,.footer li{color:#1c3d5c}.footer a:hover{color:#59b0ff}.links{display:block;font-size:1rem;margin-left:auto;margin-right:auto;margin-top:4rem;text-align:center}.links li{display:inline-block;margin-top:20px}@media screen and (max-width:480px){.container{height:auto;padding-bottom:20px;padding-top:20px}h1{font-size:30px}.link-help{white-space:nowrap}}</style><!-- Sets the page styling, IMPORTANT DO NOT REMOVE -->
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -12,19 +12,19 @@
|
|||||||
<div class="container-main">
|
<div class="container-main">
|
||||||
<div class="alert-main">
|
<div class="alert-main">
|
||||||
<h1 id="headerText">Environment Setup Incomplete</h1>
|
<h1 id="headerText">Environment Setup Incomplete</h1>
|
||||||
<p><span id="descText1">It looks like you are trying to run Sport Stars! from our git repository. To do so requires you complete a couple of extra steps first.</span></p>
|
<p><span id="descText1">It looks like you are trying to run Change Calculator! from our git repository. To do so requires you complete a couple of extra steps first.</span></p>
|
||||||
<p style="text-align: left;">
|
<p style="text-align: left;">
|
||||||
0. Make sure you have <a href="https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos">composer</a> installed on your system.
|
0. Make sure you have <a href="https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos">composer</a> installed on your system.
|
||||||
<br />
|
<br />
|
||||||
1. In your terminal go to the root folder of your Sport Stars website where you will find the <u>composer.json</u> file.
|
1. In your terminal go to the root folder of your Change Calculator website where you will find the <u>composer.json</u> file.
|
||||||
<br />
|
<br />
|
||||||
2. Run the following command <code>composer install</code> to install all PHP packages.
|
2. Run the following command <code>composer install</code> to install all PHP packages.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<ul class="links">
|
<ul class="links">
|
||||||
<li><a href="https://www.sportstars.org/">Sport Stars</a></li> -
|
<li><a href="https://www.changecalculator.org/">Change Calculator</a></li> -
|
||||||
<li><a href="https://git.vdm.dev/sportstars/">Help</a></li>
|
<li><a href="https://git.vdm.dev/changecalculator/">Help</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<meta http-equiv="Content-Language" content="en-GB">
|
<meta http-equiv="Content-Language" content="en-GB">
|
||||||
<meta name="robots" content="noindex, nofollow">
|
<meta name="robots" content="noindex, nofollow">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>Sport Stars: unsupported PHP version</title><!-- Sets the page title, IMPORTANT DO NOT REMOVE -->
|
<title>Change Calculator: unsupported PHP version</title><!-- Sets the page title, IMPORTANT DO NOT REMOVE -->
|
||||||
<style>html{background:#ee2a00;background:radial-gradient(ellipse at center,#f1f1f1 0,#ee2a00 100%);background-attachment:fixed;background-repeat:no-repeat}body{background-color:transparent;color:#555;font:14px/18px sans-serif}body,ol,ul{margin:0;padding:0}ol,ul{list-style:none}a{color:#0084b4;text-decoration:none}a:focus,a:hover{text-decoration:underline}p a{line-height:inherit}.container{align-items:center;display:flex;flex-direction:column;height:100vh;justify-content:center;margin:0 auto;overflow:hidden;position:relative;width:100%}.alert-main{background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,.05);display:block;margin:0 20px;padding:20px 60px;position:relative}svg{bottom:-120px;position:absolute;right:-70px;-webkit-transform:rotate(10deg);transform:rotate(10deg);width:400px;z-index:-1}h1,p{text-rendering:optimizeLegibility;position:relative;text-align:center;z-index:10}h1{font-size:40px;font-weight:200;line-height:1;margin:18px 0 0;text-shadow:0 1px 2px rgba(0,0,0,.2)}label,p{color:#777;font-size:18px;font-weight:300;line-height:25px;margin:10px 0 20px}p a{color:#1c3d5c;font-weight:700}.link-help{background-color:#f5f5f5;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;font-size:1rem;font-weight:400;padding:.4rem .85rem;text-decoration:none}.link-help:hover{background-color:#eee;text-decoration:none}.footer{font-size:11px;margin:8px 20px;text-align:left}.footer ul{margin-bottom:5px}.footer li{display:inline;line-height:20px;margin:0 5px}.footer a,.footer li{color:#1c3d5c}.footer a:hover{color:#59b0ff}.links{display:block;font-size:1rem;margin-left:auto;margin-right:auto;margin-top:4rem;text-align:center}.links li{display:inline-block;margin-top:20px}@media screen and (max-width:480px){.container{height:auto;padding-bottom:20px;padding-top:20px}h1{font-size:30px}.link-help{white-space:nowrap}}</style><!-- Sets the page styling, IMPORTANT DO NOT REMOVE -->
|
<style>html{background:#ee2a00;background:radial-gradient(ellipse at center,#f1f1f1 0,#ee2a00 100%);background-attachment:fixed;background-repeat:no-repeat}body{background-color:transparent;color:#555;font:14px/18px sans-serif}body,ol,ul{margin:0;padding:0}ol,ul{list-style:none}a{color:#0084b4;text-decoration:none}a:focus,a:hover{text-decoration:underline}p a{line-height:inherit}.container{align-items:center;display:flex;flex-direction:column;height:100vh;justify-content:center;margin:0 auto;overflow:hidden;position:relative;width:100%}.alert-main{background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,.05);display:block;margin:0 20px;padding:20px 60px;position:relative}svg{bottom:-120px;position:absolute;right:-70px;-webkit-transform:rotate(10deg);transform:rotate(10deg);width:400px;z-index:-1}h1,p{text-rendering:optimizeLegibility;position:relative;text-align:center;z-index:10}h1{font-size:40px;font-weight:200;line-height:1;margin:18px 0 0;text-shadow:0 1px 2px rgba(0,0,0,.2)}label,p{color:#777;font-size:18px;font-weight:300;line-height:25px;margin:10px 0 20px}p a{color:#1c3d5c;font-weight:700}.link-help{background-color:#f5f5f5;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;font-size:1rem;font-weight:400;padding:.4rem .85rem;text-decoration:none}.link-help:hover{background-color:#eee;text-decoration:none}.footer{font-size:11px;margin:8px 20px;text-align:left}.footer ul{margin-bottom:5px}.footer li{display:inline;line-height:20px;margin:0 5px}.footer a,.footer li{color:#1c3d5c}.footer a:hover{color:#59b0ff}.links{display:block;font-size:1rem;margin-left:auto;margin-right:auto;margin-top:4rem;text-align:center}.links li{display:inline-block;margin-top:20px}@media screen and (max-width:480px){.container{height:auto;padding-bottom:20px;padding-top:20px}h1{font-size:30px}.link-help{white-space:nowrap}}</style><!-- Sets the page styling, IMPORTANT DO NOT REMOVE -->
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@ -12,12 +12,12 @@
|
|||||||
<div class="container-main">
|
<div class="container-main">
|
||||||
<div class="alert-main">
|
<div class="alert-main">
|
||||||
<h1 id="headerText">Sorry, your PHP version is not supported</h1>
|
<h1 id="headerText">Sorry, your PHP version is not supported</h1>
|
||||||
<p><span id="descText1">Your host needs to use PHP version {{phpversion}} or newer to run this version of Sport Stars!</span></p>
|
<p><span id="descText1">Your host needs to use PHP version {{phpversion}} or newer to run this version of Change Calculator!</span></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<ul class="links">
|
<ul class="links">
|
||||||
<li><a href="https://www.sportstars.org/">Sport Stars</a></li> -
|
<li><a href="https://www.changecalculator.org/">Change Calculator</a></li> -
|
||||||
<li><a href="https://git.vdm.dev/sportstars/">Help</a></li>
|
<li><a href="https://git.vdm.dev/changecalculator/">Help</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="Content-Language" content="en-GB">
|
|
||||||
<meta name="robots" content="noindex, nofollow">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
<title>Sport Stars: Installation Instructions</title><!-- Sets the page title, IMPORTANT DO NOT REMOVE -->
|
|
||||||
<style>html{background:#ee2a00;background:radial-gradient(ellipse at center,#f1f1f1 0,#ee2a00 100%);background-attachment:fixed;background-repeat:no-repeat}body{background-color:transparent;color:#555;font:14px/18px sans-serif}body,ol,ul{margin:0;padding:0}ol,ul{list-style:none}a{color:#0084b4;text-decoration:none}a:focus,a:hover{text-decoration:underline}p a{line-height:inherit}.container{align-items:center;display:flex;flex-direction:column;height:100vh;justify-content:center;margin:0 auto;overflow:hidden;position:relative;width:100%}.alert-main{background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,.05);display:block;margin:0 20px;padding:20px 60px;position:relative}svg{bottom:-120px;position:absolute;right:-70px;-webkit-transform:rotate(10deg);transform:rotate(10deg);width:400px;z-index:-1}h1,p{text-rendering:optimizeLegibility;position:relative;text-align:center;z-index:10}h1{font-size:40px;font-weight:200;line-height:1;margin:18px 0 0;text-shadow:0 1px 2px rgba(0,0,0,.2)}label,p{color:#777;font-size:18px;font-weight:300;line-height:25px;margin:10px 0 20px}p a{color:#1c3d5c;font-weight:700}.link-help{background-color:#f5f5f5;border:1px solid rgba(0,0,0,.1);border-radius:.25rem;font-size:1rem;font-weight:400;padding:.4rem .85rem;text-decoration:none}.link-help:hover{background-color:#eee;text-decoration:none}.footer{font-size:11px;margin:8px 20px;text-align:left}.footer ul{margin-bottom:5px}.footer li{display:inline;line-height:20px;margin:0 5px}.footer a,.footer li{color:#1c3d5c}.footer a:hover{color:#59b0ff}.links{display:block;font-size:1rem;margin-left:auto;margin-right:auto;margin-top:4rem;text-align:center}.links li{display:inline-block;margin-top:20px}@media screen and (max-width:480px){.container{height:auto;padding-bottom:20px;padding-top:20px}h1{font-size:30px}.link-help{white-space:nowrap}}</style><!-- Sets the page styling, IMPORTANT DO NOT REMOVE -->
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
<div class="container-main">
|
|
||||||
<div class="alert-main">
|
|
||||||
<h1 id="headerText">Installation Instructions</h1>
|
|
||||||
<p><span id="descText1">You need to manually do the following few tasks.</span></p>
|
|
||||||
<p style="text-align: left;">
|
|
||||||
1. Import the SQL tables into your database found in <u>/sql/install.sql</u>
|
|
||||||
<br />
|
|
||||||
2. Copy the <u>/config.php.example</u> file to <u>/config.php</u>
|
|
||||||
<br />
|
|
||||||
3 .Update the <u>/config.php</u> to reflect your CMS details
|
|
||||||
<br />
|
|
||||||
4. Copy the /htaccess.txt file to /.htaccess
|
|
||||||
<br />
|
|
||||||
5. <b>Remove the /installation folder</b> from you root directory
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
<div class="footer">
|
|
||||||
<ul class="links">
|
|
||||||
<li><a href="https://www.sportstars.org/">Sport Stars</a></li> -
|
|
||||||
<li><a href="https://git.vdm.dev/sportstars/">Help</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- source: https://github.com/joomla/joomla-cms/blob/4.1-dev/templates/system/incompatible.html -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,54 +0,0 @@
|
|||||||
{% extends "index.twig" %}
|
|
||||||
|
|
||||||
{% block title %}Super Stars{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="uk-container uk-margin">
|
|
||||||
<h1 class="uk-article-title">Super Stars</h1>
|
|
||||||
{{ block("messages_queue", "message_queue.twig") }}
|
|
||||||
<a class="uk-button uk-button-default" href="{{ route() }}edit?task=create">Create</a>
|
|
||||||
{% if list %}
|
|
||||||
<table class="uk-table uk-table-justify uk-table-divider">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Name</th>
|
|
||||||
<th class="uk-width-small">Age</th>
|
|
||||||
<th>Sport</th>
|
|
||||||
<th>ID</th>
|
|
||||||
<th class="uk-width-small">Action</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for item in list %}
|
|
||||||
<tr>
|
|
||||||
<td>{{ item.name }}</td>
|
|
||||||
<td>{{ item.age }}</td>
|
|
||||||
<td>{{ item.sport }}</td>
|
|
||||||
<td>{{ item.id }}</td>
|
|
||||||
<td>
|
|
||||||
<div class="uk-button-group uk-width-1-1">
|
|
||||||
<a class="uk-button uk-button-default uk-button-small" href="{{ route() }}edit?id={{ item.id }}&task=edit">Edit</a>
|
|
||||||
<button class="uk-button uk-button-default uk-button-small" onclick="confirmDeletion('{{ item.name }}', {{ item.id }});">Delete</button>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<a class="uk-button uk-button-default" href="{{ route() }}edit?task=create">Create</a>
|
|
||||||
{% else %}
|
|
||||||
<div class="uk-alert-primary" uk-alert>
|
|
||||||
<p>There has no athletes been added, click create to add some.</p>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<script>
|
|
||||||
function confirmDeletion(name, id){
|
|
||||||
UIkit.modal.confirm('You are about to permanently delete <b>' + name + '</b>?').then(function () {
|
|
||||||
window.open("{{ route() }}edit?id=" + id + "&task=delete", "_self")
|
|
||||||
}, function () {
|
|
||||||
// we do nothing ;)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
@ -1,36 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<configuration>
|
|
||||||
<location path=".">
|
|
||||||
<system.webServer>
|
|
||||||
<directoryBrowse enabled="false" />
|
|
||||||
<rewrite>
|
|
||||||
<rules>
|
|
||||||
<rule name="Joomla! Rule 1" stopProcessing="true">
|
|
||||||
<match url="^(.*)$" ignoreCase="false" />
|
|
||||||
<conditions logicalGrouping="MatchAny">
|
|
||||||
<add input="{QUERY_STRING}" pattern="base64_encode[^(]*\([^)]*\)" ignoreCase="false" />
|
|
||||||
<add input="{QUERY_STRING}" pattern="(>|%3C)([^s]*s)+cript.*(<|%3E)" />
|
|
||||||
<add input="{QUERY_STRING}" pattern="GLOBALS(=|\[|\%[0-9A-Z]{0,2})" ignoreCase="false" />
|
|
||||||
<add input="{QUERY_STRING}" pattern="_REQUEST(=|\[|\%[0-9A-Z]{0,2})" ignoreCase="false" />
|
|
||||||
</conditions>
|
|
||||||
<action type="CustomResponse" url="index.php" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
|
|
||||||
</rule>
|
|
||||||
<rule name="Joomla! Rule 2">
|
|
||||||
<match url="(.*)" ignoreCase="false" />
|
|
||||||
<conditions logicalGrouping="MatchAll">
|
|
||||||
<add input="{URL}" pattern="^/index.php" ignoreCase="true" negate="true" />
|
|
||||||
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
|
|
||||||
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
|
|
||||||
</conditions>
|
|
||||||
<action type="Rewrite" url="index.php" />
|
|
||||||
</rule>
|
|
||||||
</rules>
|
|
||||||
</rewrite>
|
|
||||||
<httpProtocol>
|
|
||||||
<customHeaders>
|
|
||||||
<add name="X-Content-Type-Options" value="nosniff" />
|
|
||||||
</customHeaders>
|
|
||||||
</httpProtocol>
|
|
||||||
</system.webServer>
|
|
||||||
</location>
|
|
||||||
</configuration>
|
|
Loading…
x
Reference in New Issue
Block a user