Skip to content

Commit 96c1c79

Browse files
committed
Adding conditionable method to converter
1 parent 599c7f3 commit 96c1c79

27 files changed

+389
-166
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ All Notable changes to `Csv` will be documented in this file
1414
- `RdbmsResult` class to allow converting RDBMS result into `ResultSet`
1515
- `TabularData` interface
1616
- `XMLConverter::supportsHeader`
17+
- `XMLConverter::when`
18+
- `HTMLConverter::when`
19+
- `JsonConverter::when`
1720

1821
### Deprecated
1922

@@ -22,6 +25,10 @@ All Notable changes to `Csv` will be documented in this file
2225
- `ResultSet::createFromRecords` use `ResultSet::createFromTabularData`
2326
- `ResultSet::__construct` use `ResultSet::createFromTabularData`
2427
- `XMLConverter::convert` use `XMLConverter::import` instead
28+
- `XMLConverter::create` use `XMLConverter::__construct` instead
29+
- `HTMLConverter::create` use `HTMLConverter::__construct` instead
30+
- `Statement::create` use `Statement::__construct` instead
31+
- `FragmentFinder::create` use `FragmentFinder::__construct` instead
2532

2633
### Fixed
2734

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ by utilizing PHP native features whenever possible.
1111

1212
## Highlights
1313

14-
- Easy to use API
14+
- Straightforward API
1515
- Read from and Write to CSV documents in a memory efficient and scalable way
1616
- Flexible and powerful query features and array to object mapping.
1717
- Transform CSV documents into popular format (`JSON`, `XML` or `HTML`)

docs/9.0/converter/html.md

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,51 @@ This method sets the optional attribute name for the field name on the HTML `td`
5454
public HTMLConverter::formatter(?callable $formatter): self
5555
```
5656

57-
This method allow to apply a callback prior to converting your collection individual item.
57+
This method allows to apply a callback prior to converting your collection individual item.
5858
This callback allows you to specify how each item will be converted. The formatter should
5959
return an associative array suitable for conversion.
6060

6161
<p class="message-notice">The <code>Formatter</code> callback does not affect the footer
6262
and/or header conversion.</p>
6363

64+
### HTMLConverter::when
65+
66+
<p class="message-info">New feature introduced in version <code>9.22.0</code></p>
67+
68+
This method allows to conditionally create your converter depending on the success or
69+
failure of a condition.
70+
71+
```php
72+
use League\Csv\HTMLConverter;
73+
74+
$converter = (new HTMLConverter());
75+
if ($condition) {
76+
$converter = $converter->td('data-field');
77+
} else {
78+
$converter = $converter->td('');
79+
}
80+
```
81+
82+
becomes
83+
84+
```php
85+
$converter = (new HTMLConverter())
86+
->when(
87+
$condition,
88+
fn (HTMLConverter $c) => $c->td('data-field'),
89+
fn (HTMLConverter $c) => $c->td(''),
90+
);
91+
)
92+
```
93+
94+
The `else` expression is not required but if present in **MUST BE** a callable which only
95+
accepts the `HTMLConverter` instance and returns `null` or a `HTMLConverter` instance.
96+
97+
The only requirements are:
98+
99+
- that the condition is a `boolean` or a callable that returns a `boolean`.
100+
- the callback returns a `HTMLConverter` instance or null.
101+
64102
## Conversion
65103

66104
<p class="message-info">Since version <code>9.3.0</code> this method accepts optional header and footer records to display them in the exported HTML table.</p>
@@ -85,7 +123,7 @@ $sth = $dbh->prepare("SELECT firstname, lastname, email FROM users LIMIT 2");
85123
$sth->setFetchMode(PDO::FETCH_ASSOC);
86124
$sth->execute();
87125

88-
$converter = (new HTMLConverter())
126+
$converter = new HTMLConverter()
89127
->table('table-csv-data', 'users')
90128
->tr('data-record-offset')
91129
->td('title')

docs/9.0/converter/index.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ title: Records conversion in popular formats
99

1010
The package provides classes which convert any collection of CSV records into:
1111

12-
- another collection encoded using the [CharsetConverter](/9.0/converter/charset/) class;
1312
- a `DOMDocument` object using the [XMLConverter](/9.0/converter/xml/) class;
1413
- an HTML table using the [HTMLConverter](/9.0/converter/html/) class;
1514
- an JSON document using the [JsonConverter](/9.0/converter/json/) class;

docs/9.0/converter/json.md

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,44 @@ $converter = JsonConverter::create()->chunkSize(1_000);
144144
$converter->chunkSize; //returns the value used
145145
```
146146

