Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ENH PHP 8.1 compatibility #763

Merged
merged 1 commit into from
Apr 25, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Control/LocaleAdmin.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public function getClientConfig()
'code' => $locale->getLocale(),
'title' => $locale->getTitle(),
];
}, Locale::getCached()->toArray()),
}, Locale::getCached()->toArray() ?? []),
'locale' => FluentState::singleton()->getLocale(),
'param' => FluentDirectorExtension::config()->get('query_param'),
]
Expand Down
6 changes: 3 additions & 3 deletions src/Extension/FluentDirectorExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ protected function getExplicitRoutes($originalRules)
$url = $localeObj->getURLSegment();

// apply encode so we could route urls that contain multi-byte charaters
$url = urlencode($url);
$url = urlencode($url ?? '');

// Apply to nested page url
$controller = $this->getRuleController($originalRules['$URLSegment//$Action/$ID/$OtherID'], $localeObj);
Expand Down Expand Up @@ -166,9 +166,9 @@ protected function getRuleController($existingRule, $localeObj)
*/
protected function insertRuleBefore(array $rules, $key, array $rule, $prependIfMissing = true)
{
$i = array_search($key, array_keys($rules));
$i = array_search($key, array_keys($rules ?? []));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume array param type precludes null values. Is that not true in 8.1 anymore?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, so it's more to do with changes to internal function arguments than typehints, apparently. I think in this case we can rely on the typehint. :)

if ($i !== false) {
return array_slice($rules, 0, $i, true) + $rule + array_slice($rules, $i, null, true);
return array_slice($rules ?? [], 0, $i, true) + $rule + array_slice($rules ?? [], $i ?? 0, null, true);
} elseif ($prependIfMissing) {
$rules = $rule + $rules;
}
Expand Down
36 changes: 18 additions & 18 deletions src/Extension/FluentExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ protected function isFieldLocalised($field, $type, $class)
return false;
}
if ($filter && is_array($filter)) {
return in_array($field, $filter);
return in_array($field, $filter ?? []);
}

// Named blacklist
Expand Down Expand Up @@ -249,7 +249,7 @@ public function getLocalisedTables()

