Skip to content

Commit

Permalink
Fixed issue #15663: Resources Manager does not import subfolders from…
Browse files Browse the repository at this point in the history
… zip file
  • Loading branch information
ptelu committed Jul 12, 2021
1 parent c4adbac commit 71c4022
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 86 deletions.
5 changes: 1 addition & 4 deletions application/controllers/SurveyAdministrationController.php
Expand Up @@ -655,10 +655,7 @@ public function actionImportsurveyresources()
$aData['display']['menu_bars']['surveysummary'] = true;

$this->aData = $aData;
$this->render('importSurveyResources_view', [
'aErrorFilesInfo' => $this->aData['aErrorFilesInfo'],
'aImportedFilesInfo' => $this->aData['aImportedFilesInfo'],
]);
$this->render('importSurveyResources_view', $this->aData);
}
}

Expand Down
78 changes: 52 additions & 26 deletions application/models/services/FilterImportedResources.php
Expand Up @@ -14,55 +14,81 @@ class FilterImportedResources
*/
public function filterImportedResources($extractdir, $destdir)
{
$aErrorFilesInfo = array();
$aImportedFilesInfo = array();
$aErrorFilesInfo = [];
$aImportedFilesInfo = [];

if (!is_dir($extractdir)) {
return array(array(), array());
return [[], []];
}

if (!is_dir($destdir)) {
mkdir($destdir);
$directory = opendir($extractdir);
if (!$directory) {
$aErrorFilesInfo[] = [
"filename" => '',
"status" => gT("Extracted files not found - maybe a permission problem?")
];
return [$aImportedFilesInfo, $aErrorFilesInfo];
}

$dh = opendir($extractdir);
if (!$dh) {
$aErrorFilesInfo[] = array(
"filename" => '',
"status" => gT("Extracted files not found - maybe a permission problem?")
);
return array($aImportedFilesInfo, $aErrorFilesInfo);
return $this->copyDirectory($directory, $extractdir, $destdir);
}

/**
* Copy $directory to $destdir and return [$aImportedFilesInfo, $aErrorFilesInfo]
* @param resource $directory
* @param string $extractdir
* @param string $destdir
*
* @return array An array of failed and imported files/directories
*/
private function copyDirectory($directory, $extractdir, $destdir): array
{
$aImportedFilesInfo = [];
$aErrorFilesInfo = [];

if (!is_dir($destdir) && !mkdir($destdir) && !is_dir($destdir)) {
$aErrorFilesInfo[] = [
"filename" => $destdir,
"status" => gT("Could not create directory")
];
}
while ($direntry = readdir($dh)) {
if ($direntry != "." && $direntry != "..") {
while ($direntry = readdir($directory)) {
if ($direntry !== "." && $direntry !== "..") {
if (is_file($extractdir . "/" . $direntry)) {
// is a file
$extfile = (string) substr(strrchr($direntry, '.'), 1);
$extfile = (string)substr(strrchr($direntry, '.'), 1);
if (!(stripos(',' . \Yii::app()->getConfig('allowedresourcesuploads') . ',', ',' . $extfile . ',') === false)) {
// Extension allowed
if (!copy($extractdir . "/" . $direntry, $destdir . "/" . $direntry)) {
$aErrorFilesInfo[] = array(
$aErrorFilesInfo[] = [
"filename" => $direntry,
"status" => gT("Copy failed")
);
"status" => gT("Copy failed")
];
} else {
$aImportedFilesInfo[] = array(
$aImportedFilesInfo[] = [
"filename" => $direntry,
"status" => gT("OK")
);
"status" => gT("OK")
];
}
} else {
// Extension forbidden
$aErrorFilesInfo[] = array(
$aErrorFilesInfo[] = [
"filename" => $direntry,
"status" => gT("Forbidden Extension")
);
"status" => gT("Forbidden Extension")
];
}
unlink($extractdir . "/" . $direntry);
}
if (is_dir($extractdir . "/" . $direntry)) {
$subDirectory = opendir($extractdir . "/" . $direntry);
$subExtractdir = $extractdir . "/" . $direntry;
$subDestdir = $destdir . "/" . $direntry;
list($aSubImportedFilesInfo, $aSubErrorFilesInfo) = $this->copyDirectory($subDirectory, $subExtractdir, $subDestdir);
$aImportedFilesInfo = array_merge($aImportedFilesInfo, $aSubImportedFilesInfo);
$aErrorFilesInfo = array_merge($aErrorFilesInfo, $aSubErrorFilesInfo);
}
}
}

return array($aImportedFilesInfo, $aErrorFilesInfo);
return [$aImportedFilesInfo, $aErrorFilesInfo];
}
}
115 changes: 59 additions & 56 deletions application/views/surveyAdministration/importSurveyResources_view.php
@@ -1,119 +1,122 @@
<?php

/** @var $aErrorFilesInfo array */
/** @var $aImportedFilesInfo array */
/** @var array $aErrorFilesInfo */
/** @var array $aImportedFilesInfo */
/** @var int $surveyid */

if (!count($aErrorFilesInfo) &&count($aImportedFilesInfo)): ?>
<div class='side-body <?php echo getSideBodyClass(false); ?>'>
<div class="row welcome survey-action">
<div class="col-sm-12 content-right">
<div class="jumbotron message-box">
<h2><?php eT("Import survey resources"); ?></h2>
<p class="lead text-success">
<?php eT("Success");?>
</p>
<p>
<?php eT("Resources Import Summary"); ?>
</p>
<p>
<?php eT("Total Imported files"); ?>: <?php echo count($aImportedFilesInfo); ?><br />
</p>
<p>
<strong><?php eT("Imported Files List") ?>:</strong>
</p>
<p>
<ul>
<?php
foreach ($aImportedFilesInfo as $entry) {
echo CHtml::tag('li', array(), sprintf(gT("File: %s"),CHtml::encode($entry["filename"])));
}
?>
</ul>
</p>
<p>
<input class="btn btn-default btn-lg" type='submit' value='<?php eT("Back"); ?>' onclick="window.open('<?php echo $this->createUrl('admin/survey/sa/editlocalsettings/surveyid/' . $surveyid); ?>', '_top')" />
</p>
</div>
</div>
</div>
</div>
<?php elseif(count($aErrorFilesInfo) &&count($aImportedFilesInfo)): ?>
if (!count($aErrorFilesInfo) && count($aImportedFilesInfo)) : ?>
<div class='side-body <?php echo getSideBodyClass(false); ?>'>
<div class="row welcome survey-action">
<div class="col-sm-12 content-right">
<div class="jumbotron message-box message-box-warning">
<div class="jumbotron message-box">
<h2><?php eT("Import survey resources"); ?></h2>
<p class="lead text-warning">
<?php eT("Partial");?>
<p class="lead text-success">
<?php eT("Success"); ?>
</p>
<p>
<?php eT("Resources Import Summary"); ?>
</p>
<p>
<?php eT("Total Imported files"); ?>: <?php echo count($aImportedFilesInfo); ?><br />
<?php eT("Total Errors"); ?>: <?php echo count($aErrorFilesInfo); ?><br />
<?php eT("Total Imported files"); ?>: <?php echo count($aImportedFilesInfo); ?><br/>
</p>
<p>
<strong><?php eT("Imported Files List"); ?>:</strong>
<strong><?php eT("Imported Files List") ?>:</strong>
</p>
<p>
<ul>
<?php
foreach ($aImportedFilesInfo as $entry) {
echo CHtml::tag('li', array(), sprintf(gT("File: %s"),CHtml::encode($entry["filename"])));
echo CHtml::tag('li', [], sprintf(gT("File: %s"), CHtml::encode($entry["filename"])));
}
?>
</ul>
</p>
<p>
<input class="btn btn-default btn-lg" type='submit' value='<?php eT("Back"); ?>' onclick="window.open('<?php echo $this->createUrl('surveyAdministration/rendersidemenulink&surveyid=' . $surveyid . '&subaction=resources'); ?>', '_top')"/>
</p>
</div>
</div>
</div>
</div>
<?php elseif (count($aErrorFilesInfo) && count($aImportedFilesInfo)) : ?>
<div class='side-body <?php echo getSideBodyClass(false); ?>'>
<div class="row welcome survey-action">
<div class="col-sm-12 content-right">
<div class="jumbotron message-box message-box-warning">
<h2><?php eT("Import survey resources"); ?></h2>
<p class="lead text-warning">
<?php eT("Partial"); ?>
</p>
<p>
<?php eT("Resources Import Summary"); ?>
</p>
<p>
<?php eT("Total Imported files"); ?>: <?php echo count($aImportedFilesInfo); ?><br/>
<?php eT("Total Errors"); ?>: <?php echo count($aErrorFilesInfo); ?><br/>
</p>
<p>
<strong><?php eT("Imported Files List"); ?>:</strong>
</p>
<p>
<ul>
<?php
foreach ($aImportedFilesInfo as $entry) {
echo CHtml::tag('li', [], sprintf(gT("File: %s"), CHtml::encode($entry["filename"])));
}
?>
</ul>
</p>
<p>
<strong class="text-warning"><?php eT("Error Files List"); ?>:</strong>
</p>
<p>
<ul>
<?php
foreach ($aErrorFilesInfo as $entry) {
echo CHtml::tag('li', array(), sprintf(gT("File: %s (%s)"),CHtml::encode($entry["filename"]),$entry['status']));
}
foreach ($aErrorFilesInfo as $entry) {
echo CHtml::tag('li', [], sprintf(gT("File: %s (%s)"), CHtml::encode($entry["filename"]), $entry['status']));
}
?>
</ul>
</p>
<p>
<input class="btn btn-default btn-lg" type='submit' value='<?php eT("Back"); ?>'
onclick="window.open('<?php echo $this->createUrl('admin/survey/sa/editlocalsettings/surveyid/' . $surveyid); ?>', '_top')" />
onclick="window.open('<?php echo $this->createUrl('surveyAdministration/rendersidemenulink&surveyid=' . $surveyid . '&subaction=resources'); ?>', '_top')"/>
</p>
</div>
</div>
</div>
</div>
<?php else:?>
<?php else : ?>
<div class='side-body <?php echo getSideBodyClass(false); ?>'>
<div class="row welcome survey-action">
<div class="col-sm-12 content-right">
<div class="jumbotron message-box message-box-error">
<h2><?php eT("Import survey resources"); ?></h2>
<p class="lead text-danger">
<?php eT("Error");?>
<?php eT("Error"); ?>
</p>
<p>
<?php eT("Resources Import Summary"); ?>
</p>
<p>
<?php eT("Total Imported files"); ?>: 0<br />
<?php eT("Total Errors"); ?>: <?php echo count($aErrorFilesInfo); ?><br />
<?php eT("Total Imported files"); ?>: 0<br/>
<?php eT("Total Errors"); ?>: <?php echo count($aErrorFilesInfo); ?><br/>
</p>
<p>
<strong class="text-warning"><?php eT("Error Files List"); ?>:</strong>
</p>
<p>
<ul>
<?php
foreach ($aErrorFilesInfo as $entry) {
echo CHtml::tag('li', array(), sprintf(gT("File: %s (%s)"),CHtml::encode($entry["filename"]),$entry['status']));
}
foreach ($aErrorFilesInfo as $entry) {
echo CHtml::tag('li', [], sprintf(gT("File: %s (%s)"), CHtml::encode($entry["filename"]), $entry['status']));
}
?>
</ul>
</p>
<p>
<input class="btn btn-default btn-lg" type='submit' value='<?php eT("Back"); ?>'
onclick="window.open('<?php echo $this->createUrl('admin/survey/sa/editlocalsettings/surveyid/' . $surveyid); ?>', '_top')" />
onclick="window.open('<?php echo $this->createUrl('surveyAdministration/rendersidemenulink&surveyid=' . $surveyid . '&subaction=resources'); ?>', '_top')"/>
</p>
</div>
</div>
Expand Down

0 comments on commit 71c4022

Please sign in to comment.