GH-543 - Datetime at DefaultValueBinder
Personally, I don't call it a bug if people pass invalid arguments and it complains with an exception; but I've made some basic changes to support DateTime objects and objects with a __toString() method... Any other objects will throw a catchable fatal error, and it's up to user code to implement any exception handler to convert it to an exception and handle it
This commit is contained in:
parent
eedcc49f81
commit
61f5baac4a
|
@ -57,13 +57,20 @@ class PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
|
||||||
// sanitize UTF-8 strings
|
// sanitize UTF-8 strings
|
||||||
if (is_string($value)) {
|
if (is_string($value)) {
|
||||||
$value = PHPExcel_Shared_String::SanitizeUTF8($value);
|
$value = PHPExcel_Shared_String::SanitizeUTF8($value);
|
||||||
|
} elseif (is_object($value)) {
|
||||||
|
// Handle any objects that might be injected
|
||||||
|
if ($value instanceof DateTime) {
|
||||||
|
$value = $value->format('Y-m-d H:i:s');
|
||||||
|
} elseif (!($value instanceof PHPExcel_RichText)) {
|
||||||
|
$value = (string) $value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set value explicit
|
// Set value explicit
|
||||||
$cell->setValueExplicit( $value, self::dataTypeForValue($value) );
|
$cell->setValueExplicit( $value, self::dataTypeForValue($value) );
|
||||||
|
|
||||||
// Done!
|
// Done!
|
||||||
return TRUE;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -74,7 +81,7 @@ class PHPExcel_Cell_DefaultValueBinder implements PHPExcel_Cell_IValueBinder
|
||||||
*/
|
*/
|
||||||
public static function dataTypeForValue($pValue = null) {
|
public static function dataTypeForValue($pValue = null) {
|
||||||
// Match the value against a few data types
|
// Match the value against a few data types
|
||||||
if (is_null($pValue)) {
|
if ($pValue === null) {
|
||||||
return PHPExcel_Cell_DataType::TYPE_NULL;
|
return PHPExcel_Cell_DataType::TYPE_NULL;
|
||||||
} elseif ($pValue === '') {
|
} elseif ($pValue === '') {
|
||||||
return PHPExcel_Cell_DataType::TYPE_STRING;
|
return PHPExcel_Cell_DataType::TYPE_STRING;
|
||||||
|
|
|
@ -4,6 +4,7 @@ require_once 'testDataFileIterator.php';
|
||||||
|
|
||||||
class DefaultValueBinderTest extends PHPUnit_Framework_TestCase
|
class DefaultValueBinderTest extends PHPUnit_Framework_TestCase
|
||||||
{
|
{
|
||||||
|
protected $cellStub;
|
||||||
|
|
||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
|
@ -14,6 +15,48 @@ class DefaultValueBinderTest extends PHPUnit_Framework_TestCase
|
||||||
require_once(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
require_once(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function createCellStub()
|
||||||
|
{
|
||||||
|
// Create a stub for the Cell class.
|
||||||
|
$this->cellStub = $this->getMockBuilder('PHPExcel_Cell')
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
// Configure the stub.
|
||||||
|
$this->cellStub->expects($this->any())
|
||||||
|
->method('setValueExplicit')
|
||||||
|
->will($this->returnValue(true));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider binderProvider
|
||||||
|
*/
|
||||||
|
public function testBindValue($value)
|
||||||
|
{
|
||||||
|
$this->createCellStub();
|
||||||
|
$binder = new PHPExcel_Cell_DefaultValueBinder();
|
||||||
|
$result = $binder->bindValue($this->cellStub, $value);
|
||||||
|
$this->assertTrue($result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function binderProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(null),
|
||||||
|
array(''),
|
||||||
|
array('ABC'),
|
||||||
|
array('=SUM(A1:B2)'),
|
||||||
|
array(true),
|
||||||
|
array(false),
|
||||||
|
array(123),
|
||||||
|
array(-123.456),
|
||||||
|
array('123'),
|
||||||
|
array('-123.456'),
|
||||||
|
array('#REF!'),
|
||||||
|
array(new DateTime()),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider providerDataTypeForValue
|
* @dataProvider providerDataTypeForValue
|
||||||
*/
|
*/
|
||||||
|
@ -30,4 +73,13 @@ class DefaultValueBinderTest extends PHPUnit_Framework_TestCase
|
||||||
return new testDataFileIterator('rawTestData/Cell/DefaultValueBinder.data');
|
return new testDataFileIterator('rawTestData/Cell/DefaultValueBinder.data');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testDataTypeForRichTextObject()
|
||||||
|
{
|
||||||
|
$objRichText = new PHPExcel_RichText();
|
||||||
|
$objRichText->createText('Hello World');
|
||||||
|
|
||||||
|
$expectedResult = PHPExcel_Cell_DataType::TYPE_INLINE;
|
||||||
|
$result = call_user_func(array('PHPExcel_Cell_DefaultValueBinder','dataTypeForValue'), $objRichText);
|
||||||
|
$this->assertEquals($expectedResult, $result);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue