Skip to content

Commit 8ba232c

Browse files
authored
Merge pull request #206 from viest/dev
Feat: put csv callback
2 parents 63dedfc + b1f3804 commit 8ba232c

File tree

5 files changed

+118
-4
lines changed

5 files changed

+118
-4
lines changed

include/csv.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
#ifndef PHP_EXT_XLS_WRITER_CSV_H
1414
#define PHP_EXT_XLS_WRITER_CSV_H
1515

16-
unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag);
16+
unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache);
1717

1818
#endif // PHP_EXT_XLS_WRITER_CSV_H

kernel/csv.c

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
#include "ext/standard/file.h"
1616

1717
/* {{{ */
18-
unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag)
18+
unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag, zend_fcall_info *fci, zend_fcall_info_cache *fci_cache)
1919
{
2020
zval *_zv_type_arr_t = NULL;
2121
php_stream *_stream_t;
2222

23-
ssize_t ret;
23+
ssize_t ret = 0;
2424
char delimiter = ',';
2525
char enclosure = '"';
2626
int escape_char = (unsigned char) '\\';
@@ -42,8 +42,28 @@ unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval
4242
while (sheet_read_row(sheet_t))
4343
{
4444
load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, flag);
45+
46+
if (fci != NULL && fci_cache != NULL) {
47+
zval retval;
48+
49+
fci->retval = &retval;
50+
fci->params = &_zv_tmp_row;
51+
fci->param_count = 1;
52+
53+
zend_call_function(fci, fci_cache);
54+
55+
if (Z_TYPE(retval) == IS_ARRAY) {
56+
ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char);
57+
}
58+
59+
zval_ptr_dtor(&retval);
60+
goto CLEAN_UP_SCENE;
61+
}
62+
4563
ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
4664

65+
CLEAN_UP_SCENE:
66+
4767
zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
4868

4969
if (ret < 0) {

kernel/excel.c

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ ZEND_BEGIN_ARG_INFO_EX(xls_put_csv_arginfo, 0, 0, 1)
176176
ZEND_ARG_INFO(0, fp)
177177
ZEND_END_ARG_INFO()
178178

179+
ZEND_BEGIN_ARG_INFO_EX(xls_put_csv_callback_arginfo, 0, 0, 2)
180+
ZEND_ARG_INFO(0, callback)
181+
ZEND_ARG_INFO(0, fp)
182+
ZEND_END_ARG_INFO()
183+
179184
ZEND_BEGIN_ARG_INFO_EX(xls_set_type_arginfo, 0, 0, 1)
180185
ZEND_ARG_INFO(0, zv_type_t)
181186
ZEND_END_ARG_INFO()
@@ -974,7 +979,36 @@ PHP_METHOD(vtiful_xls, putCSV)
974979

975980
zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
976981

977-
if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW) == XLSWRITER_TRUE) {
982+
if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW, NULL, NULL) == XLSWRITER_TRUE) {
983+
RETURN_TRUE;
984+
}
985+
986+
RETURN_FALSE;
987+
}
988+
/* }}} */
989+
990+
/** {{{ \Vtiful\Kernel\Excel::putCSVCallback()
991+
*/
992+
PHP_METHOD(vtiful_xls, putCSVCallback)
993+
{
994+
zval *fp = NULL, *zv_type = NULL;
995+
zend_fcall_info fci = empty_fcall_info;
996+
zend_fcall_info_cache fci_cache = empty_fcall_info_cache;
997+
998+
ZEND_PARSE_PARAMETERS_START(2, 2)
999+
Z_PARAM_FUNC(fci, fci_cache)
1000+
Z_PARAM_RESOURCE(fp)
1001+
ZEND_PARSE_PARAMETERS_END();
1002+
1003+
xls_object *obj = Z_XLS_P(getThis());
1004+
1005+
if (!obj->read_ptr.sheet_t) {
1006+
RETURN_FALSE;
1007+
}
1008+
1009+
zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
1010+
1011+
if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW, &fci, &fci_cache) == XLSWRITER_TRUE) {
9781012
RETURN_TRUE;
9791013
}
9801014

@@ -1097,6 +1131,7 @@ zend_function_entry xls_methods[] = {
10971131
PHP_ME(vtiful_xls, openFile, xls_open_file_arginfo, ZEND_ACC_PUBLIC)
10981132
PHP_ME(vtiful_xls, openSheet, xls_open_sheet_arginfo, ZEND_ACC_PUBLIC)
10991133
PHP_ME(vtiful_xls, putCSV, xls_put_csv_arginfo, ZEND_ACC_PUBLIC)
1134+
PHP_ME(vtiful_xls, putCSVCallback, xls_put_csv_callback_arginfo, ZEND_ACC_PUBLIC)
11001135
PHP_ME(vtiful_xls, sheetList, NULL, ZEND_ACC_PUBLIC)
11011136
PHP_ME(vtiful_xls, setType, xls_set_type_arginfo, ZEND_ACC_PUBLIC)
11021137
PHP_ME(vtiful_xls, getSheetData, NULL, ZEND_ACC_PUBLIC)

package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@
225225
<file md5sum="98f47ea5e8aab04af809a1707a1f1476" name="tests/sheet_checkout.phpt" role="test" />
226226
<file md5sum="5811dd930d7b0f916c662139ff1053d4" name="tests/string_from_column_index.phpt" role="test" />
227227
<file md5sum="42b26f050d9291509d6f583ef43ebde9" name="tests/xlsx_to_csv.phpt" role="test" />
228+
<file name="tests/xlsx_to_csv_callback.phpt" role="test" />
228229
<file md5sum="a9af7f4ca385ba41b008b50ac67f8e96" name="tests/zoom.phpt" role="test" />
229230
<file md5sum="f4a2d1a28ad1bf782502d698de0b1907" name="tests/include/skipif.inc" role="test" />
230231
<file md5sum="bb4256831dfd81f951bd6f4afbe1719f" name="CREDITS" role="doc" />

tests/xlsx_to_csv_callback.phpt

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
--TEST--
2+
Check for vtiful presence
3+
--SKIPIF--
4+
<?php
5+
require __DIR__ . '/include/skipif.inc';
6+
skip_disable_reader();
7+
?>
8+
--FILE--
9+
<?php
10+
$config = ['path' => './tests'];
11+
$excel = new \Vtiful\Kernel\Excel($config);
12+
$filePath = $excel->fileName('tutorial.xlsx', 'TestSheet1')
13+
->header(['Item', 'Cost'])
14+
->data([
15+
['Item_1', 'Cost_1', 10, 10.9999995],
16+
])
17+
->output();
18+
19+
$fp = fopen('./tests/file.csv', 'w');
20+
21+
$csvResult = $excel->openFile('tutorial.xlsx')
22+
->openSheet()
23+
->putCSVCallback(function($row){
24+
return $row;
25+
}, $fp);
26+
27+
fclose($fp);
28+
29+
var_dump($csvResult);
30+
31+
$fp = fopen('./tests/file.csv', 'r');
32+
33+
var_dump(fgetcsv($fp));
34+
var_dump(fgetcsv($fp));
35+
?>
36+
--CLEAN--
37+
<?php
38+
@unlink(__DIR__ . '/tutorial.xlsx');
39+
@unlink(__DIR__ . '/file.csv');
40+
?>
41+
--EXPECT--
42+
bool(true)
43+
array(2) {
44+
[0]=>
45+
string(4) "Item"
46+
[1]=>
47+
string(4) "Cost"
48+
}
49+
array(4) {
50+
[0]=>
51+
string(6) "Item_1"
52+
[1]=>
53+
string(6) "Cost_1"
54+
[2]=>
55+
string(2) "10"
56+
[3]=>
57+
string(10) "10.9999995"
58+
}

0 commit comments

Comments
 (0)