Skip to content

Commit

Permalink
Merge branch 'release/3.1.48' into v3
Browse files Browse the repository at this point in the history
  • Loading branch information
Andrew Welch committed Feb 27, 2021
2 parents 4565603 + f024165 commit 320aa9a
Show file tree
Hide file tree
Showing 22 changed files with 165 additions and 41 deletions.
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Retour Changelog

## 3.1.48 - 2021.02.27
### Added
* Added support for both 8.x and 9.x versions of `league/csv` for peer compatibility
* PHP 8 compatibility for the import/export functions via `league/csv` version `^9.0`

### Changed
* Ensure the URLs are siteUrls and not cpUrls in the Redirects table “go” arrow

## 3.1.47 - 2021.02.22
### Changed
* Updated build system infra
Expand Down
4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "nystudio107/craft-retour",
"description": "Retour allows you to intelligently redirect legacy URLs, so that you don't lose SEO value when rebuilding & restructuring a website",
"type": "craft-plugin",
"version": "3.1.47",
"version": "3.1.48",
"keywords": [
"craftcms",
"craft-plugin",
Expand All @@ -28,7 +28,7 @@
},
"require": {
"craftcms/cms": "^3.0.0",
"league/csv": "^8.2"
"league/csv": "^8.2 || ^9.0"
},
"autoload": {
"psr-4": {
Expand Down
2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/css/styles.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/dashboard.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified src/assetbundles/retour/dist/js/dashboard.js.gz
Binary file not shown.
2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/import.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/assetbundles/retour/dist/js/redirects.js

Large diffs are not rendered by default.

Binary file modified src/assetbundles/retour/dist/js/redirects.js.gz
Binary file not shown.
2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/redirects.js.map

Large diffs are not rendered by default.

Binary file modified src/assetbundles/retour/dist/js/redirects.js.map.gz
Binary file not shown.
2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/retour.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/runtime.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/assetbundles/retour/dist/js/vendors.js

Large diffs are not rendered by default.

Binary file modified src/assetbundles/retour/dist/js/vendors.js.gz
Binary file not shown.
2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/vendors.js.map

Large diffs are not rendered by default.

Binary file modified src/assetbundles/retour/dist/js/vendors.js.map.gz
Binary file not shown.
2 changes: 1 addition & 1 deletion src/assetbundles/retour/dist/js/widget.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/assetbundles/retour/dist/report-legacy.html

Large diffs are not rendered by default.

9 changes: 7 additions & 2 deletions src/assetbundles/retour/src/vue/RedirectsTable.vue
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,13 @@
if (value === '') {
return '';
}
return `
<a class="go" href="${value}" title="${value}" target="_blank" rel="noopener">${value}</a>
let url = value;
let absoluteUrl = new RegExp('^(?:[a-z]+:)?//', 'i');
if (!absoluteUrl.test(url) && !url.includes('$')) {
url = Craft.getSiteUrl(Craft.trim(value, '/'));
}
return `
<a class="go" href="${url}" title="${url}" target="_blank" rel="noopener">${value}</a>
`;
},
deleteRedirectFormatter(value) {
Expand Down
94 changes: 74 additions & 20 deletions src/controllers/FileController.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use nystudio107\retour\assetbundles\retour\RetourImportAsset;
use nystudio107\retour\helpers\MultiSite as MultiSiteHelper;
use nystudio107\retour\helpers\Permission as PermissionHelper;
use nystudio107\retour\helpers\Version as VersionHelper;

use Craft;
use craft\db\Query;
Expand All @@ -26,7 +27,9 @@
use yii\web\Response;
use yii\web\UploadedFile;

use League\Csv\AbstractCsv;
use League\Csv\Reader;
use League\Csv\Statement;
use League\Csv\Writer;

/**
Expand Down Expand Up @@ -115,26 +118,17 @@ public function actionImportCsvColumns()
}
// If we have headers, then we have a file, so parse it
if ($headers !== null) {
$csv->setOffset(1);
$columns = ArrayHelper::filterEmptyStringsFromArray($columns);
$csv->each(function ($row) use ($headers, $columns) {
$redirectConfig = [
'id' => 0,
];
$index = 0;
foreach (self::IMPORT_REDIRECTS_CSV_FIELDS as $importField) {
if (isset($columns[$index], $headers[$columns[$index]])) {
$redirectConfig[$importField] = empty($row[$headers[$columns[$index]]])
? null
: $row[$headers[$columns[$index]]];
}
$index++;
}
Craft::debug('Importing row: '.print_r($redirectConfig, true), __METHOD__);
Retour::$plugin->redirects->saveRedirect($redirectConfig);

return true;
});
switch (VersionHelper::getLeagueCsvVersion()) {
case 8:
$this->importCsvApi8($csv, $columns, $headers);
break;
case 9:
$this->importCsvApi9($csv, $columns, $headers);
break;
default:
Craft::$app->getSession()->setNotice(Craft::t('retour', 'Unknown league/csv package API version'));
break;
}
@unlink($filename);
Retour::$plugin->clearAllCaches();
Craft::$app->getSession()->setNotice(Craft::t('retour', 'Redirects imported from CSV file.'));
Expand Down Expand Up @@ -277,4 +271,64 @@ protected function exportCsvFile(string $filename, string $table, array $columns
$csv->output($filename.'.csv');
exit(0);
}

/**
* @param AbstractCsv $csv
* @param array $columns
* @param array $headers
*/
protected function importCsvApi8(AbstractCsv $csv, array $columns, array $headers)
{
$csv->setOffset(1);
$columns = ArrayHelper::filterEmptyStringsFromArray($columns);
$csv->each(function ($row) use ($headers, $columns) {
$redirectConfig = [
'id' => 0,
];
$index = 0;
foreach (self::IMPORT_REDIRECTS_CSV_FIELDS as $importField) {
if (isset($columns[$index], $headers[$columns[$index]])) {
$redirectConfig[$importField] = empty($row[$headers[$columns[$index]]])
? null
: $row[$headers[$columns[$index]]];
}
$index++;
}
Craft::debug('Importing row: ' . print_r($redirectConfig, true), __METHOD__);
Retour::$plugin->redirects->saveRedirect($redirectConfig);

return true;
});
}

/**
* @param AbstractCsv $csv
* @param array $columns
* @param array $headers
* @throws \League\Csv\Exception
*/
protected function importCsvApi9(AbstractCsv $csv, array $columns, array $headers)
{
$stmt = (new Statement())
->offset(1)
;
$rows = $stmt->process($csv);
$columns = ArrayHelper::filterEmptyStringsFromArray($columns);
foreach ($rows as $row) {
$redirectConfig = [
'id' => 0,
];
$index = 0;
foreach (self::IMPORT_REDIRECTS_CSV_FIELDS as $importField) {
if (isset($columns[$index], $headers[$columns[$index]])) {
$redirectConfig[$importField] = empty($row[$headers[$columns[$index]]])
? null
: $row[$headers[$columns[$index]]];
}
$index++;
}
Craft::debug('Importing row: ' . print_r($redirectConfig, true), __METHOD__);
Retour::$plugin->redirects->saveRedirect($redirectConfig);
}
}
}
57 changes: 57 additions & 0 deletions src/helpers/Version.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php
/**
* Retour plugin for Craft CMS 3.x
*
* Retour allows you to intelligently redirect legacy URLs, so that you don't
* lose SEO value when rebuilding & restructuring a website
*
* @link https://nystudio107.com/
* @copyright Copyright (c) 2021 nystudio107
*/

namespace nystudio107\retour\helpers;

use \Composer\InstalledVersions;
use \Composer\Semver\Semver;

/**
* @author nystudio107
* @package Retour
* @since 3.1.48
*/
class Version
{
// Constants
// =========================================================================

const LEAGUE_CSV_PACKAGE = 'league/csv';

// Public Static Methods
// =========================================================================

/**
* Return the API version for `league/csv` package
*
* @return int API version (or 0 for not installed)
*/
public static function getLeagueCsvVersion(): int
{
$version = 0;
$installedVersion = null;
try {
$installedVersion = InstalledVersions::getVersion(self::LEAGUE_CSV_PACKAGE);
} catch (\Throwable $e) {
// That's fine
}
if ($installedVersion) {
if (Semver::satisfies($installedVersion, '^8.0.0')) {
$version = 8;
}
if (Semver::satisfies($installedVersion, '^9.0.0')) {
$version = 9;
}
}

return $version;
}
}
6 changes: 3 additions & 3 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
"outDir": "./src/assetbundles/retour/dist/",
"paths": {
"@/*": [
"./src/*"
"./src/assetbundles/retour/src/*"
]
},
"resolveJsonModule": true,
Expand All @@ -30,8 +30,8 @@
]
},
"include": [
"./src/**/*.ts",
"./src/**/*.vue"
"./src/assetbundles/retour/src/**/*.ts",
"./src/assetbundles/retour/src/**/*.vue"
],
"exclude": [
"./node_modules"
Expand Down

0 comments on commit 320aa9a

Please sign in to comment.