// Mark this table as translatable
$table = DataObject::getSchema()->tableName($class);
$includedTables[$table] = array_keys($translatedFields);
$includedTables[$table] = array_keys($translatedFields ?? []);
}
return $includedTables;
}
Expand All @@ -265,11 +265,11 @@ public function getLocalisedTables()
protected function anyMatch($value, $patterns)
{
// Test both explicit value, as well as the value stripped of any trailing parameters
$valueBase = preg_replace('/\(.*/', '', $value);
$valueBase = preg_replace('/\(.*/', '', $value ?? '');
foreach ($patterns as $pattern) {
if (strpos($pattern, '/') === 0) {
if (strpos($pattern ?? '', '/') === 0) {
// Assume value prefaced with '/' are regexp
if (preg_match($pattern, $value) || preg_match($pattern, $valueBase)) {
if (preg_match($pattern ?? '', $value ?? '') || preg_match($pattern ?? '', $valueBase ?? '')) {
return true;
}
} else {
Expand Down Expand Up @@ -352,7 +352,7 @@ protected function validateChildConfig()
'extensions',
Config::EXCLUDE_EXTRA_SOURCES | Config::UNINHERITED
) ?: [];
$extensions = array_filter(array_values($extensions));
$extensions = array_filter(array_values($extensions ?? []));
foreach ($extensions as $extension) {
$extensionClass = Extension::get_classname_without_arguments($extension);
if (is_a($extensionClass, self::class, true)) {
Expand Down Expand Up @@ -460,11 +460,11 @@ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
$localisedColumn = str_replace(
"\"{$field}\"",
"\"{$table}\".\"{$field}\"",
$localisedColumn
$localisedColumn ?? ''
);
}
// Apply substitutions
$localisedColumn = str_replace($conditionSearch, $conditionReplace, $localisedColumn);
$localisedColumn = str_replace($conditionSearch ?? '', $conditionReplace ?? '', $localisedColumn ?? '');
if ($column !== $localisedColumn) {
// Wrap sort in group to prevent dataquery messing it up
unset($order[$column]);
Expand All @@ -488,12 +488,12 @@ public function augmentSQL(SQLSelect $query, DataQuery $dataQuery = null)
$parameters = array();
$predicate = $condition->conditionSQL($parameters);
} else {
$parameters = array_values(reset($condition));
$predicate = key($condition);
$parameters = array_values(reset($condition) ?? []);
$predicate = key($condition ?? []);
}

// Apply substitutions
$localisedPredicate = str_replace($conditionSearch, $conditionReplace, $predicate);
$localisedPredicate = str_replace($conditionSearch ?? '', $conditionReplace ?? '', $predicate ?? '');

$where[$index] = [
$localisedPredicate => $parameters
Expand Down Expand Up @@ -581,8 +581,8 @@ protected function localiseManipulationTable(&$manipulation, $table, $localeTabl

// Filter fields by localised fields
$localisedUpdate['fields'] = array_intersect_key(
$updates['fields'],
array_combine($localisedFields, $localisedFields)
$updates['fields'] ?? [],
array_combine($localisedFields ?? [], $localisedFields ?? [])
);
unset($localisedUpdate['fields']['id']);

Expand Down Expand Up @@ -938,7 +938,7 @@ public function updateCMSFields(FieldList $fields)
// If the translated field has an ID suffix also check for the non-suffixed version
// E.g. UploadField()
$field = $fields->dataFieldByName($translatedField);
if (!$field && preg_match('/^(?<field>\w+)ID$/', $translatedField, $matches)) {
if (!$field && preg_match('/^(?<field>\w+)ID$/', $translatedField ?? '', $matches)) {
$field = $fields->dataFieldByName($matches['field']);
}
if (!$field || $field->hasClass('fluent__localised-field')) {
Expand Down Expand Up @@ -985,24 +985,24 @@ protected function requireSavedInLocale()
protected function detectLocalisedTableField($tables, $sql)
{
// Check explicit "table"."field" within the fragment
if (preg_match('/"(?<table>[\w\\\\]+)"\."(?<field>\w+)"/i', $sql, $matches)) {
if (preg_match('/"(?<table>[\w\\\\]+)"\."(?<field>\w+)"/i', $sql ?? '', $matches)) {
$table = $matches['table'];
$field = $matches['field'];

// Ensure both table and this field are valid
if (empty($tables[$table]) || !in_array($field, $tables[$table])) {
if (empty($tables[$table]) || !in_array($field, $tables[$table] ?? [])) {
return [null, null, false];
}
return [$table, $field, true];
}

// Check sole "field" without table specifier ("name" without leading or trailing '.')
if (preg_match('/(?<![.])"(?<field>\w+)"(?![.])/i', $sql, $matches)) {
if (preg_match('/(?<![.])"(?<field>\w+)"(?![.])/i', $sql ?? '', $matches)) {
$field = $matches['field'];

// Check if this field is in any of the tables, and just pick any that match
foreach ($tables as $table => $fields) {
if (in_array($field, $fields)) {
if (in_array($field, $fields ?? [])) {
return [$table, $field, false];
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/Extension/FluentFilteredExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,10 +167,10 @@ protected function getModeIsStage()
$readingMode = Versioned::get_reading_mode();
$draft = Versioned::DRAFT;

if (strlen($readingMode) === 0) {
if (strlen($readingMode ?? '') === 0) {
$readingMode = Versioned::DEFAULT_MODE;
}

return substr_compare($readingMode, $draft, strlen($readingMode) - strlen($draft), strlen($draft)) === 0;
return substr_compare($readingMode ?? '', $draft ?? '', strlen($readingMode ?? '') - strlen($draft ?? ''), strlen($draft ?? '')) === 0;
}
}
2 changes: 1 addition & 1 deletion src/Extension/FluentSiteTreeExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public function updateRelativeLink(&$base, &$action)
if (!$this->owner->exists()) {
$base = Controller::join_links(
$base,
'?' . FluentDirectorExtension::config()->get('query_param') . '=' . urlencode($localeObj->Locale)
'?' . FluentDirectorExtension::config()->get('query_param') . '=' . urlencode($localeObj->Locale ?? '')
);
return;
}
Expand Down
4 changes: 2 additions & 2 deletions src/Extension/FluentVersionedExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ public function augmentWrite(&$manipulation)
if ($suffix === self::SUFFIX_VERSIONS) {
$localisedVersionFields = array_merge(
$localisedVersionFields,
array_keys($this->defaultVersionsFields)
array_keys($this->defaultVersionsFields ?? [])
);
}

Expand Down Expand Up @@ -428,7 +428,7 @@ public static function prepoulateIdsInLocale($locale, $dataObjectClass, $populat
$ids = $result->column('RecordID');

// We need to execute ourselves as the param is lost from the subSelect
self::$idsInLocaleCache[$locale][$table] = array_combine($ids, $ids);
self::$idsInLocaleCache[$locale][$table] = array_combine($ids ?? [], $ids ?? []);
self::$idsInLocaleCache[$locale][$table]['_complete'] = true;
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/Middleware/InitStateMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,10 @@ public function getIsFrontend(HTTPRequest $request)
{
$adminPaths = static::config()->get('admin_url_paths');
$adminPaths[] = AdminRootController::config()->get('url_base') . '/';
$currentPath = rtrim($request->getURL(), '/') . '/';
$currentPath = rtrim($request->getURL() ?? '', '/') . '/';

foreach ($adminPaths as $adminPath) {
if (substr($currentPath, 0, strlen($adminPath)) === $adminPath) {
if (substr($currentPath ?? '', 0, strlen($adminPath ?? '')) === $adminPath) {
return false;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/Model/CachableModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ protected static function databaseIsReady()
}

$objFields = $object->getSchema()->databaseFields($object, false);
$missingFields = array_diff_key($objFields, $dbFields);
$missingFields = array_diff_key($objFields ?? [], $dbFields);

if ($missingFields) {
return false;
Expand Down
4 changes: 2 additions & 2 deletions src/Model/Locale.php
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ public function getDefaultLocale()
*/
public function getLocaleSuffix()
{
$bits = explode('_', $this->Locale);
$bits = explode('_', $this->Locale ?? '');
return array_pop($bits);
}

Expand Down Expand Up @@ -350,7 +350,7 @@ public static function getByLocale($locale)
*/
public function isLocale($locale)
{
return stripos(i18n::convert_rfc1766($locale), i18n::convert_rfc1766($this->Locale)) === 0;
return stripos(i18n::convert_rfc1766($locale) ?? '', i18n::convert_rfc1766($this->Locale) ?? '') === 0;
}

/**
Expand Down
8 changes: 4 additions & 4 deletions src/Search/FluentSearchForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@ public function getResults()
];
foreach ($keyword_patterns as $k_p) {
$keywords = preg_replace_callback(
$k_p['patterns'],
$k_p['patterns'] ?? '',
$k_p['callback'],
$keywords
$keywords ?? ''
);
}

Expand All @@ -70,10 +70,10 @@ public function getResults()
ORDER BY Relevance DESC
SQL;
$params = [
str_replace(['*', '+', '-'], '', $keywords),
str_replace(['*', '+', '-'], '', $keywords ?? ''),
$current_locale,
$keywords,
htmlentities($keywords, ENT_NOQUOTES, 'UTF-8')
htmlentities($keywords ?? '', ENT_NOQUOTES, 'UTF-8')
];
// Generate results list
$sitetree_objects = SiteTree::get()
Expand Down
6 changes: 3 additions & 3 deletions src/State/BrowserLocaleDetector.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,14 @@ public function detectLocale(HTTPRequest $request)
// break up string into pieces (languages and q factors)
preg_match_all(
'/(?<code>[a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(?<priority>1|0\.[0-9]+))?/i',
$inputLocales,
$inputLocales ?? '',
$parsedLocales
);

$prioritisedLocales = [];
if (count($parsedLocales['code'])) {
if (count($parsedLocales['code'] ?? [])) {
// create a list like "en" => 0.8
$parsedLocales = array_combine($parsedLocales['code'], $parsedLocales['priority']);
$parsedLocales = array_combine($parsedLocales['code'] ?? [], $parsedLocales['priority'] ?? []);

// Generate nested list of priorities => [locales]
foreach ($parsedLocales as $locale => $priority) {
Expand Down
2 changes: 1 addition & 1 deletion src/Task/ConvertTranslatableTask.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public function fluentClasses()
}
}
}
return array_unique($classes);
return array_unique($classes ?? []);
}

public function run($request)
Expand Down
4 changes: 2 additions & 2 deletions tests/php/Extension/FluentDirectorExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ protected function setUpRoutes()
$rules = Director::config()->rules;

// Modify the rule for our test controller to include the locale parameter
$i = array_search('admin', array_keys($rules));
$i = array_search('admin', array_keys($rules ?? []));
if ($i !== false) {
$rule = [
'nouvelle-z%C3%A9lande/TestController//$Action/$ID/$OtherID' => [
Expand All @@ -103,7 +103,7 @@ protected function setUpRoutes()
]
];

$rules = array_slice($rules, 0, $i, true) + $rule + array_slice($rules, $i, null, true);
$rules = array_slice($rules ?? [], 0, $i, true) + $rule + array_slice($rules ?? [], $i ?? 0, null, true);
} else {
throw new \Exception('Could not find "admin" url rule');
}
Expand Down
2 changes: 1 addition & 1 deletion tests/php/Extension/FluentSiteTreeExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,7 @@ public function testUpdateCMSActionsDrafted()

$this->assertEquals('Saved', $actionSave->Title());
// The default value changed between SS 4.0 and 4.1 - assert it contains Publish instead of exact matching
$this->assertStringContainsString('publish', strtolower($actionPublish->Title()));
$this->assertStringContainsString('publish', strtolower($actionPublish->Title() ?? ''));
}

/**
Expand Down
2 changes: 1 addition & 1 deletion tests/php/Middleware/Stub/DetectLocaleMiddlewareSpy.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class DetectLocaleMiddlewareSpy extends DetectLocaleMiddleware implements TestOn
{
public function __call($method, $arguments)
{
if (method_exists($this, $method)) {
if (method_exists($this, $method ?? '')) {
return $this->$method(...$arguments);
}
}
Expand Down