Pārlūkot izejas kodu

Merge pull request #206 from viest/dev

Feat: put csv callback
viest 5 gadi atpakaļ
vecāks
revīzija
8ba232c28d
5 mainītis faili ar 118 papildinājumiem un 4 dzēšanām
  1. 1 1
      include/csv.h
  2. 22 2
      kernel/csv.c
  3. 36 1
      kernel/excel.c
  4. 1 0
      package.xml
  5. 58 0
      tests/xlsx_to_csv_callback.phpt

+ 1 - 1
include/csv.h

@@ -13,6 +13,6 @@
 #ifndef PHP_EXT_XLS_WRITER_CSV_H
 #ifndef PHP_EXT_XLS_WRITER_CSV_H
 #define PHP_EXT_XLS_WRITER_CSV_H
 #define PHP_EXT_XLS_WRITER_CSV_H
 
 
-unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag);
+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);
 
 
 #endif // PHP_EXT_XLS_WRITER_CSV_H
 #endif // PHP_EXT_XLS_WRITER_CSV_H

+ 22 - 2
kernel/csv.c

@@ -15,12 +15,12 @@
 #include "ext/standard/file.h"
 #include "ext/standard/file.h"
 
 
 /* {{{ */
 /* {{{ */
-unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval *zv_type_arr_t, unsigned int flag)
+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)
 {
 {
     zval *_zv_type_arr_t = NULL;
     zval *_zv_type_arr_t = NULL;
     php_stream *_stream_t;
     php_stream *_stream_t;
 
 
-    ssize_t ret;
+    ssize_t ret = 0;
     char delimiter = ',';
     char delimiter = ',';
     char enclosure = '"';
     char enclosure = '"';
     int escape_char = (unsigned char) '\\';
     int escape_char = (unsigned char) '\\';
@@ -42,8 +42,28 @@ unsigned int xlsx_to_csv(zval *stream_resource, xlsxioreadersheet sheet_t, zval
     while (sheet_read_row(sheet_t))
     while (sheet_read_row(sheet_t))
     {
     {
         load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, flag);
         load_sheet_current_row_data(sheet_t, &_zv_tmp_row, _zv_type_arr_t, flag);
+
+        if (fci != NULL && fci_cache != NULL) {
+            zval retval;
+
+            fci->retval      = &retval;
+            fci->params      = &_zv_tmp_row;
+            fci->param_count = 1;
+
+            zend_call_function(fci, fci_cache);
+
+            if (Z_TYPE(retval) == IS_ARRAY) {
+                ret = php_fputcsv(_stream_t, &retval, delimiter, enclosure, escape_char);
+            }
+
+            zval_ptr_dtor(&retval);
+            goto CLEAN_UP_SCENE;
+        }
+
         ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
         ret = php_fputcsv(_stream_t, &_zv_tmp_row, delimiter, enclosure, escape_char);
 
 
+        CLEAN_UP_SCENE:
+
         zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
         zend_hash_clean(Z_ARRVAL(_zv_tmp_row));
 
 
         if (ret < 0) {
         if (ret < 0) {

+ 36 - 1
kernel/excel.c

@@ -176,6 +176,11 @@ ZEND_BEGIN_ARG_INFO_EX(xls_put_csv_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, fp)
                 ZEND_ARG_INFO(0, fp)
 ZEND_END_ARG_INFO()
 ZEND_END_ARG_INFO()
 
 
+ZEND_BEGIN_ARG_INFO_EX(xls_put_csv_callback_arginfo, 0, 0, 2)
+                ZEND_ARG_INFO(0, callback)
+                ZEND_ARG_INFO(0, fp)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(xls_set_type_arginfo, 0, 0, 1)
 ZEND_BEGIN_ARG_INFO_EX(xls_set_type_arginfo, 0, 0, 1)
                 ZEND_ARG_INFO(0, zv_type_t)
                 ZEND_ARG_INFO(0, zv_type_t)
 ZEND_END_ARG_INFO()
 ZEND_END_ARG_INFO()
@@ -974,7 +979,36 @@ PHP_METHOD(vtiful_xls, putCSV)
 
 
     zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
     zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
 
 
-    if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW) == XLSWRITER_TRUE) {
+    if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW, NULL, NULL) == XLSWRITER_TRUE) {
+        RETURN_TRUE;
+    }
+
+    RETURN_FALSE;
+}
+/* }}} */
+
+/** {{{ \Vtiful\Kernel\Excel::putCSVCallback()
+ */
+PHP_METHOD(vtiful_xls, putCSVCallback)
+{
+    zval *fp = NULL, *zv_type = NULL;
+    zend_fcall_info       fci       = empty_fcall_info;
+    zend_fcall_info_cache fci_cache = empty_fcall_info_cache;
+
+    ZEND_PARSE_PARAMETERS_START(2, 2)
+            Z_PARAM_FUNC(fci, fci_cache)
+            Z_PARAM_RESOURCE(fp)
+    ZEND_PARSE_PARAMETERS_END();
+
+    xls_object *obj = Z_XLS_P(getThis());
+
+    if (!obj->read_ptr.sheet_t) {
+        RETURN_FALSE;
+    }
+
+    zv_type = zend_read_property(vtiful_xls_ce, getThis(), ZEND_STRL(V_XLS_TYPE), 0, NULL);
+
+    if (xlsx_to_csv(fp, obj->read_ptr.sheet_t, zv_type, READ_SKIP_ROW, &fci, &fci_cache) == XLSWRITER_TRUE) {
         RETURN_TRUE;
         RETURN_TRUE;
     }
     }
 
 
@@ -1097,6 +1131,7 @@ zend_function_entry xls_methods[] = {
         PHP_ME(vtiful_xls, openFile,         xls_open_file_arginfo,          ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, openFile,         xls_open_file_arginfo,          ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, openSheet,        xls_open_sheet_arginfo,         ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, openSheet,        xls_open_sheet_arginfo,         ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, putCSV,           xls_put_csv_arginfo,            ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, putCSV,           xls_put_csv_arginfo,            ZEND_ACC_PUBLIC)
+        PHP_ME(vtiful_xls, putCSVCallback,   xls_put_csv_callback_arginfo,   ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, sheetList,        NULL,                           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, sheetList,        NULL,                           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, setType,          xls_set_type_arginfo,           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, setType,          xls_set_type_arginfo,           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, getSheetData,     NULL,                           ZEND_ACC_PUBLIC)
         PHP_ME(vtiful_xls, getSheetData,     NULL,                           ZEND_ACC_PUBLIC)

+ 1 - 0
package.xml

@@ -225,6 +225,7 @@
    <file md5sum="98f47ea5e8aab04af809a1707a1f1476" name="tests/sheet_checkout.phpt" role="test" />
    <file md5sum="98f47ea5e8aab04af809a1707a1f1476" name="tests/sheet_checkout.phpt" role="test" />
    <file md5sum="5811dd930d7b0f916c662139ff1053d4" name="tests/string_from_column_index.phpt" role="test" />
    <file md5sum="5811dd930d7b0f916c662139ff1053d4" name="tests/string_from_column_index.phpt" role="test" />
    <file md5sum="42b26f050d9291509d6f583ef43ebde9" name="tests/xlsx_to_csv.phpt" role="test" />
    <file md5sum="42b26f050d9291509d6f583ef43ebde9" name="tests/xlsx_to_csv.phpt" role="test" />
+   <file name="tests/xlsx_to_csv_callback.phpt" role="test" />
    <file md5sum="a9af7f4ca385ba41b008b50ac67f8e96" name="tests/zoom.phpt" role="test" />
    <file md5sum="a9af7f4ca385ba41b008b50ac67f8e96" name="tests/zoom.phpt" role="test" />
    <file md5sum="f4a2d1a28ad1bf782502d698de0b1907" name="tests/include/skipif.inc" role="test" />
    <file md5sum="f4a2d1a28ad1bf782502d698de0b1907" name="tests/include/skipif.inc" role="test" />
    <file md5sum="bb4256831dfd81f951bd6f4afbe1719f" name="CREDITS" role="doc" />
    <file md5sum="bb4256831dfd81f951bd6f4afbe1719f" name="CREDITS" role="doc" />

+ 58 - 0
tests/xlsx_to_csv_callback.phpt

@@ -0,0 +1,58 @@
+--TEST--
+Check for vtiful presence
+--SKIPIF--
+<?php
+require __DIR__ . '/include/skipif.inc';
+skip_disable_reader();
+?>
+--FILE--
+<?php
+$config   = ['path' => './tests'];
+$excel    = new \Vtiful\Kernel\Excel($config);
+$filePath = $excel->fileName('tutorial.xlsx', 'TestSheet1')
+    ->header(['Item', 'Cost'])
+    ->data([
+        ['Item_1', 'Cost_1', 10, 10.9999995],
+    ])
+    ->output();
+
+$fp = fopen('./tests/file.csv', 'w');
+
+$csvResult = $excel->openFile('tutorial.xlsx')
+    ->openSheet()
+    ->putCSVCallback(function($row){
+        return $row;
+    }, $fp);
+
+fclose($fp);
+
+var_dump($csvResult);
+
+$fp = fopen('./tests/file.csv', 'r');
+
+var_dump(fgetcsv($fp));
+var_dump(fgetcsv($fp));
+?>
+--CLEAN--
+<?php
+@unlink(__DIR__ . '/tutorial.xlsx');
+@unlink(__DIR__ . '/file.csv');
+?>
+--EXPECT--
+bool(true)
+array(2) {
+  [0]=>
+  string(4) "Item"
+  [1]=>
+  string(4) "Cost"
+}
+array(4) {
+  [0]=>
+  string(6) "Item_1"
+  [1]=>
+  string(6) "Cost_1"
+  [2]=>
+  string(2) "10"
+  [3]=>
+  string(10) "10.9999995"
+}