Skip to content

Commit 42121dc

Browse files
committed
Adding conditionable method to converter
1 parent 599c7f3 commit 42121dc

27 files changed

+388
-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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,43 @@ be lower than one otherwise a exception will be thrown.
143143
$converter = JsonConverter::create()->chunkSize(1_000);
144144
$converter->chunkSize; //returns the value used
145145
```
146+
### JsonConverter::when
147+
148+
<p class="message-info">New feature introduced in version <code>9.22.0</code></p>
149+
150+
This method allows to conditionally create your converter depending on the success or
151+
failure of a condition.
152+
153+
```php
154+
use League\Csv\JsonConverter;
155+
156+
$converter = JsonConverter::create();
157+
if ($condition) {
158+
$converter = $converter->chunkSize(1_000);
159+
} else {
160+
$converter = $converter->chunkSize(200);
161+
}
162+
```
163+
164+
becomes
165+
166+
```php
167+
$stmt = JsonConverter::create()
168+
->when(
169+
$condition,
170+
fn (JsonConverter $c) => $c->chunkSize(1_000),
171+
fn (JsonConverter $c) => $c->chunkSize(200),
172+
);
173+
)
174+
```
175+
176+
The `else` expression is not required but if present in **MUST BE** a callable which only
177+
accepts the `JsonConverter` instance and returns `null` or a `JsonConverter` instance.
178+
179+
The only requirements are:
180+
181+
- that the condition is a `boolean` or a callable that returns a `boolean`.
182+
- the callback returns a `JsonConverter` instance or null.
146183

147184
## Conversion
148185

docs/9.0/converter/xml.md

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,15 @@ $csv = Reader::createFromPath('/path/to/prenoms.csv', 'r');
100100
$csv->setDelimiter(';');
101101
$csv->setHeaderOffset(0);
102102

103-
$stmt = (new Statement())
103+
$stmt = new Statement()
104104
->where(function (array $record) {
105105
return 'Anaïs' === $record['prenoms'];
106106
})
107107
->offset(0)
108108
->limit(2)
109109
;
110110

111-
$converter = (new XMLConverter())
111+
$converter = new XMLConverter()
112112
->rootElement('csv')
113113
->recordElement('record', 'offset')
114114
->fieldElement('field', 'name')
@@ -148,6 +148,44 @@ echo htmlentities($dom->saveXML());
148148
// </root>
149149
```
150150

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

153191
<p class="message-notice">The method is deprecated in version <code>9.22.0</code> use <code>XMLConverter::import</code> instead</p>
@@ -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)