diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eec1041021..b85c8c8fb0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,9 @@ name: CI on: - push: ~ + push: + branches: + - master pull_request: ~ workflow_dispatch: ~ diff --git a/src/Backend/Core/Engine/Authentication.php b/src/Backend/Core/Engine/Authentication.php index 8a0a5c2be2..7ec2aeacd8 100644 --- a/src/Backend/Core/Engine/Authentication.php +++ b/src/Backend/Core/Engine/Authentication.php @@ -9,6 +9,7 @@ use DateTime; use DateTimeZone; use RuntimeException; +use function Symfony\Component\String\s; /** * The class below will handle all authentication stuff. It will handle module-access, action-access, ... @@ -170,7 +171,7 @@ public static function isAllowedAction(?string $action = null, ?string $module = // The url should only be taken from the container if the action and or module isn't set // This way we can use the command also in the a console command $action = $action ?: BackendModel::get('url')->getAction(); - $module = \SpoonFilter::toCamelCase($module ?: BackendModel::get('url')->getModule()); + $module = s($module ?: BackendModel::get('url')->getModule())->camel()->title()->toString(); // is this action an action that doesn't require authentication? if (isset($alwaysAllowed[$module][$action])) { @@ -220,7 +221,7 @@ public static function isAllowedModule(string $module): bool { $modules = BackendModel::getModules(); $alwaysAllowed = array_keys(self::getAlwaysAllowed()); - $module = \SpoonFilter::toCamelCase($module); + $module = s($module)->camel()->title()->toString(); // is this module a module that doesn't require user level authentication? if (in_array($module, $alwaysAllowed, true)) { diff --git a/src/Backend/Core/Engine/Base/Action.php b/src/Backend/Core/Engine/Base/Action.php index 853c73dbb3..31587d5a52 100644 --- a/src/Backend/Core/Engine/Base/Action.php +++ b/src/Backend/Core/Engine/Base/Action.php @@ -2,17 +2,18 @@ namespace Backend\Core\Engine\Base; +use Backend\Core\Engine\Header; +use Backend\Core\Engine\Model as BackendModel; +use Backend\Core\Engine\Url; use Backend\Core\Engine\TwigTemplate; +use Backend\Core\Language\Language as BL; use Common\Exception\RedirectException; use ForkCMS\App\KernelLoader; use Symfony\Component\Form\Form; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; -use Backend\Core\Engine\Header; -use Backend\Core\Language\Language as BL; -use Backend\Core\Engine\Model as BackendModel; -use Backend\Core\Engine\Url; +use function Symfony\Component\String\s; /** * This class implements a lot of functionality that can be extended by a specific action @@ -171,7 +172,9 @@ public function execute(): void $this->template->assign('report', true); // camelcase the string - $messageName = strip_tags(\SpoonFilter::toCamelCase($this->getRequest()->query->get('report'), '-')); + $messageName = strip_tags( + s($this->getRequest()->query->get('report'))->replace('-', ' ')->camel()->title()->toString() + ); // if we have data to use it will be passed as the var parameter if (!empty($var)) { @@ -189,7 +192,9 @@ public function execute(): void // is there an error to show? if ($this->getRequest()->query->get('error', '') !== '') { // camelcase the string - $errorName = strip_tags(\SpoonFilter::toCamelCase($this->getRequest()->query->get('error'), '-')); + $errorName = strip_tags( + s($this->getRequest()->query->get('error'))->replace('-', ' ')->camel()->title()->toString() + ); // if we have data to use it will be passed as the var parameter if (!empty($var)) { diff --git a/src/Backend/Core/Engine/Base/Widget.php b/src/Backend/Core/Engine/Base/Widget.php index 09da4ee5be..883a641aad 100644 --- a/src/Backend/Core/Engine/Base/Widget.php +++ b/src/Backend/Core/Engine/Base/Widget.php @@ -129,8 +129,7 @@ public function isAllowed(): bool */ protected function setColumn(string $column): void { - $allowedColumns = ['left', 'middle', 'right']; - $this->column = \SpoonFilter::getValue($column, $allowedColumns, 'left'); + $this->column = in_array($column, ['left', 'middle', 'right'], true) ? $column : 'left'; } protected function setPosition(int $position): void diff --git a/src/Backend/Core/Engine/DataGrid.php b/src/Backend/Core/Engine/DataGrid.php index 0942fc0876..1e7495c89b 100644 --- a/src/Backend/Core/Engine/DataGrid.php +++ b/src/Backend/Core/Engine/DataGrid.php @@ -5,8 +5,8 @@ use Backend\Core\Engine\Model as BackendModel; use Backend\Core\Language\Language as BackendLanguage; use SpoonDatagridSource; -use SpoonFilter; use SpoonFormDropdown; +use function Symfony\Component\String\s; /** * This is our extended version of \SpoonDataGrid @@ -74,7 +74,7 @@ public function __construct(SpoonDatagridSource $source) // set default label $this->setHeaderLabels( - [$column => SpoonFilter::ucfirst(BackendLanguage::lbl(SpoonFilter::toCamelCase($column)))] + [$column => s(BackendLanguage::lbl(s($column)->replace('_', ' ')->camel()->title()->toString()))->title()->toString()] ); } @@ -120,7 +120,7 @@ public function addColumn( $value = '' . ($icon ? ' ' : '') . - SpoonFilter::ucfirst($value) . + s($value)->title() . ''; // reset URL @@ -132,7 +132,7 @@ public function addColumn( $value = '' . ($icon ? ' ' : '') . - SpoonFilter::ucfirst($value) . + s($value)->title() . ''; // reset URL @@ -162,7 +162,7 @@ public function addColumn( // add special attributes for actions we know $this->setColumnAttributes( $name, - ['class' => 'fork-data-grid-action action' . SpoonFilter::toCamelCase($name)] + ['class' => 'fork-data-grid-action action' . s($name)->replace('_', ' ')->camel()->title()] ); } @@ -221,7 +221,7 @@ public function addColumnAction( $this->setColumnAttributes( $name, [ - 'class' => 'fork-data-grid-action action' . SpoonFilter::toCamelCase($name), + 'class' => 'fork-data-grid-action action' . s($name)->replace('_', ' ')->camel()->title(), 'style' => 'width: 10%;', ] ); @@ -404,7 +404,7 @@ public function setColumnConfirm($column, $message, $custom = null, $title = nul // set title if there wasn't one provided if ($title === null) { - $title = SpoonFilter::ucfirst(BackendLanguage::lbl('Delete') . '?'); + $title = s(BackendLanguage::lbl('Delete') . '?')->title()->toString(); } // grab current value @@ -492,11 +492,11 @@ public function setMassAction(SpoonFormDropdown $actionDropDown): void // build HTML $HTML = '' . $actionDropDown->parse() . ''; // assign parsed html diff --git a/src/Backend/Core/Engine/DataGridFunctions.php b/src/Backend/Core/Engine/DataGridFunctions.php index 10bceb044a..a586396024 100644 --- a/src/Backend/Core/Engine/DataGridFunctions.php +++ b/src/Backend/Core/Engine/DataGridFunctions.php @@ -5,7 +5,7 @@ use Backend\Core\Engine\Model as BackendModel; use Backend\Core\Language\Language as BackendLanguage; use SpoonDate; -use SpoonFilter; +use function Symfony\Component\String\s; /** * A set of commonly used functions that will be applied on rows or columns @@ -23,8 +23,11 @@ class DataGridFunctions */ public static function cleanupPlainText(string $var): string { - // detect links - $var = SpoonFilter::replaceURLsWithAnchors($var); + // replace links with a tags + $var = s($var)->replaceMatches( + '~(https?://[^\s]+)~', + '$1' + )->toString(); // replace newlines $var = str_replace("\r", '', $var); @@ -295,7 +298,7 @@ public static function truncate(string $string, int $length, bool $useHellip = t // less characters if (mb_strlen($string) <= $length) { - return SpoonFilter::htmlspecialchars($string); + return htmlspecialchars($string); } // more characters @@ -312,7 +315,7 @@ public static function truncate(string $string, int $length, bool $useHellip = t $string .= '…'; } - return SpoonFilter::htmlspecialchars($string); + return htmlspecialchars($string); } /** diff --git a/src/Backend/Core/Engine/Form.php b/src/Backend/Core/Engine/Form.php index 4483814a38..321e3e101d 100644 --- a/src/Backend/Core/Engine/Form.php +++ b/src/Backend/Core/Engine/Form.php @@ -7,6 +7,7 @@ use SpoonFormFile; use SpoonFormTextarea; use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; +use function Symfony\Component\String\s; /** * This is our extended version of \SpoonForm @@ -31,7 +32,7 @@ public function __construct( $url = BackendModel::getContainer()->get('url'); parent::__construct( - $name ?? \SpoonFilter::toCamelCase($url->getModule() . '_' . $url->getAction(), '_', true), + $name ?? s($url->getModule() . ' ' . $url->getAction())->camel()->toString(), $action, $method ?? 'post', null, diff --git a/src/Backend/Core/Engine/FormFile.php b/src/Backend/Core/Engine/FormFile.php index 5413e153d8..000e802f19 100644 --- a/src/Backend/Core/Engine/FormFile.php +++ b/src/Backend/Core/Engine/FormFile.php @@ -2,8 +2,8 @@ namespace Backend\Core\Engine; -use SpoonFilter; use Backend\Core\Language\Language as BackendLanguage; +use function Symfony\Component\String\s; /** * This is our extended version of \SpoonFormFile @@ -72,9 +72,9 @@ public function parse($template = null): string // parse to template if ($template !== null) { - $template->assign('file' . SpoonFilter::toCamelCase($this->attributes['name']), $output); + $template->assign('file' . s($this->attributes['name'])->replace('_', ' ')->camel()->title(), $output); $template->assign( - 'file' . SpoonFilter::toCamelCase($this->attributes['name']) . 'Error', + 'file' . s($this->attributes['name'])->replace('_', ' ')->camel()->title() . 'Error', ($this->errors != '') ? '' . $this->errors . '' : '' ); } @@ -95,7 +95,7 @@ public function getErrors(): ?string $imageError = $_FILES[$this->getName()]['error']; if ($imageError === UPLOAD_ERR_INI_SIZE && empty($this->errors)) { $this->addError( - SpoonFilter::ucfirst(sprintf(BackendLanguage::err('FileTooBig'), Form::getUploadMaxFileSize())) + s(sprintf(BackendLanguage::err('FileTooBig'), Form::getUploadMaxFileSize()))->title()->toString() ); } } diff --git a/src/Backend/Core/Engine/FormImage.php b/src/Backend/Core/Engine/FormImage.php index bf283883fe..20e51499c0 100644 --- a/src/Backend/Core/Engine/FormImage.php +++ b/src/Backend/Core/Engine/FormImage.php @@ -3,10 +3,10 @@ namespace Backend\Core\Engine; use ForkCMS\Utility\Thumbnails; -use SpoonFilter; use SpoonFormImage; use Symfony\Component\Filesystem\Filesystem; use Backend\Core\Language\Language as BackendLanguage; +use function Symfony\Component\String\s; /** * This is our extended version of \SpoonFormFile @@ -82,7 +82,7 @@ public function getErrors(): ?string $imageError = $_FILES[$this->getName()]['error']; if ($imageError === UPLOAD_ERR_INI_SIZE && empty($this->errors)) { $this->addError( - SpoonFilter::ucfirst(sprintf(BackendLanguage::err('FileTooBig'), Form::getUploadMaxFileSize())) + s(sprintf(BackendLanguage::err('FileTooBig'), Form::getUploadMaxFileSize()))->title()->toString() ); } } @@ -137,9 +137,9 @@ public function parse($template = null): string // parse to template if ($template !== null) { - $template->assign('file' . SpoonFilter::toCamelCase($this->attributes['name']), $output); + $template->assign('file' . s($this->attributes['name'])->replace('_', ' ')->camel()->title(), $output); $template->assign( - 'file' . SpoonFilter::toCamelCase($this->attributes['name']) . 'Error', + 'file' . s($this->attributes['name'])->replace('_', ' ')->camel()->title() . 'Error', ($this->errors != '') ? '' . $this->errors . '' : '' ); } diff --git a/src/Backend/Core/Engine/Meta.php b/src/Backend/Core/Engine/Meta.php index 8a7d995148..af3680eb59 100644 --- a/src/Backend/Core/Engine/Meta.php +++ b/src/Backend/Core/Engine/Meta.php @@ -398,7 +398,7 @@ protected function loadForm(): void $this->form->addHidden('custom', $this->custom); $this->form->addHidden('class_name', $this->callback['class']); $this->form->addHidden('method_name', $this->callback['method']); - $this->form->addHidden('parameters', \SpoonFilter::htmlspecialchars(serialize($this->callback['parameters']))); + $this->form->addHidden('parameters', htmlspecialchars(serialize($this->callback['parameters']))); if (!empty($this->hreflangCallback)) { foreach (BackendLanguage::getActiveLanguages() as $language) { @@ -545,7 +545,7 @@ public function validate(): void // URL overwrite is checked if ($this->form->getField('url_overwrite')->isChecked()) { $this->form->getField('url')->isFilled(BackendLanguage::err('FieldIsRequired')); - $url = \SpoonFilter::htmlspecialcharsDecode($this->form->getField('url')->getValue()); + $url = htmlspecialchars_decode((string) $this->form->getField('url')->getValue()); $generatedUrl = $this->generateUrl($url); // check if urls are different @@ -583,15 +583,15 @@ public function validate(): void $this->data['title_overwrite'] = $this->form->getField('page_title_overwrite')->isChecked(); $this->data['url'] = $this->generateUrl( $this->form->getField('url_overwrite')->getActualValue( - \SpoonFilter::htmlspecialcharsDecode($this->form->getField('url')->getValue()), - \SpoonFilter::htmlspecialcharsDecode($this->form->getField($this->baseFieldName)->getValue()) + htmlspecialchars_decode((string) $this->form->getField('url')->getValue()), + htmlspecialchars_decode((string) $this->form->getField($this->baseFieldName)->getValue()) ) ); $this->data['url_overwrite'] = $this->form->getField('url_overwrite')->isChecked(); if ($this->form->getField('canonical_url_overwrite')->isChecked()) { $this->data['data']['canonical_url'] = $this->form->getField('canonical_url_overwrite')->getActualValue( - \SpoonFilter::htmlspecialcharsDecode($this->form->getField('canonical_url')->getValue()), + htmlspecialchars_decode((string) $this->form->getField('canonical_url')->getValue()), null ); $this->data['data']['canonical_url_overwrite'] = true; diff --git a/src/Backend/Core/Engine/Model.php b/src/Backend/Core/Engine/Model.php index 042f036181..464db45690 100644 --- a/src/Backend/Core/Engine/Model.php +++ b/src/Backend/Core/Engine/Model.php @@ -11,6 +11,7 @@ use Backend\Core\Engine\Model as BackendModel; use Frontend\Core\Language\Language as FrontendLanguage; use Backend\Core\Language\Language as BackendLanguage; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the backend. @@ -418,7 +419,7 @@ public static function getModulesForDropDown(): array // loop and add into the return-array (with correct label) foreach ($modules as $module) { - $dropDown[$module] = \SpoonFilter::ucfirst(BackendLanguage::lbl(\SpoonFilter::toCamelCase($module))); + $dropDown[$module] = s(BackendLanguage::lbl(s($module)->camel()->title()->toString()))->title()->toString(); } return $dropDown; @@ -606,7 +607,7 @@ public static function getUrlForBlock( // append action if ($action !== null) { - $url .= '/' . urldecode(FrontendLanguage::act(\SpoonFilter::toCamelCase($action))); + $url .= '/' . urldecode(FrontendLanguage::act(s($action)->camel()->title()->toString())); } // return the unique URL! @@ -628,7 +629,7 @@ public static function imageDelete( ?array $fileSizes = null ): void { if (empty($fileSizes)) { - $model = get_class_vars('Backend' . \SpoonFilter::toCamelCase($module) . 'Model'); + $model = get_class_vars('Backend' . s($module)->camel()->title() . 'Model'); $fileSizes = $model['fileSizes']; } diff --git a/src/Backend/Core/Engine/Navigation.php b/src/Backend/Core/Engine/Navigation.php index 355b4d97b1..ce02c88d9a 100644 --- a/src/Backend/Core/Engine/Navigation.php +++ b/src/Backend/Core/Engine/Navigation.php @@ -7,6 +7,7 @@ use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Pages\Engine\Model as BackendPagesModel; use Backend\Core\Language\Language as BackendLanguage; +use function Symfony\Component\String\s; final class Navigation extends KernelLoader { @@ -69,8 +70,8 @@ private function getNavigationItemForCurrentlyAuthenticatedUser(array $navigatio } [$module, $action] = explode('/', (string) $navigationItem['url']); - $module = \SpoonFilter::toCamelCase($module); - $action = \SpoonFilter::toCamelCase($action); + $module = s($module)->camel()->title()->toString(); + $action = s($action)->camel()->title()->toString(); if (Authentication::isAllowedModule($module) && Authentication::isAllowedAction($action, $module)) { return $navigationItem; diff --git a/src/Backend/Core/Engine/TemplateModifiers.php b/src/Backend/Core/Engine/TemplateModifiers.php index a76ced4704..1ef0510fe1 100644 --- a/src/Backend/Core/Engine/TemplateModifiers.php +++ b/src/Backend/Core/Engine/TemplateModifiers.php @@ -6,6 +6,7 @@ use Common\Core\Twig\Extensions\BaseTwigModifiers; use Backend\Core\Language\Language as BackendLanguage; use SpoonDate; +use function Symfony\Component\String\s; /** * This is our class with custom modifiers. @@ -166,7 +167,7 @@ public static function getUrl( */ public static function toLabel($value): string { - return \SpoonFilter::ucfirst(BackendLanguage::lbl(\SpoonFilter::toCamelCase($value, '_', false))); + return s(BackendLanguage::lbl(s($value)->replace('_', ' ')->camel()->title()))->title()->toString(); } /** diff --git a/src/Backend/Core/Engine/TwigTemplate.php b/src/Backend/Core/Engine/TwigTemplate.php index 871150f4c9..fd2ad0c2bf 100644 --- a/src/Backend/Core/Engine/TwigTemplate.php +++ b/src/Backend/Core/Engine/TwigTemplate.php @@ -18,6 +18,7 @@ use Twig\Extension\DebugExtension; use Twig\Loader\FilesystemLoader; use Twig\RuntimeLoader\FactoryRuntimeLoader; +use function Symfony\Component\String\s; /** * This is a twig template wrapper @@ -202,7 +203,7 @@ private function parseAuthenticatedUser(): void $settings = (array) Authentication::getUser()->getSettings(); foreach ($settings as $key => $setting) { - $this->assign('authenticatedUser' . \SpoonFilter::toCamelCase($key), $setting ?? ''); + $this->assign('authenticatedUser' . s($key)->camel()->title(), $setting ?? ''); } // check if this action is allowed @@ -232,10 +233,7 @@ private function parseAuthenticationSettingsForTheAuthenticatedUser(): void } $this->assign( - 'show' . \SpoonFilter::toCamelCase($module, '_') . \SpoonFilter::toCamelCase( - $action, - '_' - ), + 'show' . s($module . ' ' . $action)->camel()->title(), true ); } @@ -273,7 +271,7 @@ private function prefixArrayKeys(string $prefix, array $array): array { return array_combine( array_map( - fn($key) => $prefix . \SpoonFilter::ucfirst($key), + fn($key) => $prefix . s($key)->title()->toString(), array_keys($array) ), $array @@ -336,8 +334,8 @@ private function addBodyClassAndId(): void return; } - $this->assign('bodyID', \SpoonFilter::toCamelCase($url->getModule(), '_', true)); - $bodyClass = \SpoonFilter::toCamelCase($url->getModule() . '_' . $url->getAction(), '_', true); + $this->assign('bodyID', s($url->getModule())->replace('_', ' ')->camel()->toString()); + $bodyClass = s($url->getModule() . ' ' . $url->getAction())->camel()->toString(); if (in_array(mb_strtolower($url->getAction()), ['add', 'edit'], true)) { $bodyClass = $url->getModule() . 'AddEdit'; } diff --git a/src/Backend/Core/Engine/Url.php b/src/Backend/Core/Engine/Url.php index dab4498e9f..528cd67015 100644 --- a/src/Backend/Core/Engine/Url.php +++ b/src/Backend/Core/Engine/Url.php @@ -5,13 +5,14 @@ use Backend\Core\Config; use Backend\Core\Engine\Base\Config as BackendBaseConfig; use Backend\Core\Engine\Model as BackendModel; +use Backend\Core\Language\Language as BackendLanguage; use Common\Exception\RedirectException; use ForkCMS\App\KernelLoader; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; -use Backend\Core\Language\Language as BackendLanguage; +use function Symfony\Component\String\s; /** * This class will handle the incoming URL. @@ -95,14 +96,14 @@ private function getModuleFromRequest(): string return 'Dashboard'; } - return \SpoonFilter::toCamelCase($module); + return s($module)->camel()->title()->toString(); } private function getActionFromRequest(string $module, string $language): string { $action = BackendModel::getRequest()->attributes->get('action'); if (!empty($action)) { - return \SpoonFilter::toCamelCase($action); + return s($action)->camel()->title()->toString(); } return $this->getDefaultActionForModule($module, $language); @@ -199,7 +200,7 @@ private function processRegularRequest(string $module, string $action, string $l if (Authentication::isLoggedIn() && !Authentication::isAllowedModule($module)) { if ($module === 'Dashboard') { - $this->redirectToFistAvailableLink( + $this->redirectToFirstAvailableLink( $language, $this->getContainer()->get('cache.backend_navigation')->get() ); @@ -284,12 +285,12 @@ private function addQueryStringToUrl(string $url): string return $url . '?' . $queryString; } - private function redirectToFistAvailableLink(string $language, array $navigation): void + private function redirectToFirstAvailableLink(string $language, array $navigation): void { foreach ($navigation as $navigationItem) { [$module, $action] = explode('/', (string) $navigationItem['url']); - $module = \SpoonFilter::toCamelCase($module); - $action = \SpoonFilter::toCamelCase($action); + $module = s($module)->camel()->title()->toString(); + $action = s($action)->camel()->title()->toString(); if (Authentication::isAllowedModule($module) && Authentication::isAllowedAction($action, $module)) { $this->redirect( @@ -299,7 +300,7 @@ private function redirectToFistAvailableLink(string $language, array $navigation } if (array_key_exists('children', $navigationItem)) { - $this->redirectToFistAvailableLink($language, $navigationItem['children']); + $this->redirectToFirstAvailableLink($language, $navigationItem['children']); } } } @@ -362,7 +363,7 @@ private function setAction(string $action, ?string $module = null): void } // set property - $this->action = \SpoonFilter::toCamelCase($action); + $this->action = s($action)->camel()->title()->toString(); } private function setModule(string $module): void diff --git a/src/Backend/Core/Installer/CoreInstaller.php b/src/Backend/Core/Installer/CoreInstaller.php index 53f0cb76ab..3c40dbade8 100644 --- a/src/Backend/Core/Installer/CoreInstaller.php +++ b/src/Backend/Core/Installer/CoreInstaller.php @@ -63,7 +63,6 @@ private function configureDefaultSettings(): void $this->setSetting('Core', 'theme'); $this->setSetting('Core', 'google_maps_key', ''); $this->setSetting('Core', 'max_num_revisions', 20); - $this->setSetting('Core', 'site_domains', [$this->getVariable('site_domain')]); $this->setSetting('Core', 'site_html_head', ''); $this->setSetting('Core', 'site_html_end_of_body', ''); diff --git a/src/Backend/Core/Language/Language.php b/src/Backend/Core/Language/Language.php index 0e5d1e9915..4b05659221 100644 --- a/src/Backend/Core/Language/Language.php +++ b/src/Backend/Core/Language/Language.php @@ -6,6 +6,7 @@ use Backend\Modules\Locale\Engine\Model as BackendLocaleModel; use RuntimeException; use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; +use function Symfony\Component\String\s; /** * This class will store the language-dependant content for the Backend, it will also store the @@ -114,10 +115,10 @@ public static function getError(string $key, ?string $module = null): string { $module ??= self::getCurrentModule(); - $key = \SpoonFilter::toCamelCase($key); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // otherwise return the key in label-format - return self::$err[$module][$key] ?? self::$err['Core'][$key] ?? '{$err' . \SpoonFilter::toCamelCase($module) . $key . '}'; + return self::$err[$module][$key] ?? self::$err['Core'][$key] ?? '{$err' . s($module)->camel()->title() . $key . '}'; } public static function getErrors(): array @@ -154,11 +155,10 @@ public static function getInterfaceLanguages(): array public static function getLabel(string $key, ?string $module = null): string { $module ??= self::getCurrentModule(); - - $key = \SpoonFilter::toCamelCase($key); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // otherwise return the key in label-format - return self::$lbl[$module][$key] ?? self::$lbl['Core'][$key] ?? '{$lbl' . \SpoonFilter::toCamelCase($module) . $key . '}'; + return self::$lbl[$module][$key] ?? self::$lbl['Core'][$key] ?? '{$lbl' . s($module)->camel()->title() . $key . '}'; } public static function getLabels(): array @@ -168,11 +168,11 @@ public static function getLabels(): array public static function getMessage(string $key, ?string $module = null): string { - $key = \SpoonFilter::toCamelCase((string) $key); $module ??= self::getCurrentModule(); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // otherwise return the key in label-format - return self::$msg[$module][$key] ?? self::$msg['Core'][$key] ?? '{$msg' . \SpoonFilter::toCamelCase($module) . $key . '}'; + return self::$msg[$module][$key] ?? self::$msg['Core'][$key] ?? '{$msg' . s($module)->camel()->title() . $key . '}'; } public static function getMessages(): array diff --git a/src/Backend/Form/Type/MetaType.php b/src/Backend/Form/Type/MetaType.php index a53fd52932..5faf88f078 100644 --- a/src/Backend/Form/Type/MetaType.php +++ b/src/Backend/Form/Type/MetaType.php @@ -8,7 +8,6 @@ use Common\Doctrine\ValueObject\SEOFollow; use Common\Doctrine\ValueObject\SEOIndex; use Common\Form\CollectionType; -use SpoonFilter; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\CallbackTransformer; use Symfony\Component\Form\Exception\InvalidArgumentException; @@ -230,7 +229,7 @@ function ($fieldName) use ($metaForm, $defaultValue, &$metaData): void { ); $generatedUrl = $this->metaRepository->generateUrl( - SpoonFilter::htmlspecialcharsDecode($metaData['url']), + htmlspecialchars_decode((string) $metaData['url']), $metaForm->getConfig()->getOption('generate_url_callback_class'), $metaForm->getConfig()->getOption('generate_url_callback_method'), $metaForm->getConfig()->getOption('generate_url_callback_parameters') @@ -424,7 +423,7 @@ private static function stripNumberAddedByTheUrlGeneration(string $string): stri { $chunks = explode('-', $string); - if (!SpoonFilter::isNumeric(end($chunks))) { + if (!ctype_digit(end($chunks))) { return $string; } diff --git a/src/Backend/Init.php b/src/Backend/Init.php index f27fd57a1b..6ea6cfd251 100644 --- a/src/Backend/Init.php +++ b/src/Backend/Init.php @@ -2,7 +2,6 @@ namespace Backend; -use SpoonFilter; use Symfony\Component\HttpKernel\KernelInterface; /** diff --git a/src/Backend/Modules/Authentication/Actions/Index.php b/src/Backend/Modules/Authentication/Actions/Index.php index cae5138bf5..263dd5899b 100644 --- a/src/Backend/Modules/Authentication/Actions/Index.php +++ b/src/Backend/Modules/Authentication/Actions/Index.php @@ -12,6 +12,7 @@ use Common\Mailer\Message; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException; +use function Symfony\Component\String\s; /** * This is the index-action (default), it will display the login screen @@ -51,21 +52,18 @@ private function buildForm(): void $this->form = new BackendForm(null, null, 'post', true, false); $this->form ->addText('backend_email') - ->setAttribute('placeholder', \SpoonFilter::ucfirst(BL::lbl('Email'))) + ->setAttribute('placeholder', s(BL::lbl('Email'))->title()->toString()) ->setAttribute('type', 'email') - ->setAttribute('autocomplete', 'email') - ; + ->setAttribute('autocomplete', 'email'); $this->form ->addPassword('backend_password') - ->setAttribute('placeholder', \SpoonFilter::ucfirst(BL::lbl('Password'))) - ->setAttribute('autocomplete', 'current-password') - ; + ->setAttribute('placeholder', s(BL::lbl('Password'))->title()->toString()) + ->setAttribute('autocomplete', 'current-password'); $this->formForgotPassword = new BackendForm('forgotPassword'); $this->formForgotPassword ->addText('backend_email_forgot') - ->setAttribute('autocomplete', 'email') - ; + ->setAttribute('autocomplete', 'email'); } public function parse(): void @@ -214,9 +212,7 @@ private function validateForm(): void // send e-mail to user $from = $this->get('fork.settings')->get('Core', 'mailer_from'); $replyTo = $this->get('fork.settings')->get('Core', 'mailer_reply_to'); - $message = Message::newInstance( - \SpoonFilter::ucfirst(BL::msg('ResetYourPasswordMailSubject')) - ) + $message = Message::newInstance(s(BL::msg('ResetYourPasswordMailSubject'))->title()->toString()) ->setFrom([$from['email'] => $from['name']]) ->setTo([$email]) ->setReplyTo([$replyTo['email'] => $replyTo['name']]) diff --git a/src/Backend/Modules/Blog/Actions/Add.php b/src/Backend/Modules/Blog/Actions/Add.php index a485458f2b..59fd86ac19 100644 --- a/src/Backend/Modules/Blog/Actions/Add.php +++ b/src/Backend/Modules/Blog/Actions/Add.php @@ -13,6 +13,7 @@ use Backend\Modules\Search\Engine\Model as BackendSearchModel; use Backend\Modules\Tags\Engine\Model as BackendTagsModel; use Backend\Modules\Users\Engine\Model as BackendUsersModel; +use function Symfony\Component\String\s; /** * This is the add-action, it will display a form to create a new item @@ -49,7 +50,7 @@ private function loadForm(): void // get categories $categories = BackendBlogModel::getCategories(); - $categories['new_category'] = \SpoonFilter::ucfirst(BL::getLabel('AddCategory')); + $categories['new_category'] = s(BL::getLabel('AddCategory'))->title()->toString(); // create elements $this->form->addText('title', null, null, 'form-control title', 'form-control danger title')->makeRequired(); diff --git a/src/Backend/Modules/Blog/Actions/Categories.php b/src/Backend/Modules/Blog/Actions/Categories.php index 837b6f27ee..fecdb1388f 100644 --- a/src/Backend/Modules/Blog/Actions/Categories.php +++ b/src/Backend/Modules/Blog/Actions/Categories.php @@ -8,6 +8,7 @@ use Backend\Core\Engine\Model as BackendModel; use Backend\Core\Engine\DataGridDatabase as BackendDataGridDatabase; use Backend\Modules\Blog\Engine\Model as BackendBlogModel; +use function Symfony\Component\String\s; /** * This is the categories-action, it will display the overview of blog categories @@ -34,7 +35,7 @@ private function loadDataGrid(): void // set headers $this->dataGrid->setHeaderLabels([ - 'num_items' => \SpoonFilter::ucfirst(BL::lbl('Amount')), + 'num_items' => s(BL::lbl('Amount'))->title()->toString(), ]); // sorting columns diff --git a/src/Backend/Modules/Blog/Actions/Comments.php b/src/Backend/Modules/Blog/Actions/Comments.php index 002cbe2e89..f8a04581c2 100644 --- a/src/Backend/Modules/Blog/Actions/Comments.php +++ b/src/Backend/Modules/Blog/Actions/Comments.php @@ -9,6 +9,7 @@ use Backend\Core\Engine\DataGridDatabase as BackendDataGridDatabase; use Backend\Core\Engine\DataGridFunctions as BackendDataGridFunctions; use Backend\Modules\Blog\Engine\Model as BackendBlogModel; +use function Symfony\Component\String\s; /** * This is the comments-action , it will display the overview of blog comments @@ -75,8 +76,8 @@ private function loadDataGrids(): void // header labels $this->dgPublished->setHeaderLabels([ - 'created_on' => \SpoonFilter::ucfirst(BL::lbl('Date')), - 'text' => \SpoonFilter::ucfirst(BL::lbl('Comment')), + 'created_on' => s(BL::lbl('Date'))->title()->toString(), + 'text' => s(BL::lbl('Comment'))->title()->toString(), ]); // add the multicheckbox column @@ -171,8 +172,8 @@ private function loadDataGrids(): void // header labels $this->dgModeration->setHeaderLabels([ - 'created_on' => \SpoonFilter::ucfirst(BL::lbl('Date')), - 'text' => \SpoonFilter::ucfirst(BL::lbl('Comment')), + 'created_on' => s(BL::lbl('Date'))->title()->toString(), + 'text' => s(BL::lbl('Comment'))->title()->toString(), ]); // add the multicheckbox column @@ -265,8 +266,8 @@ private function loadDataGrids(): void // header labels $this->dgSpam->setHeaderLabels([ - 'created_on' => \SpoonFilter::ucfirst(BL::lbl('Date')), - 'text' => \SpoonFilter::ucfirst(BL::lbl('Comment')), + 'created_on' => s(BL::lbl('Date'))->title()->toString(), + 'text' => s(BL::lbl('Comment'))->title()->toString(), ]); // add the multicheckbox column diff --git a/src/Backend/Modules/Blog/Actions/Edit.php b/src/Backend/Modules/Blog/Actions/Edit.php index cac9b9bb89..a0a22feafc 100644 --- a/src/Backend/Modules/Blog/Actions/Edit.php +++ b/src/Backend/Modules/Blog/Actions/Edit.php @@ -18,6 +18,7 @@ use Backend\Modules\Search\Engine\Model as BackendSearchModel; use Backend\Modules\Tags\Engine\Model as BackendTagsModel; use Backend\Modules\Users\Engine\Model as BackendUsersModel; +use function Symfony\Component\String\s; /** * This is the edit-action, it will display a form to edit an existing item @@ -134,8 +135,8 @@ private function loadDraftDataGrid(): void // set headers $this->dgDrafts->setHeaderLabels([ - 'user_id' => \SpoonFilter::ucfirst(BL::lbl('By')), - 'edited_on' => \SpoonFilter::ucfirst(BL::lbl('LastEditedOn')), + 'user_id' => s(BL::lbl('By'))->title()->toString(), + 'edited_on' => s(BL::lbl('LastEditedOn'))->title()->toString(), ]); // set column-functions @@ -185,7 +186,7 @@ private function loadForm(): void // get categories $categories = BackendBlogModel::getCategories(); - $categories['new_category'] = \SpoonFilter::ucfirst(BL::getLabel('AddCategory')); + $categories['new_category'] = s(BL::getLabel('AddCategory'))->title()->toString(); // create elements $this->form->addText('title', $this->record['title'], null, 'form-control title', 'form-control danger title')->makeRequired(); @@ -237,8 +238,8 @@ private function loadRevisionDataGrid(): void // set headers $this->dgRevisions->setHeaderLabels([ - 'user_id' => \SpoonFilter::ucfirst(BL::lbl('By')), - 'edited_on' => \SpoonFilter::ucfirst(BL::lbl('LastEditedOn')), + 'user_id' => s(BL::lbl('By'))->title()->toString(), + 'edited_on' => s(BL::lbl('LastEditedOn'))->title()->toString(), ]); // set column-functions @@ -288,7 +289,7 @@ protected function parse(): void // assign the active record and additional variables $this->template->assign('item', $this->record); - $this->template->assign('status', BL::lbl(\SpoonFilter::ucfirst($this->record['status']))); + $this->template->assign('status', BL::lbl(s($this->record['status'])->title()->toString())); // assign revisions-datagrid $this->template->assign('revisions', ($this->dgRevisions->getNumResults() != 0) ? $this->dgRevisions->getContent() : false); diff --git a/src/Backend/Modules/Blog/Actions/EditComment.php b/src/Backend/Modules/Blog/Actions/EditComment.php index 654ecf5936..5067ffb464 100644 --- a/src/Backend/Modules/Blog/Actions/EditComment.php +++ b/src/Backend/Modules/Blog/Actions/EditComment.php @@ -8,6 +8,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Language\Language; use Backend\Modules\Blog\Engine\Model as BackendBlogModel; +use function Symfony\Component\String\s; /** * This is the edit-action, it will display a form to edit an existing item @@ -103,7 +104,7 @@ private function validateForm(): void $this->redirect( BackendModel::createUrlForAction('Comments') . '&report=edited-comment&id=' . $item['id'] . '&highlight=row-' . $item['id'] . '#tab' . - \SpoonFilter::toCamelCase($item['status']) + s($item['status'])->camel()->title() ); } } diff --git a/src/Backend/Modules/Blog/Actions/Index.php b/src/Backend/Modules/Blog/Actions/Index.php index 428f5e926e..18ef5459f3 100644 --- a/src/Backend/Modules/Blog/Actions/Index.php +++ b/src/Backend/Modules/Blog/Actions/Index.php @@ -10,6 +10,7 @@ use Backend\Core\Engine\DataGridDatabase as BackendDataGridDatabase; use Backend\Core\Engine\DataGridFunctions as BackendDataGridFunctions; use Backend\Modules\Blog\Engine\Model as BackendBlogModel; +use function Symfony\Component\String\s; /** * This is the index-action (default), it will display the overview of blog posts @@ -91,8 +92,8 @@ private function loadDataGridAllPosts(): void // set headers $this->dgPosts->setHeaderLabels( [ - 'user_id' => \SpoonFilter::ucfirst(BL::lbl('Author')), - 'publish_on' => \SpoonFilter::ucfirst(BL::lbl('PublishedOn')), + 'user_id' => s(BL::lbl('Author'))->title()->toString(), + 'publish_on' => s(BL::lbl('PublishedOn'))->title()->toString(), ] ); @@ -169,7 +170,7 @@ private function loadDataGridDrafts(): void $this->dgDrafts->setColumnFunction('htmlspecialchars', ['[title]'], 'title', false); // set headers - $this->dgDrafts->setHeaderLabels(['user_id' => \SpoonFilter::ucfirst(BL::lbl('Author'))]); + $this->dgDrafts->setHeaderLabels(['user_id' => s(BL::lbl('Author'))->title()->toString()]); // hide columns $this->dgDrafts->setColumnsHidden(['revision_id']); @@ -240,7 +241,7 @@ private function loadDataGridRecentPosts(): void $this->dgRecent->setColumnFunction('htmlspecialchars', ['[title]'], 'title', false); // set headers - $this->dgRecent->setHeaderLabels(['user_id' => \SpoonFilter::ucfirst(BL::lbl('Author'))]); + $this->dgRecent->setHeaderLabels(['user_id' => s(BL::lbl('Author'))->title()->toString()]); // hide columns $this->dgRecent->setColumnsHidden(['revision_id']); diff --git a/src/Backend/Modules/Blog/Actions/MassCommentAction.php b/src/Backend/Modules/Blog/Actions/MassCommentAction.php index 7fab2381fc..b7424d0a1d 100644 --- a/src/Backend/Modules/Blog/Actions/MassCommentAction.php +++ b/src/Backend/Modules/Blog/Actions/MassCommentAction.php @@ -5,6 +5,7 @@ use Backend\Core\Engine\Base\Action as BackendBaseAction; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Blog\Engine\Model as BackendBlogModel; +use function Symfony\Component\String\s; /** * This action is used to update one or more comments (status, delete, ...) @@ -60,6 +61,8 @@ public function execute(): void } // redirect - $this->redirect(BackendModel::createUrlForAction('Comments') . '&report=' . $report . '#tab' . \SpoonFilter::ucfirst($from)); + $this->redirect( + BackendModel::createUrlForAction('Comments') . '&report=' . $report . '#tab' . s($from)->title() + ); } } diff --git a/src/Backend/Modules/Blog/Ajax/AddCategory.php b/src/Backend/Modules/Blog/Ajax/AddCategory.php index 25632f3dcc..3d630472b7 100644 --- a/src/Backend/Modules/Blog/Ajax/AddCategory.php +++ b/src/Backend/Modules/Blog/Ajax/AddCategory.php @@ -5,6 +5,7 @@ use Backend\Core\Engine\Base\AjaxAction as BackendBaseAJAXAction; use Backend\Core\Language\Language as BL; use Backend\Modules\Blog\Engine\Model as BackendBlogModel; +use Common\Uri; use Symfony\Component\HttpFoundation\Response; /** @@ -29,7 +30,7 @@ public function execute(): void // get the data // build array $item = [ - 'title' => \SpoonFilter::htmlspecialchars($categoryTitle), + 'title' => htmlspecialchars($categoryTitle), 'language' => BL::getWorkingLanguage(), ]; @@ -40,7 +41,7 @@ public function execute(): void 'description_overwrite' => false, 'title' => $item['title'], 'title_overwrite' => false, - 'url' => BackendBlogModel::getUrlForCategory(\SpoonFilter::urlise($item['title'])), + 'url' => BackendBlogModel::getUrlForCategory(Uri::getUrl($item['title'])), ]; // update diff --git a/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockDataGrid.php b/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockDataGrid.php index 42acacc291..2180b6669d 100644 --- a/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockDataGrid.php +++ b/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockDataGrid.php @@ -8,7 +8,7 @@ use Backend\Core\Engine\Model; use Backend\Core\Language\Language; use Backend\Core\Language\Locale; -use SpoonFilter; +use function Symfony\Component\String\s; /** * @TODO replace with a doctrine implementation of the data grid @@ -27,7 +27,7 @@ public function __construct(Locale $locale) $this->setSortingColumns(['title']); // show the hidden status - $this->addColumn('isHidden', SpoonFilter::ucfirst(Language::lbl('VisibleOnSite')), '[hidden]'); + $this->addColumn('isHidden', s(Language::lbl('VisibleOnSite'))->title()->toString(), '[hidden]'); $this->setColumnFunction(TemplateModifiers::showBool(...), ['[hidden]', true], 'isHidden'); // check if this action is allowed diff --git a/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockRevisionDataGrid.php b/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockRevisionDataGrid.php index 3bc4574125..49cbd44ff4 100644 --- a/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockRevisionDataGrid.php +++ b/src/Backend/Modules/ContentBlocks/Domain/ContentBlock/ContentBlockRevisionDataGrid.php @@ -8,7 +8,7 @@ use Backend\Core\Engine\Model; use Backend\Core\Language\Language; use Backend\Core\Language\Locale; -use SpoonFilter; +use function Symfony\Component\String\s; /** * @TODO replace with a doctrine implementation of the data grid @@ -34,8 +34,8 @@ public function __construct(ContentBlock $contentBlock, Locale $locale) // set headers $this->setHeaderLabels( [ - 'user_id' => SpoonFilter::ucfirst(Language::lbl('By')), - 'edited_on' => SpoonFilter::ucfirst(Language::lbl('LastEditedOn')), + 'user_id' => s(Language::lbl('By'))->title()->toString(), + 'edited_on' => s(Language::lbl('LastEditedOn'))->title()->toString(), ] ); diff --git a/src/Backend/Modules/Dashboard/Actions/Index.php b/src/Backend/Modules/Dashboard/Actions/Index.php index 481c5a947f..eaf5373b0c 100644 --- a/src/Backend/Modules/Dashboard/Actions/Index.php +++ b/src/Backend/Modules/Dashboard/Actions/Index.php @@ -11,6 +11,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Groups\Engine\Model as BackendGroupsModel; +use function Symfony\Component\String\s; /** * This is the index-action (default), it will display the login screen @@ -98,7 +99,7 @@ private function loadData(): void $instance->execute(); // user sequence provided? - $title = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($module))) . ': ' . BL::lbl(\SpoonFilter::toCamelCase($widgetName)); + $title = s(BL::lbl(s($module)->camel()->title()->toString()))->title()->toString() . ': ' . BL::lbl(s($widgetName)->replace('_', ' ')->camel()->title()->toString()); $templatePath = $instance->getTemplatePath(); // reset template path diff --git a/src/Backend/Modules/Error/Actions/Index.php b/src/Backend/Modules/Error/Actions/Index.php index 93adfac5b5..fd2c148485 100644 --- a/src/Backend/Modules/Error/Actions/Index.php +++ b/src/Backend/Modules/Error/Actions/Index.php @@ -6,6 +6,7 @@ use Backend\Core\Language\Language as BL; use Common\Exception\ExitException; use Symfony\Component\HttpFoundation\Response; +use function Symfony\Component\String\s; /** * This is the index-action (default), it will display an error depending on a given parameters @@ -56,7 +57,7 @@ protected function parse(): void } // assign the correct message into the template - $this->template->assign('message', BL::err(\SpoonFilter::toCamelCase(htmlspecialchars($errorType), '-'))); + $this->template->assign('message', BL::err(s(htmlspecialchars($errorType))->replace('-', ' ')->camel()->title()->toString())); } public function getContent(): Response diff --git a/src/Backend/Modules/Extensions/Actions/AddThemeTemplate.php b/src/Backend/Modules/Extensions/Actions/AddThemeTemplate.php index 61f37f0ece..8e94597368 100644 --- a/src/Backend/Modules/Extensions/Actions/AddThemeTemplate.php +++ b/src/Backend/Modules/Extensions/Actions/AddThemeTemplate.php @@ -7,6 +7,8 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Extensions\Engine\Model as BackendExtensionsModel; +use Symfony\Component\Validator\Constraints as Assert; +use function Symfony\Component\String\s; /** * This is the add-action, it will display a form to create a new item @@ -94,14 +96,16 @@ private function loadForm(): void // loop extras to populate the default extras foreach ($extras as $item) { if ($item['type'] == 'block') { - $blocks[$item['id']] = \SpoonFilter::ucfirst(BL::lbl($item['label'])); + $blocks[$item['id']] = s(BL::lbl($item['label']))->title()->toString(); if (isset($item['data']['extra_label'])) { - $blocks[$item['id']] = \SpoonFilter::ucfirst($item['data']['extra_label']); + $blocks[$item['id']] = s($item['data']['extra_label'])->title()->toString(); } } elseif ($item['type'] == 'widget') { - $widgets[$item['id']] = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($item['module']))) . ': ' . \SpoonFilter::ucfirst(BL::lbl($item['label'])); + $widgets[$item['id']] = s(BL::lbl(s($item['module'])->camel()->title()->toString()))->title() . ': ' . + s(BL::lbl($item['label']))->title(); if (isset($item['data']['extra_label'])) { - $widgets[$item['id']] = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($item['module']))) . ': ' . $item['data']['extra_label']; + $widgets[$item['id']] = s(BL::lbl(s($item['module'])->camel()->title()->toString()))->title() . ': ' . + $item['data']['extra_label']; } } } @@ -112,8 +116,8 @@ private function loadForm(): void // create array $defaultExtras = [ - '' => [0 => \SpoonFilter::ucfirst(BL::lbl('Editor'))], - \SpoonFilter::ucfirst(BL::lbl('Widgets')) => $widgets, + '' => [0 => s(BL::lbl('Editor'))->title()], + s(BL::lbl('Widgets'))->title()->toString() => $widgets, ]; // create default position field @@ -161,8 +165,17 @@ private function loadForm(): void } // not alphanumeric -> error - if (!\SpoonFilter::isValidAgainstRegexp('/^[a-z0-9]+$/i', $name)) { - $errors[] = sprintf(BL::getError('NoAlphaNumPositionName'), $name); + $validationErrors = $this->get('validator')->validate( + $name, + new Assert\Regex([ + 'pattern' => '/^[a-z0-9]+$/i', + 'message' => sprintf(BL::getError('NoAlphaNumPositionName'), $name), + ]) + ); + if (count($validationErrors) > 0) { + foreach ($validationErrors as $validationError) { + $errors[] = $validationError->getMessage(); + } } // save positions diff --git a/src/Backend/Modules/Extensions/Actions/EditThemeTemplate.php b/src/Backend/Modules/Extensions/Actions/EditThemeTemplate.php index 65ff3624ce..5f6591271b 100644 --- a/src/Backend/Modules/Extensions/Actions/EditThemeTemplate.php +++ b/src/Backend/Modules/Extensions/Actions/EditThemeTemplate.php @@ -9,6 +9,8 @@ use Backend\Form\Type\DeleteType; use Backend\Modules\Extensions\Engine\Model as BackendExtensionsModel; use Backend\Modules\Pages\Engine\Model as BackendPagesModel; +use Symfony\Component\Validator\Constraints as Assert; +use function Symfony\Component\String\s; /** * This is the edit-action, it will display a form to edit an item @@ -131,14 +133,16 @@ private function loadForm(): void // loop extras to populate the default extras foreach ($extras as $item) { if ($item['type'] == 'block') { - $blocks[$item['id']] = \SpoonFilter::ucfirst(BL::lbl($item['label'])); + $blocks[$item['id']] = s(BL::lbl($item['label']))->title()->toString(); if (isset($item['data']['extra_label'])) { - $blocks[$item['id']] = \SpoonFilter::ucfirst($item['data']['extra_label']); + $blocks[$item['id']] = s($item['data']['extra_label'])->title()->toString(); } } elseif ($item['type'] == 'widget') { - $widgets[$item['id']] = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($item['module']))) . ': ' . \SpoonFilter::ucfirst(BL::lbl($item['label'])); + $widgets[$item['id']] = s(BL::lbl(s($item['module'])->camel()->title()->toString()))->title() . ': ' . + s(BL::lbl($item['label']))->title(); if (isset($item['data']['extra_label'])) { - $widgets[$item['id']] = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($item['module']))) . ': ' . $item['data']['extra_label']; + $widgets[$item['id']] = s(BL::lbl(s($item['module'])->camel()->title()->toString()))->title() . ': ' . + $item['data']['extra_label']; } } } @@ -149,8 +153,8 @@ private function loadForm(): void // create array $defaultExtras = [ - '' => [0 => \SpoonFilter::ucfirst(BL::lbl('Editor'))], - \SpoonFilter::ucfirst(BL::lbl('Widgets')) => $widgets, + '' => [0 => s(BL::lbl('Editor'))->title()->toString()], + s(BL::lbl('Widgets'))->title()->toString() => $widgets, ]; // create default position field @@ -198,8 +202,17 @@ private function loadForm(): void } // not alphanumeric -> error - if (!\SpoonFilter::isValidAgainstRegexp('/^[a-z0-9]+$/i', $name)) { - $errors[] = sprintf(BL::getError('NoAlphaNumPositionName'), $name); + $validationErrors = $this->get('validator')->validate( + $name, + new Assert\Regex([ + 'pattern' => '/^[a-z0-9]+$/i', + 'message' => sprintf(BL::getError('NoAlphaNumPositionName'), $name), + ]) + ); + if (count($validationErrors) > 0) { + foreach ($validationErrors as $validationError) { + $errors[] = $validationError->getMessage(); + } } // save positions diff --git a/src/Backend/Modules/Extensions/Actions/Modules.php b/src/Backend/Modules/Extensions/Actions/Modules.php index 5b26f256f0..7560aa3149 100644 --- a/src/Backend/Modules/Extensions/Actions/Modules.php +++ b/src/Backend/Modules/Extensions/Actions/Modules.php @@ -8,6 +8,7 @@ use Backend\Core\Engine\Model as BackendModel; use Backend\Core\Engine\DataGridArray as BackendDataGridArray; use Backend\Modules\Extensions\Engine\Model as BackendExtensionsModel; +use function Symfony\Component\String\s; /** * This is the modules-action, it will display the overview of modules. @@ -70,7 +71,7 @@ private function loadDataGridInstallableModules(): void $this->dataGridInstallableModules = new BackendDataGridArray($this->installableModules); $this->dataGridInstallableModules->setSortingColumns(['raw_name']); - $this->dataGridInstallableModules->setHeaderLabels(['raw_name' => \SpoonFilter::ucfirst(BL::getLabel('Name'))]); + $this->dataGridInstallableModules->setHeaderLabels(['raw_name' => s(BL::getLabel('Name'))->title()->toString()]); $this->dataGridInstallableModules->setColumnsHidden(['installed', 'name']); // check if this action is allowed @@ -83,7 +84,7 @@ private function loadDataGridInstallableModules(): void if (BackendAuthentication::isAllowedAction('InstallModule')) { // add install column $this->dataGridInstallableModules->addColumn('install', null, BL::lbl('Install'), BackendModel::createUrlForAction('InstallModule') . '&module=[raw_name]', BL::lbl('Install')); - $this->dataGridInstallableModules->setColumnConfirm('install', sprintf(BL::msg('ConfirmModuleInstall'), '[raw_name]'), null, \SpoonFilter::ucfirst(BL::lbl('Install')) . '?'); + $this->dataGridInstallableModules->setColumnConfirm('install', sprintf(BL::msg('ConfirmModuleInstall'), '[raw_name]'), null, s(BL::lbl('Install'))->title() . '?'); } } diff --git a/src/Backend/Modules/Extensions/Engine/Model.php b/src/Backend/Modules/Extensions/Engine/Model.php index d2ac1f645a..d78d95ce62 100644 --- a/src/Backend/Modules/Extensions/Engine/Model.php +++ b/src/Backend/Modules/Extensions/Engine/Model.php @@ -11,6 +11,7 @@ use Backend\Core\Engine\Exception; use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the extensions module. @@ -113,7 +114,7 @@ public static function buildTemplateHTML(string $format, bool $large = false): s } $htmlContent[$y][$x] = [ - 'title' => \SpoonFilter::ucfirst($value), + 'title' => s($value)->title()->toString(), 'value' => $value, 'exists' => $value != '/', 'rowspan' => $rowspan, @@ -293,7 +294,7 @@ public static function getExtras(): array $row['data']['url'] = BackendModel::createUrlForAction('', $row['module']); } - $name = \SpoonFilter::ucfirst(BL::lbl($row['label'])); + $name = s(BL::lbl($row['label']))->title()->toString(); if (isset($row['data']['extra_label'])) { $name = $row['data']['extra_label']; } @@ -302,8 +303,8 @@ public static function getExtras(): array } // add human readable name - $module = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($row['module']))); - $extraTypeLabel = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase('ExtraType_' . $row['type']))); + $module = s(BL::lbl(s($row['module'])->camel()->title()->toString()))->title()->toString(); + $extraTypeLabel = s(BL::lbl(s('ExtraType_' . $row['type'])->replace('_', ' ')->camel()->title()->toString()))->title()->toString(); $row['human_name'] = $extraTypeLabel . ': ' . $name; $row['path'] = $extraTypeLabel . ' › ' . $module . ($module !== $name ? ' › ' . $name : ''); } @@ -346,14 +347,14 @@ public static function getExtrasData(): array ); } - $name = \SpoonFilter::ucfirst(BL::lbl($row['label'])); + $name = s(BL::lbl($row['label']))->title()->toString(); if (isset($row['data']['extra_label'])) { $name = $row['data']['extra_label']; } if (isset($row['data']['label_variables'])) { $name = vsprintf($name, $row['data']['label_variables']); } - $moduleName = \SpoonFilter::ucfirst(BL::lbl(\SpoonFilter::toCamelCase($row['module']))); + $moduleName = s(BL::lbl(s($row['module'])->camel()->title()->toString()))->title()->toString(); if (!isset($values[$row['module']])) { $values[$row['module']] = [ @@ -427,7 +428,7 @@ public static function getModules(): array $module = []; $module['id'] = 'module_' . $moduleName; $module['raw_name'] = $moduleName; - $module['name'] = \SpoonFilter::ucfirst(BL::getLabel(\SpoonFilter::toCamelCase($moduleName))); + $module['name'] = s(BL::getLabel(s($moduleName)->camel()->title()->toString()))->title()->toString(); $module['description'] = ''; $module['version'] = ''; $module['installed'] = false; @@ -515,11 +516,9 @@ public static function getTemplate(int $id): array public static function getTemplates(?string $theme = null): array { $database = BackendModel::getContainer()->get('database'); - $theme = \SpoonFilter::getValue( - (string) $theme, - null, - BackendModel::get('fork.settings')->get('Core', 'theme', 'Fork') - ); + if ($theme === null || $theme === '') { + $theme = BackendModel::get('fork.settings')->get('Core', 'theme', 'Fork'); + } $templates = (array) $database->getRecords( 'SELECT i.id, i.label, i.path, i.data @@ -546,7 +545,7 @@ public static function getTemplates(?string $theme = null): array // any extras? if (isset($row['data']['default_extras'])) { foreach ($row['data']['default_extras'] as $value) { - if (\SpoonFilter::isInteger($value) + if (filter_var($value, FILTER_VALIDATE_INT) !== false && isset($extras[$value]) && $extras[$value]['type'] == 'block' ) { $row['has_block'] = true; @@ -977,10 +976,17 @@ public static function templateSyntaxToArray(string $syntax): array */ public static function isValidTemplateSyntaxFormat(string $syntax): bool { - return \SpoonFilter::isValidAgainstRegexp( - '/^\[(\/|[a-z0-9])+(,(\/|[a-z0-9]+))*\](,\[(\/|[a-z0-9])+(,(\/|[a-z0-9]+))*\])*$/i', - $syntax + $filteredValue = filter_var( + $syntax, + FILTER_VALIDATE_REGEXP, + [ + 'options' => [ + 'regexp' => '/^\[(\/|[a-z0-9])+(,(\/|[a-z0-9]+))*\](,\[(\/|[a-z0-9])+(,(\/|[a-z0-9]+))*\])*$/i', + ], + ] ); + + return $filteredValue === $syntax; } public static function updateTemplate(array $templateData): void diff --git a/src/Backend/Modules/Faq/Actions/Categories.php b/src/Backend/Modules/Faq/Actions/Categories.php index 60fbc38658..1d0c331796 100644 --- a/src/Backend/Modules/Faq/Actions/Categories.php +++ b/src/Backend/Modules/Faq/Actions/Categories.php @@ -8,6 +8,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Faq\Engine\Model as BackendFaqModel; +use function Symfony\Component\String\s; /** * This is the categories-action, it will display the overview of faq categories @@ -42,7 +43,7 @@ private function loadDataGrid(): void [BL::getWorkingLanguage()] ); $this->dataGrid->setColumnFunction('htmlspecialchars', ['[title]'], 'title', false); - $this->dataGrid->setHeaderLabels(['num_items' => \SpoonFilter::ucfirst(BL::lbl('Amount'))]); + $this->dataGrid->setHeaderLabels(['num_items' => s(BL::lbl('Amount'))->title()->toString()]); if ($this->multipleCategoriesAllowed) { $this->dataGrid->enableSequenceByDragAndDrop(); } else { diff --git a/src/Backend/Modules/Faq/Engine/Model.php b/src/Backend/Modules/Faq/Engine/Model.php index bfcd7bed11..71d718850a 100644 --- a/src/Backend/Modules/Faq/Engine/Model.php +++ b/src/Backend/Modules/Faq/Engine/Model.php @@ -7,6 +7,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Tags\Engine\Model as BackendTagsModel; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the faq module @@ -397,7 +398,7 @@ public static function insertCategory(array $item, ?array $meta = null): int 'data', [ 'id' => $item['id'], - 'extra_label' => \SpoonFilter::ucfirst(BL::lbl('Category', 'Faq')) . ': ' . $item['title'], + 'extra_label' => s(BL::lbl('Category', 'Faq'))->title()->toString() . ': ' . $item['title'], 'language' => $item['language'], 'edit_url' => BackendModel::createUrlForAction( 'EditCategory', diff --git a/src/Backend/Modules/FormBuilder/Actions/Add.php b/src/Backend/Modules/FormBuilder/Actions/Add.php index be05f8afc8..48cf24420f 100644 --- a/src/Backend/Modules/FormBuilder/Actions/Add.php +++ b/src/Backend/Modules/FormBuilder/Actions/Add.php @@ -9,6 +9,8 @@ use Backend\Core\Language\Language as BL; use Frontend\Core\Language\Language as FL; use Backend\Modules\FormBuilder\Engine\Model as BackendFormBuilderModel; +use Symfony\Component\Validator\Constraints as Assert; +use function Symfony\Component\String\s; /** * This is the add-action, it will display a form to create a new item. @@ -96,7 +98,13 @@ private function validateForm(): void // identifier if ($txtIdentifier->isFilled()) { // invalid characters - if (!\SpoonFilter::isValidAgainstRegexp('/^[a-zA-Z0-9\.\_\-]+$/', $txtIdentifier->getValue())) { + $validationErrors = $this->get('validator')->validate( + $txtIdentifier->getValue(), + new Assert\Regex([ + 'pattern' => '/^[a-zA-Z0-9\.\_\-]+$/', + ]) + ); + if (count($validationErrors) > 0) { $txtIdentifier->setError(BL::getError('InvalidIdentifier')); } elseif (BackendFormBuilderModel::existsIdentifier($txtIdentifier->getValue())) { // unique identifier @@ -135,7 +143,7 @@ private function validateForm(): void $field = []; $field['form_id'] = $id; $field['type'] = 'submit'; - $field['settings'] = serialize(['values' => \SpoonFilter::ucfirst(FL::getLabel('Send'))]); + $field['settings'] = serialize(['values' => s(FL::getLabel('Send'))->title()->toString()]); BackendFormBuilderModel::insertField($field); // everything is saved, so redirect to the editform diff --git a/src/Backend/Modules/FormBuilder/Actions/Edit.php b/src/Backend/Modules/FormBuilder/Actions/Edit.php index 50b596a9be..d0ecba2564 100644 --- a/src/Backend/Modules/FormBuilder/Actions/Edit.php +++ b/src/Backend/Modules/FormBuilder/Actions/Edit.php @@ -11,6 +11,7 @@ use Frontend\Core\Language\Language as FL; use Backend\Modules\FormBuilder\Engine\Model as BackendFormBuilderModel; use Backend\Modules\FormBuilder\Engine\Helper as FormBuilderHelper; +use Symfony\Component\Validator\Constraints as Assert; /** * This is the edit-action, it will display a form to edit an existing item @@ -265,7 +266,7 @@ private function parseFields(): void // add field $btn = $this->form->addButton( 'submit_field', - \SpoonFilter::htmlspecialcharsDecode($field['settings']['values']), + htmlspecialchars_decode((string) $field['settings']['values']), 'button', 'btn btn-default' ); @@ -323,7 +324,13 @@ private function validateForm(): void // identifier if ($txtIdentifier->isFilled()) { // invalid characters - if (!\SpoonFilter::isValidAgainstRegexp('/^[a-zA-Z0-9\.\_\-]+$/', $txtIdentifier->getValue())) { + $validationErrors = $this->get('validator')->validate( + $txtIdentifier->getValue(), + new Assert\Regex([ + 'pattern' => '/^[a-zA-Z0-9\.\_\-]+$/', + ]) + ); + if (count($validationErrors) > 0) { $txtIdentifier->setError(BL::getError('InvalidIdentifier')); } elseif (BackendFormBuilderModel::existsIdentifier($txtIdentifier->getValue(), $this->id)) { $txtIdentifier->setError(BL::getError('UniqueIdentifier')); diff --git a/src/Backend/Modules/FormBuilder/Actions/ExportData.php b/src/Backend/Modules/FormBuilder/Actions/ExportData.php index 497b2d1907..c13290a3c2 100644 --- a/src/Backend/Modules/FormBuilder/Actions/ExportData.php +++ b/src/Backend/Modules/FormBuilder/Actions/ExportData.php @@ -10,6 +10,7 @@ use Common\Exception\RedirectException; use ForkCMS\Utility\Csv\Writer; use PhpOffice\PhpSpreadsheet\Spreadsheet; +use function Symfony\Component\String\s; /** * This action is used to export submissions of a form. @@ -170,8 +171,8 @@ private function setFilter(): void private function setItems(): void { // init header labels - $lblSessionId = \SpoonFilter::ucfirst(BL::lbl('SessionId')); - $lblSentOn = \SpoonFilter::ucfirst(BL::lbl('SentOn')); + $lblSessionId = s(BL::lbl('SessionId'))->title()->toString(); + $lblSentOn = s(BL::lbl('SentOn'))->title()->toString(); $this->columnHeaders = [$lblSessionId, $lblSentOn]; // fetch query and parameters @@ -202,7 +203,7 @@ private function setItems(): void } // group submissions - $data[$row['data_id']][$row['label']] = \SpoonFilter::htmlentitiesDecode($value, null, ENT_QUOTES); + $data[$row['data_id']][$row['label']] = html_entity_decode($value); // add into headers if not yet added if (!in_array($row['label'], $this->columnHeaders)) { diff --git a/src/Backend/Modules/FormBuilder/Actions/Index.php b/src/Backend/Modules/FormBuilder/Actions/Index.php index 282fffcf4e..adf0dc2b72 100644 --- a/src/Backend/Modules/FormBuilder/Actions/Index.php +++ b/src/Backend/Modules/FormBuilder/Actions/Index.php @@ -8,6 +8,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\DataGridDatabase as BackendDataGridDatabase; use Backend\Modules\FormBuilder\Engine\Model as BackendFormBuilderModel; +use function Symfony\Component\String\s; /** * This is the index-action (default), it will display the overview @@ -29,7 +30,7 @@ private function loadDataGrid(): void [BL::getWorkingLanguage()] ); $this->dataGrid->setHeaderLabels([ - 'email' => \SpoonFilter::ucfirst(BL::getLabel('Recipient')), + 'email' => s(BL::getLabel('Recipient'))->title()->toString(), 'sent_forms' => '', ]); diff --git a/src/Backend/Modules/FormBuilder/Ajax/SaveField.php b/src/Backend/Modules/FormBuilder/Ajax/SaveField.php index 83abfa3643..c946f5d9d0 100644 --- a/src/Backend/Modules/FormBuilder/Ajax/SaveField.php +++ b/src/Backend/Modules/FormBuilder/Ajax/SaveField.php @@ -45,7 +45,7 @@ public function execute(): void $values = trim($this->getRequest()->request->get('values', '')); // this is somewhat a nasty hack, but it makes special chars work. - $values = \SpoonFilter::htmlspecialcharsDecode($values); + $values = htmlspecialchars_decode($values); $defaultValues = trim($this->getRequest()->request->get('default_values', '')); $placeholder = trim($this->getRequest()->request->get('placeholder', '')); @@ -231,10 +231,10 @@ public function execute(): void // htmlspecialchars except for paragraphs if ($type !== 'paragraph') { if ($values !== '') { - $values = \SpoonFilter::htmlspecialchars($values); + $values = htmlspecialchars($values); } if ($defaultValues !== '') { - $defaultValues = \SpoonFilter::htmlspecialchars($defaultValues); + $defaultValues = htmlspecialchars($defaultValues); } } @@ -262,7 +262,7 @@ public function execute(): void // settings $settings = []; if ($label !== '') { - $settings['label'] = \SpoonFilter::htmlspecialchars($label); + $settings['label'] = htmlspecialchars($label); } if (!empty($values)) { $settings['values'] = $values; @@ -271,10 +271,10 @@ public function execute(): void $settings['default_values'] = $defaultValues; } if ($placeholder !== '') { - $settings['placeholder'] = \SpoonFilter::htmlspecialchars($placeholder); + $settings['placeholder'] = htmlspecialchars($placeholder); } if ($classname !== '') { - $settings['classname'] = \SpoonFilter::htmlspecialchars($classname); + $settings['classname'] = htmlspecialchars($classname); } $settings['autocomplete'] = in_array($autocomplete, Autocomplete::POSSIBLE_VALUES) ? $autocomplete : ''; @@ -330,7 +330,7 @@ public function execute(): void $validate = []; $validate['field_id'] = $fieldId; $validate['type'] = 'required'; - $validate['error_message'] = \SpoonFilter::htmlspecialchars($requiredErrorMessage); + $validate['error_message'] = htmlspecialchars($requiredErrorMessage); // add validation BackendFormBuilderModel::insertFieldValidation($validate); @@ -344,9 +344,9 @@ public function execute(): void // build array $validate['field_id'] = $fieldId; $validate['type'] = $validation; - $validate['error_message'] = \SpoonFilter::htmlspecialchars($errorMessage); + $validate['error_message'] = htmlspecialchars($errorMessage); $validate['parameter'] = ($validationParameter !== '') ? - \SpoonFilter::htmlspecialchars($validationParameter) : + htmlspecialchars($validationParameter) : null; // add validation diff --git a/src/Backend/Modules/FormBuilder/Engine/Helper.php b/src/Backend/Modules/FormBuilder/Engine/Helper.php index 50d6626c0b..db36bb2a7d 100644 --- a/src/Backend/Modules/FormBuilder/Engine/Helper.php +++ b/src/Backend/Modules/FormBuilder/Engine/Helper.php @@ -5,6 +5,7 @@ use Backend\Core\Engine\Form as BackendForm; use Backend\Core\Engine\Model as BackendModel; use Backend\Core\Engine\TwigTemplate as BackendTemplate; +use function Symfony\Component\String\s; /** * Helper class for the form_builder module. @@ -152,8 +153,8 @@ public static function parseField(array $field): string } elseif (in_array($field['type'], ['checkbox', 'radiobutton'])) { // name (prefixed by type) $name = ($field['type'] === 'checkbox') ? - 'chk' . \SpoonFilter::ucfirst($fieldName) : - 'rbt' . \SpoonFilter::ucfirst($fieldName) + 'chk' . s($fieldName)->title()->toString() : + 'rbt' . s($fieldName)->title()->toString() ; // rebuild so the html is stored in a general name (and not rbtName) diff --git a/src/Backend/Modules/FormBuilder/Engine/Model.php b/src/Backend/Modules/FormBuilder/Engine/Model.php index e1475f5870..4aa7da10d6 100644 --- a/src/Backend/Modules/FormBuilder/Engine/Model.php +++ b/src/Backend/Modules/FormBuilder/Engine/Model.php @@ -7,6 +7,7 @@ use Common\ModuleExtraType; use Frontend\Core\Language\Language as FL; use Symfony\Component\Finder\Finder; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the form_builder module @@ -474,12 +475,12 @@ public static function getFields(int $id): array */ public static function getLocale(string $name, string $type = 'label', string $application = 'Backend'): string { - $name = \SpoonFilter::toCamelCase($name); - $class = \SpoonFilter::ucfirst($application) . '\Core\Language\Language'; - $function = 'get' . \SpoonFilter::ucfirst($type); + $name = s($name)->replace('_', ' ')->camel()->title()->toString(); + $class = s($application)->title()->toString() . '\Core\Language\Language'; + $function = 'get' . s($type)->title()->toString(); // execute and return value - return \SpoonFilter::ucfirst(call_user_func_array([$class, $function], [$name])); + return s(call_user_func_array([$class, $function], [$name]))->title()->toString(); } /** diff --git a/src/Backend/Modules/FormBuilder/Installer/Installer.php b/src/Backend/Modules/FormBuilder/Installer/Installer.php index 01ea065b5f..9e4d85618f 100644 --- a/src/Backend/Modules/FormBuilder/Installer/Installer.php +++ b/src/Backend/Modules/FormBuilder/Installer/Installer.php @@ -5,6 +5,7 @@ use Backend\Core\Engine\Model as BackendModel; use Backend\Core\Installer\ModuleInstaller; use Common\ModuleExtraType; +use function Symfony\Component\String\s; /** * Installer for the form_builder module @@ -67,7 +68,7 @@ private function configureFrontendPages(): void $form = []; $form['language'] = $language; $form['user_id'] = $this->getDefaultUserID(); - $form['name'] = \SpoonFilter::ucfirst($this->getLocale('Contact', 'Core', $language, 'lbl', 'Frontend')); + $form['name'] = s($this->getLocale('Contact', 'Core', $language, 'lbl', 'Frontend'))->title()->toString(); $form['method'] = 'database_email'; $form['email'] = serialize([$this->getVariable('email')]); $form['success_message'] = $this->getLocale('ContactMessageSent', 'Core', $language, 'msg', 'Frontend'); @@ -82,7 +83,7 @@ private function configureFrontendPages(): void $field['type'] = 'submit'; $field['settings'] = serialize( [ - 'values' => \SpoonFilter::ucfirst($this->getLocale('Send', 'Core', $language, 'lbl', 'Frontend')), + 'values' => s($this->getLocale('Send', 'Core', $language, 'lbl', 'Frontend'))->title()->toString(), ] ); $this->getDatabase()->insert('forms_fields', $field); @@ -92,7 +93,7 @@ private function configureFrontendPages(): void $field['type'] = 'textbox'; $field['settings'] = serialize( [ - 'label' => \SpoonFilter::ucfirst($this->getLocale('Name', 'Core', $language, 'lbl', 'Frontend')), + 'label' => s($this->getLocale('Name', 'Core', $language, 'lbl', 'Frontend'))->title()->toString(), ] ); $nameId = $this->getDatabase()->insert('forms_fields', $field); @@ -109,7 +110,7 @@ private function configureFrontendPages(): void $field['type'] = 'textbox'; $field['settings'] = serialize( [ - 'label' => \SpoonFilter::ucfirst($this->getLocale('Email', 'Core', $language, 'lbl', 'Frontend')), + 'label' => s($this->getLocale('Email', 'Core', $language, 'lbl', 'Frontend'))->title()->toString(), ] ); $emailId = $this->getDatabase()->insert('forms_fields', $field); @@ -125,7 +126,7 @@ private function configureFrontendPages(): void $field['type'] = 'textarea'; $field['settings'] = serialize( [ - 'label' => \SpoonFilter::ucfirst($this->getLocale('Message', 'Core', $language, 'lbl', 'Frontend')), + 'label' => s($this->getLocale('Message', 'Core', $language, 'lbl', 'Frontend'))->title()->toString(), ] ); $messageId = $this->getDatabase()->insert('forms_fields', $field); @@ -154,7 +155,7 @@ private function configureFrontendPages(): void // insert contact page $this->insertPage( [ - 'title' => \SpoonFilter::ucfirst($this->getLocale('Contact', 'Core', $language, 'lbl', 'Frontend')), + 'title' => s($this->getLocale('Contact', 'Core', $language, 'lbl', 'Frontend'))->title()->toString(), 'parent_id' => BackendModel::HOME_PAGE_ID, 'language' => $language, ], diff --git a/src/Backend/Modules/Groups/Actions/Add.php b/src/Backend/Modules/Groups/Actions/Add.php index cdff42dc7f..11132784ff 100644 --- a/src/Backend/Modules/Groups/Actions/Add.php +++ b/src/Backend/Modules/Groups/Actions/Add.php @@ -10,6 +10,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Groups\Engine\Model as BackendGroupsModel; +use function Symfony\Component\String\s; /** * This is the add-action, it will display a form to create a new group @@ -165,7 +166,7 @@ private function getActions(): void } $this->actions[$module][] = [ - 'label' => \SpoonFilter::toCamelCase($actionName), + 'label' => s($actionName)->replace('_', ' ')->camel()->title()->toString(), 'value' => $actionName, 'description' => $description, ]; @@ -175,7 +176,7 @@ private function getActions(): void $modules = array_unique($modules); foreach ($modules as $module) { $this->modules[] = [ - 'label' => \SpoonFilter::toCamelCase($module), + 'label' => s($module)->camel()->title()->toString(), 'value' => $module, ]; @@ -234,8 +235,8 @@ private function getWidgets(): void // add to array $this->widgets[] = [ 'module_name' => $module, - 'checkbox_name' => \SpoonFilter::toCamelCase($module) . \SpoonFilter::toCamelCase($widgetName), - 'label' => \SpoonFilter::toCamelCase($widgetName), + 'checkbox_name' => s($module)->camel()->title()->toString() . s($widgetName)->replace('_', ' ')->camel()->title()->toString(), + 'label' => s($widgetName)->replace('_', ' ')->camel()->title()->toString(), 'value' => $widgetName, 'description' => $description, ]; @@ -403,8 +404,8 @@ private function loadForm(): void foreach ($this->widgets as $j => $widget) { // add widget checkboxes $widgetBoxes[$j]['check'] = '' . $this->form->addCheckbox('widgets_' . $widget['checkbox_name'], true)->parse() . ''; - $widgetBoxes[$j]['module'] = \SpoonFilter::ucfirst(BL::lbl($widget['module_name'])); - $widgetBoxes[$j]['widget'] = ''; + $widgetBoxes[$j]['module'] = s(BL::lbl($widget['module_name']))->title()->toString(); + $widgetBoxes[$j]['widget'] = ''; $widgetBoxes[$j]['description'] = $widget['description']; } } @@ -427,8 +428,8 @@ private function loadForm(): void // bundle not yet in array? if (!in_array($action['group'], $addedBundles)) { // assign bundled action boxes - $actionBoxes[$key]['actions'][$i]['check'] = $this->form->addCheckbox('actions_' . $module['label'] . '_' . 'Group_' . \SpoonFilter::ucfirst($action['group']))->parse(); - $actionBoxes[$key]['actions'][$i]['action'] = \SpoonFilter::ucfirst($action['group']); + $actionBoxes[$key]['actions'][$i]['check'] = $this->form->addCheckbox('actions_' . $module['label'] . '_' . 'Group_' . s($action['group'])->title()->toString())->parse(); + $actionBoxes[$key]['actions'][$i]['action'] = s($action['group'])->title()->toString(); $actionBoxes[$key]['actions'][$i]['description'] = $this->actionGroups[$action['group']]; // add the group to the added bundles @@ -437,7 +438,7 @@ private function loadForm(): void } else { // assign action boxes $actionBoxes[$key]['actions'][$i]['check'] = $this->form->addCheckbox('actions_' . $module['label'] . '_' . $action['label'])->parse(); - $actionBoxes[$key]['actions'][$i]['action'] = ''; + $actionBoxes[$key]['actions'][$i]['action'] = ''; $actionBoxes[$key]['actions'][$i]['description'] = $action['description']; } } @@ -466,7 +467,7 @@ private function loadForm(): void false, 'inputCheckbox checkBeforeUnload jsSelectAll' )->parse(); - $permissionBoxes[$key]['id'] = \SpoonFilter::toCamelCase($module['label']); + $permissionBoxes[$key]['id'] = s($module['label'])->replace('_', ' ')->camel()->title()->toString(); } // create elements @@ -503,9 +504,9 @@ private function validateForm(): void // loop through all fields foreach ($this->form->getFields() as $field) { // field exists? - if ($field->getName() == 'actions_' . $module['label'] . '_' . 'Group_' . \SpoonFilter::ucfirst($key)) { + if ($field->getName() == 'actions_' . $module['label'] . '_' . 'Group_' . s($key)->title()) { // add to bundled actions - $bundledActionPermissions[] = $this->form->getField('actions_' . $module['label'] . '_' . 'Group_' . \SpoonFilter::ucfirst($key)); + $bundledActionPermissions[] = $this->form->getField('actions_' . $module['label'] . '_' . 'Group_' . s($key)->title()); } } } diff --git a/src/Backend/Modules/Groups/Actions/Edit.php b/src/Backend/Modules/Groups/Actions/Edit.php index 513aedbf54..5618310f31 100644 --- a/src/Backend/Modules/Groups/Actions/Edit.php +++ b/src/Backend/Modules/Groups/Actions/Edit.php @@ -13,6 +13,7 @@ use Backend\Modules\Groups\Engine\Model as BackendGroupsModel; use Backend\Modules\Users\Engine\Model as BackendUsersModel; use Symfony\Component\Finder\Finder; +use function Symfony\Component\String\s; /** * This is the edit-action, it will display a form to edit a group @@ -167,7 +168,7 @@ private function getActions(): void } $this->actions[$module][] = [ - 'label' => \SpoonFilter::toCamelCase($actionName), + 'label' => s($actionName)->replace('_', ' ')->camel()->title()->toString(), 'value' => $actionName, 'description' => $description, ]; @@ -177,7 +178,7 @@ private function getActions(): void $modules = array_unique($modules); foreach ($modules as $module) { $this->modules[] = [ - 'label' => \SpoonFilter::toCamelCase($module), + 'label' => s($module)->camel()->title()->toString(), 'value' => $module, ]; @@ -248,9 +249,9 @@ private function getWidgets(): void // add to array $this->widgets[] = [ - 'checkbox_name' => \SpoonFilter::toCamelCase($module) . \SpoonFilter::toCamelCase($widgetName), + 'checkbox_name' => s($module)->camel()->title() . s($widgetName)->replace('_', ' ')->camel()->title(), 'module_name' => $module, - 'label' => \SpoonFilter::toCamelCase($widgetName), + 'label' => s($widgetName)->replace('_', ' ')->camel()->title()->toString(), 'value' => $widgetName, 'description' => $description, ]; @@ -267,9 +268,9 @@ private function loadDataGrids(): void // check if this action is allowed if (BackendAuthentication::isAllowedAction('Edit', 'Users')) { // add columns - $this->dataGridUsers->addColumn('nickname', \SpoonFilter::ucfirst(BL::lbl('Nickname')), null, BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); - $this->dataGridUsers->addColumn('surname', \SpoonFilter::ucfirst(BL::lbl('Surname')), null, BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); - $this->dataGridUsers->addColumn('name', \SpoonFilter::ucfirst(BL::lbl('Name')), null, BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); + $this->dataGridUsers->addColumn('nickname', s(BL::lbl('Nickname'))->title()->toString(), null, BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); + $this->dataGridUsers->addColumn('surname', s(BL::lbl('Surname'))->title()->toString(), null, BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); + $this->dataGridUsers->addColumn('name', s(BL::lbl('Name'))->title()->toString(), null, BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); // add column URL $this->dataGridUsers->setColumnURL('email', BackendModel::createUrlForAction('Edit', 'Users') . '&id=[id]'); @@ -316,8 +317,8 @@ private function loadForm(): void // add widget checkboxes $widgetBoxes[$j]['check'] = '' . $this->form->addCheckbox('widgets_' . $widget['checkbox_name'], $selectedWidgets[$j] ?? null)->parse() . ''; - $widgetBoxes[$j]['module'] = \SpoonFilter::ucfirst(BL::lbl($widget['module_name'])); - $widgetBoxes[$j]['widget'] = ''; + $widgetBoxes[$j]['module'] = s(BL::lbl($widget['module_name']))->title()->toString(); + $widgetBoxes[$j]['widget'] = ''; $widgetBoxes[$j]['description'] = $widget['description']; } } @@ -345,8 +346,8 @@ private function loadForm(): void // bundle not yet in array? if (!in_array($action['group'], $addedBundles)) { // assign bundled action boxes - $actionBoxes[$key]['actions'][$i]['check'] = $this->form->addCheckbox('actions_' . $module['label'] . '_' . 'Group_' . \SpoonFilter::ucfirst($action['group']), in_array($action['value'], $selectedActions))->parse(); - $actionBoxes[$key]['actions'][$i]['action'] = \SpoonFilter::ucfirst($action['group']); + $actionBoxes[$key]['actions'][$i]['check'] = $this->form->addCheckbox('actions_' . $module['label'] . '_' . 'Group_' . s($action['group'])->title()->toString(), in_array($action['value'], $selectedActions))->parse(); + $actionBoxes[$key]['actions'][$i]['action'] = s($action['group'])->title()->toString(); $actionBoxes[$key]['actions'][$i]['description'] = $this->actionGroups[$action['group']]; // add the group to the added bundles @@ -355,7 +356,7 @@ private function loadForm(): void } else { // assign action boxes $actionBoxes[$key]['actions'][$i]['check'] = $this->form->addCheckbox('actions_' . $module['label'] . '_' . $action['label'], in_array($action['value'], $selectedActions))->parse(); - $actionBoxes[$key]['actions'][$i]['action'] = ''; + $actionBoxes[$key]['actions'][$i]['action'] = ''; $actionBoxes[$key]['actions'][$i]['description'] = $action['description']; } } @@ -384,7 +385,7 @@ private function loadForm(): void false, 'inputCheckbox checkBeforeUnload jsSelectAll' )->parse(); - $permissionBoxes[$key]['id'] = \SpoonFilter::toCamelCase($module['label']); + $permissionBoxes[$key]['id'] = s($module['label'])->replace('_', ' ')->camel()->title()->toString(); } // create elements @@ -582,9 +583,9 @@ private function validateForm(): void // loop through all fields foreach ($this->form->getFields() as $field) { // field exists? - if ($field->getName() == 'actions_' . $module['label'] . '_' . 'Group_' . \SpoonFilter::ucfirst($key)) { + if ($field->getName() == 'actions_' . $module['label'] . '_' . 'Group_' . s($key)->title()->toString()) { // add to bundled actions - $bundledActionPermissions[] = $this->form->getField('actions_' . $module['label'] . '_' . 'Group_' . \SpoonFilter::ucfirst($key)); + $bundledActionPermissions[] = $this->form->getField('actions_' . $module['label'] . '_' . 'Group_' . s($key)->title()->toString()); } } } diff --git a/src/Backend/Modules/Locale/Actions/Add.php b/src/Backend/Modules/Locale/Actions/Add.php index 24542bf09d..f3322dbe7a 100644 --- a/src/Backend/Modules/Locale/Actions/Add.php +++ b/src/Backend/Modules/Locale/Actions/Add.php @@ -92,8 +92,15 @@ protected function parse(): void parent::parse(); // prevent XSS - $filter = \SpoonFilter::arrayMapRecursive('htmlspecialchars', $this->filter); - + $filter = $this->filter; + array_walk_recursive( + $filter, + static function (&$value) { + if (is_string($value)) { + $value = htmlspecialchars($value); + } + } + ); $this->template->assignArray($filter); } diff --git a/src/Backend/Modules/Locale/Actions/Edit.php b/src/Backend/Modules/Locale/Actions/Edit.php index 57f92fd1ec..9e8d08aa67 100644 --- a/src/Backend/Modules/Locale/Actions/Edit.php +++ b/src/Backend/Modules/Locale/Actions/Edit.php @@ -68,7 +68,15 @@ protected function parse(): void parent::parse(); // prevent XSS - $filter = \SpoonFilter::arrayMapRecursive('htmlspecialchars', $this->filter); + $filter = $this->filter; + array_walk_recursive( + $filter, + static function (&$value) { + if (is_string($value)) { + $value = htmlspecialchars($value); + } + } + ); // parse filter $this->template->assignArray($filter); diff --git a/src/Backend/Modules/Locale/Actions/Index.php b/src/Backend/Modules/Locale/Actions/Index.php index a8fb6921bc..49577a49be 100644 --- a/src/Backend/Modules/Locale/Actions/Index.php +++ b/src/Backend/Modules/Locale/Actions/Index.php @@ -9,6 +9,7 @@ use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\Locale\Engine\Model as BackendLocaleModel; +use function Symfony\Component\String\s; /** * This is the index-action, it will display an overview of all the translations with an inline edit option. @@ -126,7 +127,7 @@ private function loadDataGrid(): void $dataGrid->setPaging(false); // set header label for reference code - $dataGrid->setHeaderLabels(['name' => \SpoonFilter::ucfirst(BL::lbl('ReferenceCode'))]); + $dataGrid->setHeaderLabels(['name' => s(BL::lbl('ReferenceCode'))->title()->toString()]); // hide the application when only one application is shown if ($this->filter['application'] != '') { @@ -152,18 +153,13 @@ private function loadDataGrid(): void ); // escape the double quotes - $dataGrid->setColumnFunction( - ['SpoonFilter', 'htmlentities'], - ['[' . $lang . ']', null, ENT_QUOTES], - $lang, - true - ); + $dataGrid->setColumnFunction('htmlentities', ['[' . $lang . ']'], $lang, true); if ($type == 'act') { $dataGrid->setColumnFunction('urldecode', ['[' . $lang . ']'], $lang, true); } // set header labels - $dataGrid->setHeaderLabels([$lang => \SpoonFilter::ucfirst(BL::lbl(mb_strtoupper((string) $lang)))]); + $dataGrid->setHeaderLabels([$lang => s(BL::lbl(mb_strtoupper((string) $lang)))->title()->toString()]); // only 1 language selected? if (count($this->filter['language']) == 1) { diff --git a/src/Backend/Modules/Locale/Engine/CacheBuilder.php b/src/Backend/Modules/Locale/Engine/CacheBuilder.php index a5c246df96..048585e3d9 100644 --- a/src/Backend/Modules/Locale/Engine/CacheBuilder.php +++ b/src/Backend/Modules/Locale/Engine/CacheBuilder.php @@ -3,6 +3,7 @@ namespace Backend\Modules\Locale\Engine; use Symfony\Component\Filesystem\Filesystem; +use function Symfony\Component\String\s; /** * In this file, the locale cache is build @@ -105,16 +106,16 @@ protected function addSpoonLocale(array &$json, string $language): void // build labels foreach ($monthsLong as $key => $value) { - $json['loc']['MonthLong' . \SpoonFilter::ucfirst($key)] = $value; + $json['loc']['MonthLong' . s($key)->title()->toString()] = $value; } foreach ($monthsShort as $key => $value) { - $json['loc']['MonthShort' . \SpoonFilter::ucfirst($key)] = $value; + $json['loc']['MonthShort' . s($key)->title()->toString()] = $value; } foreach ($daysLong as $key => $value) { - $json['loc']['DayLong' . \SpoonFilter::ucfirst($key)] = $value; + $json['loc']['DayLong' . s($key)->title()->toString()] = $value; } foreach ($daysShort as $key => $value) { - $json['loc']['DayShort' . \SpoonFilter::ucfirst($key)] = $value; + $json['loc']['DayShort' . s($key)->title()->toString()] = $value; } } diff --git a/src/Backend/Modules/Locale/Engine/Model.php b/src/Backend/Modules/Locale/Engine/Model.php index 8dce0734db..f69de34d08 100644 --- a/src/Backend/Modules/Locale/Engine/Model.php +++ b/src/Backend/Modules/Locale/Engine/Model.php @@ -6,7 +6,7 @@ use Backend\Core\Engine\Authentication as BackendAuthentication; use Backend\Core\Language\Language as BL; use Backend\Core\Engine\Model as BackendModel; -use SpoonFilter; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the locale module @@ -372,7 +372,7 @@ public static function getTypesForDropDown(): array // loop and build labels foreach ($labels as &$row) { - $row = SpoonFilter::ucfirst(BL::msg(mb_strtoupper((string) $row), 'Core')); + $row = s(BL::msg(mb_strtoupper((string) $row), 'Core'))->title()->toString(); } // build array @@ -385,7 +385,7 @@ public static function getTypesForMultiCheckbox(): array // loop and build labels foreach ($labels as &$row) { - $row = SpoonFilter::ucfirst(BL::msg(mb_strtoupper((string) $row), 'Core')); + $row = s(BL::msg(mb_strtoupper((string) $row), 'Core'))->title()->toString(); } // build array @@ -477,8 +477,8 @@ public static function importXML( foreach ($items as $item) { // attributes $attributes = $item->attributes(); - $type = SpoonFilter::getValue($attributes['type'], $possibleTypes, ''); - $name = SpoonFilter::ucfirst(SpoonFilter::getValue($attributes['name'], null, '')); + $type = in_array($attributes['type'], $possibleTypes, true) ? $attributes['type'] : ''; + $name = s($attributes['name'] ?? '')->title()->toString(); // missing attributes if ($type == '' || $name == '') { @@ -495,11 +495,7 @@ public static function importXML( // attributes $attributes = $translation->attributes(); - $language = SpoonFilter::getValue( - $attributes['language'], - $possibleLanguages[$application], - '' - ); + $language = in_array($attributes['language'], $possibleLanguages[$application], true) ? $attributes['language'] : ''; // language does not exist if ($language == '') { diff --git a/src/Backend/Modules/Location/Engine/Model.php b/src/Backend/Modules/Location/Engine/Model.php index a9a6a49aba..d066bc8a5c 100644 --- a/src/Backend/Modules/Location/Engine/Model.php +++ b/src/Backend/Modules/Location/Engine/Model.php @@ -6,6 +6,7 @@ use Backend\Core\Engine\Model as BackendModel; use Common\ModuleExtraType; use ForkCMS\Utility\Geolocation; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the location module @@ -190,7 +191,7 @@ public static function insert(array $item): int 'data', [ 'id' => $item['id'], - 'extra_label' => \SpoonFilter::ucfirst(BL::lbl('Location', 'Core')) . ': ' . $item['title'], + 'extra_label' => s(BL::lbl('Location', 'Core'))->title() . ': ' . $item['title'], 'language' => $item['language'], 'edit_url' => BackendModel::createUrlForAction('Edit', 'Location') . '&id=' . $item['id'], ] @@ -238,7 +239,7 @@ public static function update(array $item): int 'data', [ 'id' => $item['id'], - 'extra_label' => \SpoonFilter::ucfirst(BL::lbl('Location', 'Core')) . ': ' . $item['title'], + 'extra_label' => s(BL::lbl('Location', 'Core'))->title() . ': ' . $item['title'], 'language' => $item['language'], 'edit_url' => BackendModel::createUrlForAction('Edit', 'Location') . '&id=' . $item['id'], ] diff --git a/src/Backend/Modules/Mailmotor/Domain/Settings/SettingsType.php b/src/Backend/Modules/Mailmotor/Domain/Settings/SettingsType.php index 9534d4bb42..c1bd9c4e00 100755 --- a/src/Backend/Modules/Mailmotor/Domain/Settings/SettingsType.php +++ b/src/Backend/Modules/Mailmotor/Domain/Settings/SettingsType.php @@ -5,7 +5,6 @@ use Backend\Modules\Mailmotor\Domain\Settings\Command\SaveSettings; use Common\Language; use MailMotor\Bundle\MailMotorBundle\Manager\SubscriberGatewayManager; -use SpoonFilter; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; @@ -17,6 +16,7 @@ use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Valid; +use function Symfony\Component\String\s; class SettingsType extends AbstractType { @@ -122,7 +122,7 @@ private function getPossibleMailEngines(): array $mailEnginesWithSubscriberGateway = $this->subscriberGatewayManager->getAll(); foreach ($mailEnginesWithSubscriberGateway as $key => $mailEngine) { - $label = SpoonFilter::ucfirst(($key === 'not_implemented') ? Language::lbl('None') : $key); + $label = s(($key === 'not_implemented') ? Language::lbl('None') : $key)->title()->toString(); $ddmValuesForMailEngines[$label] = $key; } diff --git a/src/Backend/Modules/MediaGalleries/Domain/MediaGallery/MediaGalleryDataGrid.php b/src/Backend/Modules/MediaGalleries/Domain/MediaGallery/MediaGalleryDataGrid.php index d6680f729f..afdae83770 100644 --- a/src/Backend/Modules/MediaGalleries/Domain/MediaGallery/MediaGalleryDataGrid.php +++ b/src/Backend/Modules/MediaGalleries/Domain/MediaGallery/MediaGalleryDataGrid.php @@ -7,7 +7,7 @@ use Backend\Core\Engine\DataGridFunctions; use Backend\Core\Engine\Model; use Backend\Core\Language\Language; -use SpoonFilter; +use function Symfony\Component\String\s; /** * @TODO replace with a doctrine implementation of the data grid @@ -21,7 +21,7 @@ public function __construct() FROM media_gallery AS i' ); - $this->setHeaderLabels(['title' => SpoonFilter::ucfirst(Language::lbl('Title'))]); + $this->setHeaderLabels(['title' => s(Language::lbl('Title'))->title()->toString()]); $this->setColumnFunction('htmlspecialchars', ['[title]'], 'title', false); $this->setSortingFunctions(); $this->setExtraFunctions(); diff --git a/src/Backend/Modules/MediaLibrary/Domain/MediaGroup/TypeType.php b/src/Backend/Modules/MediaLibrary/Domain/MediaGroup/TypeType.php index 56cbf27886..280f4ddf35 100644 --- a/src/Backend/Modules/MediaLibrary/Domain/MediaGroup/TypeType.php +++ b/src/Backend/Modules/MediaLibrary/Domain/MediaGroup/TypeType.php @@ -6,6 +6,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; +use function Symfony\Component\String\s; class TypeType extends AbstractType { @@ -18,7 +19,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void [ 'label' => 'msg.ChooseTypeForNewGroup', 'choices' => $this->getTypeChoices(), - 'choice_label' => fn(Type $type) => Language::lbl('MediaLibraryGroupType' . \SpoonFilter::toCamelCase($type, '-'), 'Core'), + 'choice_label' => fn(Type $type) => Language::lbl('MediaLibraryGroupType' . s($type)->replace('-', ' ')->camel()->title()->toString(), 'Core'), 'choice_translation_domain' => false, 'choice_value' => fn(?Type $type = null) => (string) $type, 'data' => Type::fromString('image'), diff --git a/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemDataGrid.php b/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemDataGrid.php index 022cf27abb..9a7b2f5d4e 100644 --- a/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemDataGrid.php +++ b/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemDataGrid.php @@ -7,8 +7,8 @@ use Backend\Core\Engine\Model; use Backend\Core\Language\Language; use Backend\Modules\MediaLibrary\Actions\MediaItemMassAction; -use SpoonFilter; use SpoonFormDropdown; +use function Symfony\Component\String\s; /** * @TODO replace with a doctrine implementation of the data grid @@ -49,15 +49,15 @@ private function getColumnHeaderLabels(Type $type): array { if ($type->isMovie()) { return [ - 'storage_type' => SpoonFilter::ucfirst(Language::lbl('MediaStorageType')), - 'url' => SpoonFilter::ucfirst(Language::lbl('MediaMovieId')), - 'title' => SpoonFilter::ucfirst(Language::lbl('MediaMovieTitle')), + 'storage_type' => s(Language::lbl('MediaStorageType'))->title()->toString(), + 'url' => s(Language::lbl('MediaMovieId'))->title()->toString(), + 'title' => s(Language::lbl('MediaMovieTitle'))->title()->toString(), ]; } return [ 'type' => '', - 'url' => SpoonFilter::ucfirst(Language::lbl('Image')), + 'url' => s(Language::lbl('Image'))->title()->toString(), ]; } diff --git a/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemSelectionDataGrid.php b/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemSelectionDataGrid.php index 5d50d3a60b..39e9a47113 100644 --- a/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemSelectionDataGrid.php +++ b/src/Backend/Modules/MediaLibrary/Domain/MediaItem/MediaItemSelectionDataGrid.php @@ -6,7 +6,7 @@ use Backend\Core\Engine\DataGridFunctions as BackendDataGridFunctions; use Backend\Core\Engine\Model; use Backend\Core\Language\Language; -use SpoonFilter; +use function Symfony\Component\String\s; /** * @TODO replace with a doctrine implementation of the data grid @@ -36,16 +36,16 @@ private function getColumnHeaderLabels(Type $type): array { if ($type->isMovie()) { return [ - 'storage_type' => SpoonFilter::ucfirst(Language::lbl('MediaStorageType')), - 'url' => SpoonFilter::ucfirst(Language::lbl('MediaMovieId')), - 'title' => SpoonFilter::ucfirst(Language::lbl('MediaMovieTitle')), + 'storage_type' => s(Language::lbl('MediaStorageType'))->title()->toString(), + 'url' => s(Language::lbl('MediaMovieId'))->title()->toString(), + 'title' => s(Language::lbl('MediaMovieTitle'))->title()->toString(), 'directUrl' => '', ]; } return [ 'type' => '', - 'url' => SpoonFilter::ucfirst(Language::lbl('Image')), + 'url' => s(Language::lbl('Image'))->title()->toString(), 'directUrl' => '', ]; } @@ -198,6 +198,6 @@ public static function addButton(string $id, string $type, string $storageType) } return '' . - SpoonFilter::ucfirst(Language::lbl('Select')) . ''; + s(Language::lbl('Select'))->title() . ''; } } diff --git a/src/Backend/Modules/MediaLibrary/Manager/TreeManager.php b/src/Backend/Modules/MediaLibrary/Manager/TreeManager.php index 73fe1e2a08..0428eaaece 100644 --- a/src/Backend/Modules/MediaLibrary/Manager/TreeManager.php +++ b/src/Backend/Modules/MediaLibrary/Manager/TreeManager.php @@ -6,7 +6,7 @@ use Backend\Core\Language\Language; use Backend\Core\Engine\Model as BackendModel; use Backend\Modules\MediaLibrary\Builder\MediaFolder\MediaFolderCacheItem; -use SpoonFilter; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the MediaLibrary module @@ -21,7 +21,7 @@ public function getHTML(): string { $navigationItems = $this->mediaFolderCache->get(); - $html = '
' . "\n"; - $value .= "\t\t" . '{$btn' . SpoonFilter::toCamelCase($object->getName()) . '}' . "\n"; + $value .= "\t\t" . '{$btn' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif ($object instanceof \SpoonFormCheckbox) { - $value .= "\t" . 'getName()) . + $value .= "\t" . '
getName())->replace('_', ' ')->camel()->title()->toString() . 'Error} class="errorArea"{/option:chk' . - SpoonFilter::toCamelCase($object->getName()) . 'Error}>' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$chk' . SpoonFilter::toCamelCase($object->getName()) . - '} {$chk' . SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '' . "\n"; + $value .= "\t\t" . '{$chk' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . + '} {$chk' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif ($object instanceof \SpoonFormMultiCheckbox) { - $value .= "\t" . '' . SpoonFilter::toCamelCase($object->getName()) . + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; + $value .= "\t\t" . '
' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '
' . "\n"; - $value .= "\t\t" . '{$chk' . SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + $value .= "\t\t" . '{$chk' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t\t" . 'getName()) + s($object->getName())->replace('_', ' ')->camel()->title()->toString() ) . 'Error} class="errorArea"{/option:ddm' . str_replace( '[]', '', - SpoonFilter::toCamelCase($object->getName()) + s($object->getName())->replace('_', ' ')->camel()->title()->toString() ) . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$ddm' . str_replace('[]', '', SpoonFilter::toCamelCase($object->getName())) . + $value .= "\t\t" . '{$ddm' . str_replace('[]', '', s($object->getName())->replace('_', ' ')->camel()->title()->toString()) . '} {$ddm' . str_replace( '[]', '', - SpoonFilter::toCamelCase($object->getName()) + s($object->getName())->replace('_', ' ')->camel()->title()->toString() ) . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif ($object instanceof \SpoonFormImage) { - $value .= "\t" . 'getName()) . + $value .= "\t" . '
getName())->replace('_', ' ')->camel()->title()->toString() . 'Error} class="errorArea"{/option:file' . - SpoonFilter::toCamelCase($object->getName()) . 'Error}>' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$file' . SpoonFilter::toCamelCase($object->getName()) . + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '' . "\n"; + $value .= "\t\t" . '{$file' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '} {$msgHelpImageField} {$file' . - SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif ($object instanceof SpoonFormFile) { - $value .= "\t" . 'getName()) . + $value .= "\t" . '
getName())->replace('_', ' ')->camel()->title()->toString() . 'Error} class="errorArea"{/option:file' . - SpoonFilter::toCamelCase($object->getName()) . 'Error}>' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$file' . SpoonFilter::toCamelCase($object->getName()) . - '} {$file' . SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '' . "\n"; + $value .= "\t\t" . '{$file' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . + '} {$file' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif ($object instanceof SpoonFormRadiobutton) { - $value .= "\t" . '' . SpoonFilter::toCamelCase($object->getName()) . + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; + $value .= "\t\t" . '
' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '
' . "\n"; - $value .= "\t\t" . '{$rbt' . SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + $value .= "\t\t" . '{$rbt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t\t" . 'getName()) . - 'Error} class="errorArea"{/option:txt' . SpoonFilter::toCamelCase($object->getName()) . + $value .= "\t" . '
getName())->replace('_', ' ')->camel()->title()->toString() . + 'Error} class="errorArea"{/option:txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$txt' . SpoonFilter::toCamelCase($object->getName()) . + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '' . "\n"; + $value .= "\t\t" . '{$txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '} {$msgHelpDateField} {$txt' . - SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif ($object instanceof SpoonFormTime) { - $value .= "\t" . 'getName()) . - 'Error} class="errorArea"{/option:txt' . SpoonFilter::toCamelCase($object->getName()) . + $value .= "\t" . '
getName())->replace('_', ' ')->camel()->title()->toString() . + 'Error} class="errorArea"{/option:txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$txt' . SpoonFilter::toCamelCase($object->getName()) . + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '' . "\n"; + $value .= "\t\t" . '{$txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '} {$msgHelpTimeField} {$txt' . - SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } elseif (($object instanceof SpoonFormPassword) || ($object instanceof SpoonFormTextarea) || ($object instanceof SpoonFormText) ) { - $value .= "\t" . 'getName()) . - 'Error} class="errorArea"{/option:txt' . SpoonFilter::toCamelCase($object->getName()) . + $value .= "\t" . '
getName())->replace('_', ' ')->camel()->title()->toString() . + 'Error} class="errorArea"{/option:txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}>' . "\n"; $value .= "\t\t" . '' . "\n"; - $value .= "\t\t" . '{$txt' . SpoonFilter::toCamelCase($object->getName()) . - '} {$txt' . SpoonFilter::toCamelCase($object->getName()) . 'Error}' . "\n"; + s($object->getName())->replace('_', ' ')->camel()->title()->toString() . '' . "\n"; + $value .= "\t\t" . '{$txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . + '} {$txt' . s($object->getName())->replace('_', ' ')->camel()->title()->toString() . 'Error}' . "\n"; $value .= "\t" . '
' . "\n\n"; } } diff --git a/src/Frontend/Core/Engine/Navigation.php b/src/Frontend/Core/Engine/Navigation.php index eb76e05f09..490ff847e0 100644 --- a/src/Frontend/Core/Engine/Navigation.php +++ b/src/Frontend/Core/Engine/Navigation.php @@ -8,6 +8,7 @@ use Backend\Modules\Pages\Engine\Model as BackendPagesModel; use Frontend\Core\Engine\Model as FrontendModel; use Frontend\Modules\Profiles\Engine\Authentication as FrontendAuthentication; +use function Symfony\Component\String\s; /** * This class will be used to build the navigation @@ -565,7 +566,7 @@ public static function getUrlForBlock( // append action if ($action !== null) { - $url .= '/' . Language::act(\SpoonFilter::toCamelCase($action)); + $url .= '/' . Language::act(s($action)->replace('_', ' ')->camel()->title()->toString()); } // return the URL diff --git a/src/Frontend/Core/Engine/Page.php b/src/Frontend/Core/Engine/Page.php index 6d8ae78962..290f5d3b6e 100644 --- a/src/Frontend/Core/Engine/Page.php +++ b/src/Frontend/Core/Engine/Page.php @@ -17,6 +17,7 @@ use Backend\Core\Engine\Model as BackendModel; use Frontend\Modules\Profiles\Engine\Authentication as FrontendAuthenticationModel; use Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException; +use function Symfony\Component\String\s; /** * Frontend page class, this class will handle everything on a page @@ -203,7 +204,7 @@ public function display(): Response array_keys($this->record['positions']) ); foreach ($unusedPositions as $position) { - $this->template->assign('position' . \SpoonFilter::ucfirst($position), []); + $this->template->assign('position' . s($position)->title(), []); } $this->header->parse(); @@ -354,7 +355,7 @@ protected function parsePositions(): void } // assign position to template - $this->template->assign('position' . \SpoonFilter::ucfirst($position), $positions[$position]); + $this->template->assign('position' . s($position)->title(), $positions[$position]); } $this->template->assign('positions', $positions); diff --git a/src/Frontend/Core/Engine/Rss.php b/src/Frontend/Core/Engine/Rss.php index 315d6dfe01..8cb5f28dbe 100644 --- a/src/Frontend/Core/Engine/Rss.php +++ b/src/Frontend/Core/Engine/Rss.php @@ -12,8 +12,8 @@ class Rss extends \SpoonFeedRSS public function __construct(string $title, string $link, string $description, array $items = []) { // decode - $title = \SpoonFilter::htmlspecialcharsDecode($title); - $description = \SpoonFilter::htmlspecialcharsDecode($description); + $title = htmlspecialchars_decode($title); + $description = htmlspecialchars_decode($description); // call the parent parent::__construct( @@ -31,8 +31,8 @@ public function __construct(string $title, string $link, string $description, ar $items ); - $siteTitle = \SpoonFilter::htmlspecialcharsDecode( - Model::get('fork.settings')->get('Core', 'site_title_' . LANGUAGE) + $siteTitle = htmlspecialchars_decode( + (string) Model::get('fork.settings')->get('Core', 'site_title_' . LANGUAGE) ); // set feed properties diff --git a/src/Frontend/Core/Engine/RssItem.php b/src/Frontend/Core/Engine/RssItem.php index 70c0aa0f9d..3f5dbf6080 100644 --- a/src/Frontend/Core/Engine/RssItem.php +++ b/src/Frontend/Core/Engine/RssItem.php @@ -19,8 +19,8 @@ class RssItem extends \SpoonFeedRSSItem public function __construct(string $title, string $link, string $content) { // decode - $title = \SpoonFilter::htmlspecialcharsDecode($title); - $content = \SpoonFilter::htmlspecialcharsDecode($content); + $title = htmlspecialchars_decode($title); + $content = htmlspecialchars_decode($content); // set UTM-campaign $this->utm['utm_campaign'] = CommonUri::getUrl($title); @@ -75,7 +75,7 @@ public function processLinks(string $content): string public function setAuthor($author): void { // remove special chars - $author = (string) \SpoonFilter::htmlspecialcharsDecode($author); + $author = htmlspecialchars_decode((string) $author); // add fake emailaddress if (!filter_var($author, FILTER_VALIDATE_EMAIL)) { @@ -94,7 +94,7 @@ public function setAuthor($author): void public function setDescription($description): void { // remove special chars - $description = (string) \SpoonFilter::htmlspecialcharsDecode($description); + $description = htmlspecialchars_decode((string) $description); // process links $description = $this->processLinks($description); diff --git a/src/Frontend/Core/Engine/SeoFormNode.php b/src/Frontend/Core/Engine/SeoFormNode.php index 91895605d7..a540b6363a 100644 --- a/src/Frontend/Core/Engine/SeoFormNode.php +++ b/src/Frontend/Core/Engine/SeoFormNode.php @@ -3,9 +3,9 @@ namespace Frontend\Core\Engine; use Backend\Core\Language\Language as BackendLanguage; -use SpoonFilter; use Twig\Compiler; use Twig\Node\Node; +use function Symfony\Component\String\s; /** * Twig node for writing the SEO form @@ -302,7 +302,7 @@ public function compile(Compiler $compiler): void private function lbl(string $label): string { - return SpoonFilter::ucfirst(BackendLanguage::getLabel($label)); + return s(BackendLanguage::getLabel($label))->title()->toString(); } private function msg(string $message): string diff --git a/src/Frontend/Core/Engine/TemplateModifiers.php b/src/Frontend/Core/Engine/TemplateModifiers.php index e8032e71fe..8adbaf3996 100644 --- a/src/Frontend/Core/Engine/TemplateModifiers.php +++ b/src/Frontend/Core/Engine/TemplateModifiers.php @@ -12,6 +12,7 @@ use Common\Core\Twig\Extensions\BaseTwigModifiers; use SpoonDate; use Twig\Error\Error; +use function Symfony\Component\String\s; /** * Contains all Frontend-related custom modifiers @@ -466,11 +467,16 @@ public static function userSetting($string, string $setting, ?int $userId = null */ public static function cleanupPlainText(string $string): string { - // detect links - $string = \SpoonFilter::replaceURLsWithAnchors( - $string, - FrontendModel::get('fork.settings')->get('Core', 'seo_nofollow_in_comments', false) - ); + $relAttributes = ['noopener']; + if (FrontendModel::get('fork.settings')->get('Core', 'seo_nofollow_in_comments', false)) { + $relAttributes[] = 'nofollow'; + } + + // replace links with a tags + $string = s($string)->replaceMatches( + '~(https?://[^\s]+)~', + '$1' + )->toString(); // replace newlines $string = str_replace("\r", '', $string); @@ -509,6 +515,6 @@ public static function count(array $data): int */ public static function toLabel(string $value): string { - return \SpoonFilter::ucfirst(Language::lbl(\SpoonFilter::toCamelCase($value, '_', false))); + return s(Language::lbl(s($value)->replace('_', ' ')->camel()->title()->toString()))->title()->toString(); } } diff --git a/src/Frontend/Core/Engine/Url.php b/src/Frontend/Core/Engine/Url.php index 6989697294..a05ca20b2e 100644 --- a/src/Frontend/Core/Engine/Url.php +++ b/src/Frontend/Core/Engine/Url.php @@ -5,7 +5,6 @@ use Common\Exception\RedirectException; use ForkCMS\App\KernelLoader; use Frontend\Core\Language\Language; -use SpoonFilter; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\KernelInterface; @@ -101,12 +100,16 @@ public function getParameter($index, string $type = 'string', $defaultValue = nu { // does the index exists and isn't this parameter empty if ($this->hasParameter($index)) { - return SpoonFilter::getValue( - $this->parameters[$index], - null, - null, - $type - ); + $value = $this->parameters[$index]; + + return match ($type) { + 'array' => ($value == '') ? [] : (array) $value, + 'bool' => (bool) $value, + 'double', 'float' => (float) $value, + 'int' => (int) $value, + 'string' => (string) $value, + default => $value, + }; } // fallback diff --git a/src/Frontend/Core/Header/Header.php b/src/Frontend/Core/Header/Header.php index bd48068a67..7e78b9e527 100644 --- a/src/Frontend/Core/Header/Header.php +++ b/src/Frontend/Core/Header/Header.php @@ -457,12 +457,12 @@ private function parseSeo(): void $charset = $this->getContainer()->getParameter('kernel.charset'); if ($charset === 'utf-8') { - $this->meta->addMetaLink(MetaLink::canonical(\SpoonFilter::htmlspecialchars($this->getCanonical()))); + $this->meta->addMetaLink(MetaLink::canonical(htmlspecialchars($this->getCanonical()))); return; } - $this->meta->addMetaLink(MetaLink::canonical(\SpoonFilter::htmlentities($this->getCanonical()))); + $this->meta->addMetaLink(MetaLink::canonical(htmlentities($this->getCanonical()))); } public function setCanonicalUrl(string $canonicalUrl): void diff --git a/src/Frontend/Core/Language/Language.php b/src/Frontend/Core/Language/Language.php index a11941fecb..7571bac630 100644 --- a/src/Frontend/Core/Language/Language.php +++ b/src/Frontend/Core/Language/Language.php @@ -3,9 +3,10 @@ namespace Frontend\Core\Language; use Backend\Core\Engine\Model; +use Backend\Modules\Locale\Engine\CacheBuilder; use Frontend\Core\Engine\Exception; use Symfony\Component\Filesystem\Filesystem; -use Backend\Modules\Locale\Engine\CacheBuilder; +use function Symfony\Component\String\s; /** * This class will store the language-dependant content for the frontend. @@ -82,7 +83,7 @@ public static function buildCache(string $language, string $application): void public static function getAction(string $key, bool $fallback = true): string { // redefine - $key = \SpoonFilter::toCamelCase($key); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // if the action exists return it, if (isset(self::$act[$key])) { @@ -187,7 +188,7 @@ public static function getBrowserLanguage(bool $forRedirect = true): string public static function getError(string $key, bool $fallback = true): string { // redefine - $key = \SpoonFilter::toCamelCase($key); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // if the error exists return it, if (isset(self::$err[$key])) { @@ -225,7 +226,7 @@ public static function getErrors(): array public static function getLabel(string $key, bool $fallback = true): string { // redefine - $key = \SpoonFilter::toCamelCase($key); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // if the error exists return it, if (isset(self::$lbl[$key])) { @@ -263,7 +264,7 @@ public static function getLabels(): array public static function getMessage(string $key, bool $fallback = true): string { // redefine - $key = \SpoonFilter::toCamelCase($key); + $key = s($key)->replace('_', ' ')->camel()->title()->toString(); // if the error exists return it, if (isset(self::$msg[$key])) { diff --git a/src/Frontend/Modules/Blog/Actions/Archive.php b/src/Frontend/Modules/Blog/Actions/Archive.php index 94aa52f103..87598e465d 100644 --- a/src/Frontend/Modules/Blog/Actions/Archive.php +++ b/src/Frontend/Modules/Blog/Actions/Archive.php @@ -11,6 +11,7 @@ use Frontend\Modules\Blog\Engine\Model as FrontendBlogModel; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function Symfony\Component\String\s; class Archive extends FrontendBaseBlock { @@ -166,7 +167,7 @@ private function parse(): void private function setPageTitle(): void { - $this->header->setPageTitle(\SpoonFilter::ucfirst(FL::lbl('Archive'))); + $this->header->setPageTitle(s(FL::lbl('Archive'))->title()->toString()); $this->header->setPageTitle($this->startDate->format('Y')); if ($this->hasMonth) { $this->header->setPageTitle( @@ -177,7 +178,7 @@ private function setPageTitle(): void private function addPageToBreadcrumb(): void { - $this->breadcrumb->addElement(\SpoonFilter::ucfirst(FL::lbl('Archive'))); + $this->breadcrumb->addElement(s(FL::lbl('Archive'))->title()->toString()); $this->breadcrumb->addElement($this->startDate->format('Y')); if ($this->hasMonth) { $this->breadcrumb->addElement( diff --git a/src/Frontend/Modules/Blog/Actions/Category.php b/src/Frontend/Modules/Blog/Actions/Category.php index e174de6270..85a5a9f0a5 100644 --- a/src/Frontend/Modules/Blog/Actions/Category.php +++ b/src/Frontend/Modules/Blog/Actions/Category.php @@ -7,6 +7,7 @@ use Frontend\Core\Engine\Navigation as FrontendNavigation; use Frontend\Modules\Blog\Engine\Model as FrontendBlogModel; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use function Symfony\Component\String\s; class Category extends FrontendBaseBlock { @@ -95,13 +96,13 @@ private function addLinkToRssFeed(): void private function addCategoryToBreadcrumb(): void { - $this->breadcrumb->addElement(\SpoonFilter::ucfirst(FL::lbl('Category'))); + $this->breadcrumb->addElement(s(FL::lbl('Category'))->title()->toString()); $this->breadcrumb->addElement($this->category['label']); } private function setPageTitle(): void { - $this->header->setPageTitle(\SpoonFilter::ucfirst(FL::lbl('Category'))); + $this->header->setPageTitle(s(FL::lbl('Category'))->title()->toString()); } private function parse(): void diff --git a/src/Frontend/Modules/Blog/Actions/CommentsRss.php b/src/Frontend/Modules/Blog/Actions/CommentsRss.php index 1666dd65fb..be93ae93fb 100644 --- a/src/Frontend/Modules/Blog/Actions/CommentsRss.php +++ b/src/Frontend/Modules/Blog/Actions/CommentsRss.php @@ -8,6 +8,7 @@ use Frontend\Core\Engine\Rss as FrontendRSS; use Frontend\Core\Engine\RssItem as FrontendRSSItem; use Frontend\Modules\Blog\Engine\Model as FrontendBlogModel; +use function Symfony\Component\String\s; /** * This is the RSS-feed with all the comments @@ -25,7 +26,7 @@ private function generateRss() { $blogPostComments = FrontendBlogModel::getAllComments(); $rss = new FrontendRSS( - \SpoonFilter::ucfirst(FL::msg('BlogAllComments')), + s(FL::msg('BlogAllComments'))->title()->toString(), SITE_URL . FrontendNavigation::getUrlForBlock($this->getModule()), '' ); diff --git a/src/Frontend/Modules/Blog/Actions/Detail.php b/src/Frontend/Modules/Blog/Actions/Detail.php index e1c05bbb2c..ac6e7cc617 100644 --- a/src/Frontend/Modules/Blog/Actions/Detail.php +++ b/src/Frontend/Modules/Blog/Actions/Detail.php @@ -11,6 +11,7 @@ use Frontend\Core\Engine\Navigation as FrontendNavigation; use Frontend\Modules\Blog\Engine\Model as FrontendBlogModel; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\Validator\Constraints as Assert; class Detail extends FrontendBaseBlock { @@ -251,8 +252,12 @@ private function buildForm(): void $author = $cookie->get('comment_author'); $email = ($cookie->has('comment_email') && filter_var($cookie->get('comment_email'), FILTER_VALIDATE_EMAIL)) ? $cookie->get('comment_email') : null; - $website = ($cookie->has('comment_website') && \SpoonFilter::isURL($cookie->get('comment_website'))) - ? $cookie->get('comment_website') : 'http://'; + $validationErrors = $this->get('validator')->validate( + $cookie->get('comment_website'), + new Assert\Url() + ); + $isValidUrl = count($validationErrors) === 0; + $website = ($cookie->has('comment_website') && $isValidUrl) ? $cookie->get('comment_website') : 'http://'; $this->form->addText('author', $author)->setAttributes(['required' => null]); $this->form->addText('email', $email)->setAttributes(['required' => null, 'type' => 'email']); diff --git a/src/Frontend/Modules/Blog/Actions/Rss.php b/src/Frontend/Modules/Blog/Actions/Rss.php index d3742873ba..6bd9ea9ba2 100644 --- a/src/Frontend/Modules/Blog/Actions/Rss.php +++ b/src/Frontend/Modules/Blog/Actions/Rss.php @@ -9,7 +9,7 @@ use Frontend\Core\Engine\RssItem as FrontendRSSItem; use Frontend\Core\Engine\User as FrontendUser; use Frontend\Modules\Blog\Engine\Model as FrontendBlogModel; -use SpoonFilter; +use function Symfony\Component\String\s; class Rss extends FrontendBaseBlock { @@ -108,7 +108,7 @@ private function getTagsDescription(array $tags): string return sprintf( '%1$s: %2$s
', - SpoonFilter::ucfirst(FL::lbl('Tags')), + s(FL::lbl('Tags'))->title()->toString(), implode( ', ', array_map( diff --git a/src/Frontend/Modules/FormBuilder/Widgets/Form.php b/src/Frontend/Modules/FormBuilder/Widgets/Form.php index c6d27660b4..6047cb684e 100644 --- a/src/Frontend/Modules/FormBuilder/Widgets/Form.php +++ b/src/Frontend/Modules/FormBuilder/Widgets/Form.php @@ -15,6 +15,8 @@ use ReCaptcha\RequestMethod\CurlPost; use SpoonFormAttributes; use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\Validator\Constraints as Assert; +use function Symfony\Component\String\s; /** * This is the form widget. @@ -84,7 +86,7 @@ private function createAction(): string } // normal parameter - if (\SpoonFilter::isInteger($key)) { + if (filter_var($key, FILTER_VALIDATE_INT) !== false) { $moduleParameters[] = $value; } else { // get parameter @@ -380,8 +382,8 @@ private function parse(): void } elseif (in_array($field['type'], ['checkbox', 'radiobutton'])) { // name (prefixed by type) $name = ($field['type'] === 'checkbox') ? - 'chk' . \SpoonFilter::toCamelCase($field['name']) : - 'rbt' . \SpoonFilter::toCamelCase($field['name']) + 'chk' . s($field['name'])->replace('_', ' ')->camel()->title()->toString() : + 'rbt' . s($field['name'])->replace('_', ' ')->camel()->title()->toString() ; // rebuild so the html is stored in a general name (and not rbtName) @@ -500,7 +502,13 @@ private function validateForm(): void } } elseif ($rule === 'time') { $regexTime = '/^(([0-1][0-9]|2[0-3]|[0-9])|([0-1][0-9]|2[0-3]|[0-9])(:|h)[0-5]?[0-9]?)$/'; - if (!\SpoonFilter::isValidAgainstRegexp($regexTime, $this->form->getField($fieldName)->getValue())) { + $validationErrors = $this->get('validator')->validate( + $this->form->getField($fieldName)->getValue(), + new Assert\Regex([ + 'pattern' => $regexTime, + ]) + ); + if (count($validationErrors) > 0) { $this->form->getField($fieldName)->setError($settings['error_message']); } } diff --git a/src/Frontend/Modules/Mailmotor/Domain/Subscription/SubscribeType.php b/src/Frontend/Modules/Mailmotor/Domain/Subscription/SubscribeType.php index d939dbb9d4..7cc0831e98 100644 --- a/src/Frontend/Modules/Mailmotor/Domain/Subscription/SubscribeType.php +++ b/src/Frontend/Modules/Mailmotor/Domain/Subscription/SubscribeType.php @@ -17,6 +17,7 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use function Symfony\Component\String\s; class SubscribeType extends AbstractType { @@ -54,7 +55,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'required' => true, 'label' => 'lbl.Email', 'attr' => [ - 'placeholder' => \SpoonFilter::ucfirst(Language::lbl('YourEmail')), + 'placeholder' => s(Language::lbl('YourEmail'))->title()->toString(), ], ] ); @@ -75,7 +76,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'subscribe', SubmitType::class, [ - 'label' => \SpoonFilter::ucfirst(Language::lbl('Subscribe')), + 'label' => s(Language::lbl('Subscribe'))->title()->toString(), ] ); } diff --git a/src/Frontend/Modules/Mailmotor/Domain/Subscription/UnsubscribeType.php b/src/Frontend/Modules/Mailmotor/Domain/Subscription/UnsubscribeType.php index d69037a2a2..a36eebc9f8 100644 --- a/src/Frontend/Modules/Mailmotor/Domain/Subscription/UnsubscribeType.php +++ b/src/Frontend/Modules/Mailmotor/Domain/Subscription/UnsubscribeType.php @@ -9,6 +9,7 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use function Symfony\Component\String\s; class UnsubscribeType extends AbstractType { @@ -21,14 +22,14 @@ public function buildForm(FormBuilderInterface $builder, array $options): void 'required' => true, 'label' => 'lbl.Email', 'attr' => [ - 'placeholder' => \SpoonFilter::ucfirst(Language::lbl('YourEmail')), + 'placeholder' => s(Language::lbl('YourEmail'))->title()->toString(), ], ] )->add( 'unsubscribe', SubmitType::class, [ - 'label' => \SpoonFilter::ucfirst(Language::lbl('Unsubscribe')), + 'label' => s(Language::lbl('Unsubscribe'))->title()->toString(), ] ); } diff --git a/src/Frontend/Modules/Profiles/Actions/Login.php b/src/Frontend/Modules/Profiles/Actions/Login.php index db823d5931..e6bca422c7 100644 --- a/src/Frontend/Modules/Profiles/Actions/Login.php +++ b/src/Frontend/Modules/Profiles/Actions/Login.php @@ -9,6 +9,7 @@ use Frontend\Core\Engine\Navigation as FrontendNavigation; use Frontend\Modules\Profiles\Engine\Authentication as FrontendProfilesAuthentication; use Frontend\Modules\Profiles\Engine\Model as FrontendProfilesModel; +use function Symfony\Component\String\s; class Login extends FrontendBaseBlock { @@ -85,7 +86,7 @@ private function validateForm(): bool if ($loginStatus !== FrontendProfilesAuthentication::LOGIN_ACTIVE) { $errorString = sprintf( - FL::getError('Profiles' . \SpoonFilter::toCamelCase($loginStatus) . 'Login'), + FL::getError('Profiles' . s($loginStatus)->replace('_', ' ')->camel()->title() . 'Login'), FrontendNavigation::getUrlForBlock('Profiles', 'ResendActivation') ); diff --git a/src/Frontend/Modules/Profiles/Actions/Settings.php b/src/Frontend/Modules/Profiles/Actions/Settings.php index 5390142352..d0a6056e60 100644 --- a/src/Frontend/Modules/Profiles/Actions/Settings.php +++ b/src/Frontend/Modules/Profiles/Actions/Settings.php @@ -12,6 +12,7 @@ use Frontend\Modules\Profiles\Engine\Profile; use Symfony\Component\Intl\Countries; use Symfony\Component\Security\Core\Exception\InsufficientAuthenticationException; +use function Symfony\Component\String\s; class Settings extends FrontendBaseBlock { @@ -43,8 +44,8 @@ public function execute(): void private function getGenderOptions(): array { return [ - 'male' => \SpoonFilter::ucfirst(FL::getLabel('Male')), - 'female' => \SpoonFilter::ucfirst(FL::getLabel('Female')), + 'male' => s(FL::getLabel('Male'))->title()->toString(), + 'female' => s(FL::getLabel('Female'))->title()->toString(), ]; } diff --git a/src/Frontend/Modules/Profiles/Engine/Model.php b/src/Frontend/Modules/Profiles/Engine/Model.php index 4a21fb9a6d..7f884c897c 100644 --- a/src/Frontend/Modules/Profiles/Engine/Model.php +++ b/src/Frontend/Modules/Profiles/Engine/Model.php @@ -301,7 +301,7 @@ public static function getSettings(int $profileId): array public static function getUrl(string $displayName, ?int $excludedId = null): string { // decode special chars - $displayName = \SpoonFilter::htmlspecialcharsDecode($displayName); + $displayName = htmlspecialchars_decode($displayName); // urlise $url = CommonUri::getUrl($displayName); diff --git a/src/Frontend/Modules/Search/Actions/Index.php b/src/Frontend/Modules/Search/Actions/Index.php index 8289619429..9c9463969f 100644 --- a/src/Frontend/Modules/Search/Actions/Index.php +++ b/src/Frontend/Modules/Search/Actions/Index.php @@ -162,7 +162,7 @@ private function getCanonicalUrl(string $query): string return $canonicalUrl; } - return $canonicalUrl . '?q=' . \SpoonFilter::htmlspecialchars($query); + return $canonicalUrl . '?q=' . htmlspecialchars($query); } private function parse(): void diff --git a/src/Frontend/Modules/Search/Ajax/Autocomplete.php b/src/Frontend/Modules/Search/Ajax/Autocomplete.php index 1cc7fdf7c4..23ecbf0a97 100644 --- a/src/Frontend/Modules/Search/Ajax/Autocomplete.php +++ b/src/Frontend/Modules/Search/Ajax/Autocomplete.php @@ -16,10 +16,8 @@ public function execute(): void { parent::execute(); - $charset = $this->getContainer()->getParameter('kernel.charset'); - $searchTerm = $this->getRequest()->request->get('term', ''); - $term = ($charset === 'utf-8') - ? \SpoonFilter::htmlspecialchars($searchTerm) : \SpoonFilter::htmlentities($searchTerm); + $searchTerm = (string) $this->getRequest()->request->get('term', ''); + $term = htmlspecialchars($searchTerm); $limit = (int) $this->get('fork.settings')->get('Search', 'autocomplete_num_items', 10); if ($term === '') { diff --git a/src/Frontend/Modules/Search/Ajax/Autosuggest.php b/src/Frontend/Modules/Search/Ajax/Autosuggest.php index 33f3099310..4a77289637 100644 --- a/src/Frontend/Modules/Search/Ajax/Autosuggest.php +++ b/src/Frontend/Modules/Search/Ajax/Autosuggest.php @@ -172,10 +172,8 @@ function (array $searchResult) use ($charset) { private function validateForm(): void { // set values - $charset = $this->getContainer()->getParameter('kernel.charset'); - $searchTerm = $this->getRequest()->request->get('term', ''); - $this->searchTerm = ($charset === 'utf-8') - ? \SpoonFilter::htmlspecialchars($searchTerm) : \SpoonFilter::htmlentities($searchTerm); + $searchTerm = (string) $this->getRequest()->request->get('term', ''); + $this->searchTerm = htmlspecialchars($searchTerm); $this->autoSuggestItemLength = $this->getRequest()->request->getInt('length', 50); } } diff --git a/src/Frontend/Modules/Search/Ajax/Livesuggest.php b/src/Frontend/Modules/Search/Ajax/Livesuggest.php index dcf116430f..4d61e9ca2c 100644 --- a/src/Frontend/Modules/Search/Ajax/Livesuggest.php +++ b/src/Frontend/Modules/Search/Ajax/Livesuggest.php @@ -309,9 +309,7 @@ private function parsePagination(): void private function validateForm(): void { - $charset = $this->getContainer()->getParameter('kernel.charset'); - $searchTerm = $this->getRequest()->request->get('term', ''); - $this->searchTerm = ($charset === 'utf-8') - ? \SpoonFilter::htmlspecialchars($searchTerm) : \SpoonFilter::htmlentities($searchTerm); + $searchTerm = (string) $this->getRequest()->request->get('term', ''); + $this->searchTerm = htmlspecialchars($searchTerm); } } diff --git a/src/Frontend/Modules/Search/Ajax/Save.php b/src/Frontend/Modules/Search/Ajax/Save.php index 3b364ec7c3..d7f5a54df8 100644 --- a/src/Frontend/Modules/Search/Ajax/Save.php +++ b/src/Frontend/Modules/Search/Ajax/Save.php @@ -16,10 +16,8 @@ public function execute(): void { parent::execute(); - $charset = $this->getContainer()->getParameter('kernel.charset'); - $searchTerm = $this->getRequest()->request->get('term', ''); - $term = ($charset === 'utf-8') - ? \SpoonFilter::htmlspecialchars($searchTerm) : \SpoonFilter::htmlentities($searchTerm); + $searchTerm = (string) $this->getRequest()->request->get('term', ''); + $term = htmlspecialchars($searchTerm); if ($term === '') { $this->output(Response::HTTP_BAD_REQUEST, null, 'term-parameter is missing.'); diff --git a/src/Frontend/Modules/Tags/Engine/Model.php b/src/Frontend/Modules/Tags/Engine/Model.php index 0d28be2976..cd2a731d85 100644 --- a/src/Frontend/Modules/Tags/Engine/Model.php +++ b/src/Frontend/Modules/Tags/Engine/Model.php @@ -8,6 +8,7 @@ use Frontend\Core\Engine\Navigation as FrontendNavigation; use Frontend\Core\Language\Language; use Frontend\Core\Language\Locale as FrontendLocale; +use function Symfony\Component\String\s; /** * In this file we store all generic functions that we will be using in the tags module @@ -263,7 +264,7 @@ public static function getItemsForTagAndModule(int $id, string $module): array return [ 'name' => $module, - 'label' => Language::lbl(\SpoonFilter::ucfirst($module)), + 'label' => Language::lbl(s($module)->title()->toString()), 'items' => $items, ]; } diff --git a/tests/data/test_db.sql b/tests/data/test_db.sql index 1e7838e958..5ccefee07a 100644 --- a/tests/data/test_db.sql +++ b/tests/data/test_db.sql @@ -2476,7 +2476,6 @@ VALUES ('Core','theme','s:9:\"Bootstrap\";'), ('Core','google_maps_key','s:0:\"\";'), ('Core','max_num_revisions','i:20;'), - ('Core','site_domains','a:1:{i:0;s:13:\"fork.dev:8088\";}'), ('Core','site_html_head','s:0:\"\";'), ('Core','site_html_start_of_body','s:0:\"\";'), ('Core','site_html_end_of_body','s:0:\"\";'),