147+
### JsonConverter::when
148+
149+
<p class="message-info">New feature introduced in version <code>9.22.0</code></p>
150+
151+
This method allows to conditionally create your converter depending on the success or
152+
failure of a condition.
153+
154+
```php
155+
use League\Csv\JsonConverter;
156+
157+
$converter = JsonConverter::create();
158+
if ($condition) {
159+
$converter = $converter->chunkSize(1_000);
160+
} else {
161+
$converter = $converter->chunkSize(200);
162+
}
163+
```
164+
165+
becomes
166+
167+
```php
168+
$stmt = JsonConverter::create()
169+
->when(
170+
$condition,
171+
fn (JsonConverter $c) => $c->chunkSize(1_000),
172+
fn (JsonConverter $c) => $c->chunkSize(200),
173+
);
174+
)
175+
```
176+
177+
The `else` expression is not required but if present in **MUST BE** a callable which only
178+
accepts the `JsonConverter` instance and returns `null` or a `JsonConverter` instance.
179+
180+
The only requirements are:
181+
182+
- that the condition is a `boolean` or a callable that returns a `boolean`.
183+
- the callback returns a `JsonConverter` instance or null.
184+
147185
## Conversion
148186

149187
```php

docs/9.0/converter/xml.md

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,44 @@ This method allow to apply a callback prior to converting your collection indivi
7272
This callback allows you to specify how each item will be converted. The formatter should
7373
return an associative array suitable for conversion.
7474

75+
### XMLConverter::when
76+
77+
<p class="message-info">New feature introduced in version <code>9.22.0</code></p>
78+
79+
This method allows to conditionally create your converter depending on the success or
80+
failure of a condition.
81+
82+
```php
83+
use League\Csv\XMLConverter;
84+
85+
$converter = (new XMLConverter());
86+
if ($condition) {
87+
$converter = $converter->fieldElement(null);
88+
} else {
89+
$converter = $converter->fieldElement('cell');
90+
}
91+
```
92+
93+
becomes
94+
95+
```php
96+
$stmt = (new XMLConverter())
97+
->when(
98+
$condition,
99+
fn (XMLConverter $c) => $c->fieldElement(null),
100+
fn (XMLConverter $c) => $c->fieldElement('cell'),
101+
);
102+
)
103+
```
104+
105+
The `else` expression is not required but if present in **MUST BE** a callable which only
106+
accepts the `XMLConverter` instance and returns `null` or a `XMLConverter` instance.
107+
108+
The only requirements are:
109+
110+
- that the condition is a `boolean` or a callable that returns a `boolean`.
111+
- the callback returns a `XMLConverter` instance or null.
112+
75113
## Import
76114

77115
<p class="message-info">New feature introduced in version <code>9.3.0</code></p>
@@ -100,15 +138,15 @@ $csv = Reader::createFromPath('/path/to/prenoms.csv', 'r');
100138
$csv->setDelimiter(';');
101139
$csv->setHeaderOffset(0);
102140

103-
$stmt = (new Statement())
141+
$stmt = new Statement()
104142
->where(function (array $record) {
105143
return 'Anaïs' === $record['prenoms'];
106144
})
107145
->offset(0)
108146
->limit(2)
109147
;
110148

111-
$converter = (new XMLConverter())
149+
$converter = new XMLConverter()
112150
->rootElement('csv')
113151
->recordElement('record', 'offset')
114152
->fieldElement('field', 'name')
@@ -167,15 +205,15 @@ $csv = Reader::createFromPath('/path/to/prenoms.csv', 'r');
167205
$csv->setDelimiter(';');
168206
$csv->setHeaderOffset(0);
169207

170-
$stmt = (new Statement())
208+
$stmt = new Statement()
171209
->where(function (array $record) {
172210
return 'Anaïs' === $record['prenoms'];
173211
})
174212
->offset(0)
175213
->limit(2)
176214
;
177215

178-
$converter = (new XMLConverter())
216+
$converter = new XMLConverter()
179217
->rootElement('csv')
180218
->recordElement('record', 'offset')
181219
->fieldElement('field', 'name')
@@ -233,7 +271,7 @@ header('Content-Type: text/xml; charset=UTF-8');
233271
header('Content-Description: File Transfer');
234272
header('Content-Disposition: attachment; filename="name-for-your-file.xml"');
235273

236-
XMLConverter::create()->download($reader);
274+
new XMLConverter()->download($reader);
237275
die;
238276
```
239277

