From 56c3d8eda294d787af1602e4ca7227c3fed0ecbb Mon Sep 17 00:00:00 2001 From: Roman Syroeshko Date: Sun, 10 Aug 2014 20:00:19 +0400 Subject: [PATCH] https://github.com/PHPOffice/PHPWord/issues/310 --- CHANGELOG.md | 1 + phpword.ini.dist | 1 + samples/index.php | 2 +- src/PhpWord/Element/Image.php | 7 ++-- src/PhpWord/Settings.php | 36 +++++++++++++++++++ src/PhpWord/Shared/ZipArchive.php | 4 +-- src/PhpWord/Template.php | 2 +- src/PhpWord/Writer/AbstractWriter.php | 5 +-- tests/PhpWord/Tests/SettingsTest.php | 26 ++++++++++++++ tests/PhpWord/Tests/Writer/PDF/DomPDFTest.php | 4 +-- .../Tests/_includes/TestHelperDOCX.php | 15 ++++---- 11 files changed, 85 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09ba8668..e7564f68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ This release added form fields (textinput, checkbox, and dropdown), drawing shap - Autoloader: Add the ability to set the autoloader options - @bskrtich GH-267 - Element: Refactor elements to move set relation Id from container to element - @ivanlanin - Introduced CreateTemporaryFileException, CopyFileException - @RomanSyroeshko +- Settings: added method to set user defined temporary directory - @RomanSyroeshko GH-310 ## 0.11.1 - 2 June 2014 diff --git a/phpword.ini.dist b/phpword.ini.dist index 4a51ee11..f8eafb6a 100644 --- a/phpword.ini.dist +++ b/phpword.ini.dist @@ -7,6 +7,7 @@ compatibility = true zipClass = ZipArchive pdfRendererName = DomPDF pdfRendererPath = +; tempDir = "C:\PhpWordTemp" [Font] diff --git a/samples/index.php b/samples/index.php index 5632664f..4281f6fb 100644 --- a/samples/index.php +++ b/samples/index.php @@ -3,7 +3,7 @@ include_once 'Sample_Header.php'; $requirements = array( 'php' => array('PHP 5.3.0', version_compare(phpversion(), '5.3.0', '>=')), 'xml' => array('PHP extension XML', extension_loaded('xml')), - 'temp' => array('Temp folder "' . sys_get_temp_dir() . '" is writable', is_writable(sys_get_temp_dir())), + 'temp' => array('Temp folder "' . Settings::getTempDir() . '" is writable', is_writable(Settings::getTempDir())), 'zip' => array('PHP extension ZipArchive (optional)', extension_loaded('zip')), 'gd' => array('PHP extension GD (optional)', extension_loaded('gd')), 'xmlw' => array('PHP extension XMLWriter (optional)', extension_loaded('xmlwriter')), diff --git a/src/PhpWord/Element/Image.php b/src/PhpWord/Element/Image.php index e48f703e..4a812f6c 100644 --- a/src/PhpWord/Element/Image.php +++ b/src/PhpWord/Element/Image.php @@ -19,6 +19,7 @@ namespace PhpOffice\PhpWord\Element; use PhpOffice\PhpWord\Exception\InvalidImageException; use PhpOffice\PhpWord\Exception\UnsupportedImageTypeException; +use PhpOffice\PhpWord\Settings; use PhpOffice\PhpWord\Shared\ZipArchive; use PhpOffice\PhpWord\Style\Image as ImageStyle; @@ -313,8 +314,8 @@ class Image extends AbstractElement if ($zip->open($zipFilename) !== false) { if ($zip->locateName($imageFilename)) { $isTemp = true; - $zip->extractTo(sys_get_temp_dir(), $imageFilename); - $actualSource = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $imageFilename; + $zip->extractTo(Settings::getTempDir(), $imageFilename); + $actualSource = Settings::getTempDir() . DIRECTORY_SEPARATOR . $imageFilename; } } $zip->close(); @@ -428,7 +429,7 @@ class Image extends AbstractElement $imageData = null; $source = substr($source, 6); list($zipFilename, $imageFilename) = explode('#', $source); - $tempFilename = tempnam(sys_get_temp_dir(), 'PHPWordImage'); + $tempFilename = tempnam(Settings::getTempDir(), 'PHPWordImage'); $zip = new ZipArchive(); if ($zip->open($zipFilename) !== false) { diff --git a/src/PhpWord/Settings.php b/src/PhpWord/Settings.php index 8481717b..009c849c 100644 --- a/src/PhpWord/Settings.php +++ b/src/PhpWord/Settings.php @@ -119,6 +119,13 @@ class Settings */ private static $defaultFontSize = self::DEFAULT_FONT_SIZE; + /** + * The user defined temporary directory. + * + * @var string + */ + private static $tempDir = ''; + /** * Return the compatibility option used by the XMLWriter * @@ -269,6 +276,35 @@ class Settings return true; } + /** + * Sets the user defined path to temporary directory. + * + * @param string $tempDir The user defined path to temporary directory. + * @return void + * @since 0.12.0 + */ + public static function setTempDir($tempDir) + { + self::$tempDir = $tempDir; + } + + /** + * Returns path to temporary directory. + * + * @return string + * @since 0.12.0 + */ + public static function getTempDir() + { + $tempDir = sys_get_temp_dir(); + + if (!empty(self::$tempDir)) { + $tempDir = self::$tempDir; + } + + return $tempDir; + } + /** * Get default font name * diff --git a/src/PhpWord/Shared/ZipArchive.php b/src/PhpWord/Shared/ZipArchive.php index 7515c5b5..38781a80 100644 --- a/src/PhpWord/Shared/ZipArchive.php +++ b/src/PhpWord/Shared/ZipArchive.php @@ -83,7 +83,7 @@ class ZipArchive $this->usePclzip = (Settings::getZipClass() != 'ZipArchive'); if ($this->usePclzip) { if (!defined('PCLZIP_TEMPORARY_DIR')) { - define('PCLZIP_TEMPORARY_DIR', sys_get_temp_dir() . '/'); + define('PCLZIP_TEMPORARY_DIR', Settings::getTempDir() . '/'); } require_once 'PCLZip/pclzip.lib.php'; } @@ -139,7 +139,7 @@ class ZipArchive $this->numFiles = $zip->numFiles; } else { $zip = new \PclZip($this->filename); - $this->tempDir = sys_get_temp_dir(); + $this->tempDir = Settings::getTempDir(); $this->numFiles = count($zip->listContent()); } $this->zip = $zip; diff --git a/src/PhpWord/Template.php b/src/PhpWord/Template.php index 28055cea..c8f88026 100644 --- a/src/PhpWord/Template.php +++ b/src/PhpWord/Template.php @@ -67,7 +67,7 @@ class Template */ public function __construct($fileName) { - $this->tempFileName = tempnam(sys_get_temp_dir(), ''); + $this->tempFileName = tempnam(Settings::getTempDir(), 'PhpWord'); if (false === $this->tempFileName) { throw new CreateTemporaryFileException(); } diff --git a/src/PhpWord/Writer/AbstractWriter.php b/src/PhpWord/Writer/AbstractWriter.php index 52a2098f..c74819b5 100644 --- a/src/PhpWord/Writer/AbstractWriter.php +++ b/src/PhpWord/Writer/AbstractWriter.php @@ -20,6 +20,7 @@ namespace PhpOffice\PhpWord\Writer; use PhpOffice\PhpWord\Exception\CopyFileException; use PhpOffice\PhpWord\Exception\Exception; use PhpOffice\PhpWord\PhpWord; +use PhpOffice\PhpWord\Settings; use PhpOffice\PhpWord\Shared\ZipArchive; /** @@ -214,12 +215,12 @@ abstract class AbstractWriter implements WriterInterface protected function getTempFile($filename) { // Temporary directory - $this->setTempDir(sys_get_temp_dir() . '/PHPWordWriter/'); + $this->setTempDir(Settings::getTempDir() . '/PHPWordWriter/'); // Temporary file $this->originalFilename = $filename; if (strtolower($filename) == 'php://output' || strtolower($filename) == 'php://stdout') { - $filename = @tempnam(sys_get_temp_dir(), 'phpword_'); + $filename = tempnam(Settings::getTempDir(), 'phpword_'); // @codeCoverageIgnoreStart // Can't find any test case. Uncomment when found. if ($filename == '') { diff --git a/tests/PhpWord/Tests/SettingsTest.php b/tests/PhpWord/Tests/SettingsTest.php index 61364034..0d3d66ae 100644 --- a/tests/PhpWord/Tests/SettingsTest.php +++ b/tests/PhpWord/Tests/SettingsTest.php @@ -22,6 +22,7 @@ use PhpOffice\PhpWord\Settings; /** * Test class for PhpOffice\PhpWord\Settings * + * @coversDefaultClass \PhpOffice\PhpWord\Settings * @runTestsInSeparateProcesses */ class SettingsTest extends \PHPUnit_Framework_TestCase @@ -70,6 +71,31 @@ class SettingsTest extends \PHPUnit_Framework_TestCase $this->assertFalse(Settings::setMeasurementUnit('foo')); } + /** + * @covers ::getTempDir + * @test + */ + public function testPhpTempDirIsUsedByDefault() + { + $this->assertEquals(sys_get_temp_dir(), Settings::getTempDir()); + } + + + /** + * @covers ::setTempDir + * @covers ::getTempDir + * @depends testPhpTempDirIsUsedByDefault + * @test + */ + public function testTempDirCanBeSet() + { + $userDefinedTempDir = 'C:\PhpWordTemp'; + Settings::setTempDir($userDefinedTempDir); + $currentTempDir = Settings::getTempDir(); + $this->assertEquals($userDefinedTempDir, $currentTempDir); + $this->assertNotEquals(sys_get_temp_dir(), $currentTempDir); + } + /** * Test set/get default font name */ diff --git a/tests/PhpWord/Tests/Writer/PDF/DomPDFTest.php b/tests/PhpWord/Tests/Writer/PDF/DomPDFTest.php index a22cb530..476c9011 100644 --- a/tests/PhpWord/Tests/Writer/PDF/DomPDFTest.php +++ b/tests/PhpWord/Tests/Writer/PDF/DomPDFTest.php @@ -71,7 +71,7 @@ class DomPDFTest extends \PHPUnit_Framework_TestCase $writer->setOrientation(); $this->assertEquals('default', $writer->getOrientation()); - $writer->setTempDir(sys_get_temp_dir()); - $this->assertEquals(sys_get_temp_dir(), $writer->getTempDir()); + $writer->setTempDir(Settings::getTempDir()); + $this->assertEquals(Settings::getTempDir(), $writer->getTempDir()); } } diff --git a/tests/PhpWord/Tests/_includes/TestHelperDOCX.php b/tests/PhpWord/Tests/_includes/TestHelperDOCX.php index 7998cbdc..553a51be 100644 --- a/tests/PhpWord/Tests/_includes/TestHelperDOCX.php +++ b/tests/PhpWord/Tests/_includes/TestHelperDOCX.php @@ -19,6 +19,7 @@ namespace PhpOffice\PhpWord\Tests; use PhpOffice\PhpWord\IOFactory; use PhpOffice\PhpWord\PhpWord; +use PhpOffice\PhpWord\Settings; /** * Test helper class @@ -41,9 +42,9 @@ class TestHelperDOCX */ public static function getDocument(PhpWord $phpWord, $writerName = 'Word2007') { - self::$file = tempnam(sys_get_temp_dir(), 'PhpWord'); - if (!is_dir(sys_get_temp_dir() . '/PhpWord_Unit_Test/')) { - mkdir(sys_get_temp_dir() . '/PhpWord_Unit_Test/'); + self::$file = tempnam(Settings::getTempDir(), 'PhpWord'); + if (!is_dir(Settings::getTempDir() . '/PhpWord_Unit_Test/')) { + mkdir(Settings::getTempDir() . '/PhpWord_Unit_Test/'); } $xmlWriter = IOFactory::createWriter($phpWord, $writerName); @@ -52,11 +53,11 @@ class TestHelperDOCX $zip = new \ZipArchive; $res = $zip->open(self::$file); if ($res === true) { - $zip->extractTo(sys_get_temp_dir() . '/PhpWord_Unit_Test/'); + $zip->extractTo(Settings::getTempDir() . '/PhpWord_Unit_Test/'); $zip->close(); } - return new XmlDocument(sys_get_temp_dir() . '/PhpWord_Unit_Test/'); + return new XmlDocument(Settings::getTempDir() . '/PhpWord_Unit_Test/'); } /** @@ -67,8 +68,8 @@ class TestHelperDOCX if (file_exists(self::$file)) { unlink(self::$file); } - if (is_dir(sys_get_temp_dir() . '/PhpWord_Unit_Test/')) { - self::deleteDir(sys_get_temp_dir() . '/PhpWord_Unit_Test/'); + if (is_dir(Settings::getTempDir() . '/PhpWord_Unit_Test/')) { + self::deleteDir(Settings::getTempDir() . '/PhpWord_Unit_Test/'); } }