@@ -256,7 +294,7 @@ header('Cache-Control: no-cache, no-store, must-revalidate');
256294
header('Pragma: no-cache');
257295
header('Expires: 0');
258296
//the filename will be the name of the downloaded xml as shown by your HTTP client!
259-
XMLConverter::create()->download($reader, 'name-for-your-file.xml');
297+
new XMLConverter()->download($reader, 'name-for-your-file.xml');
260298
die;
261299
```
262300

@@ -275,7 +313,7 @@ $reader->setHeaderOffset(0);
275313
header('Cache-Control: no-cache, no-store, must-revalidate');
276314
header('Pragma: no-cache');
277315
header('Expires: 0');
278-
XMLConverter::create()->download(
316+
new XMLConverter()->download(
279317
records: $reader,
280318
filename: 'generated_file.xml',
281319
encoding: 'iso-8859-1',

docs/9.0/extensions/doctrine.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ $csv = Reader::createFromPath('/path/to/my/file.csv');
2828
$csv->setHeaderOffset(0);
2929
$csv->setDelimiter(';');
3030

31-
$criteria = Statement::create()
31+
$criteria = (new Statement())
3232
->andWhere('prenom', '=', 'Adam')
3333
->orderByAsc('annee')
3434
->orderByDesc('foo')
@@ -114,7 +114,7 @@ $csv = Reader::createFromPath('/path/to/my/file.csv');
114114
$csv->setHeaderOffset(0);
115115
$csv->setDelimiter(';');
116116

117-
$stmt = Statement::create()
117+
$stmt = (new Statement())
118118
->where(fn (array $row): bool => isset($row['email']) && str_ends_with($row['email'], '@github.com'));
119119

120120
$collection = new RecordCollection($stmt->process($csv));

docs/9.0/index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ $csv->setHeaderOffset(0); //set the CSV header offset
2828
$csv->setEscape(''); //required in PHP8.4+ to avoid deprecation notices
2929

3030
//get 25 records starting from the 11th row
31-
$stmt = Statement::create()
31+
$stmt = new Statement()
3232
->offset(10)
3333
->limit(25)
3434
;
@@ -140,7 +140,7 @@ $csv->setDelimiter(';');
140140
$csv->setHeaderOffset(0);
141141
$csv->setEscape(''); //required in PHP8.4+ to avoid deprecation notices
142142

143-
$converter = (new XMLConverter())
143+
$converter = new XMLConverter()
144144
->rootElement('csv')
145145
->recordElement('record', 'offset')
146146
->fieldElement('field', 'name')

docs/9.0/reader/resultset.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ foreach ($records as $record) {
8282
}
8383

8484
$reader = Reader::createFromFileObject($tmp)->setHeaderOffset(0);
85-
$stmt = Statement::create()->offset(1)->limit(1);
85+
$stmt = (new Statement())->offset(1)->limit(1);
8686
$result = $stmt->process($reader);
8787

8888
echo '<pre>', PHP_EOL;

0 commit comments

Comments
 (0)