diff --git a/CHANGELOG.md b/CHANGELOG.md index 381669d..dc4a354 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,35 @@ # (MODX)EvolutionCMS.snippets.ddGetMultipleField changelog +## Version 3.10 (2024-09-06) + +* \+ Parameters → `rowTpl` → Available placeholders: + * \+ `[+allColumnValuesObjectJson+]`: The new placeholder. Contains values of all columns as a JSON object, where keys are original column keys, values are values. + * \+ `[+`_columnKey_`.`_nestedProperty_`+]`, `[+col`_columnNumber_`.`_nestedProperty_`+]`: The new placeholders. Contain values of nested properties, when a column value is an object. +* \* `\ddTools::getTpl` is used instead of `$modx->getTpl` (means a bit less bugs). +* \* Attention! (MODX)EvolutionCMS.libraries.ddTools >= 0.62 is required. + + ## Version 3.9 (2023-01-11) + * \+ Parameters → `inputString`: Can also be set as a [HJSON](https://hjson.github.io/) or [Query formatted](https://en.wikipedia.org/wiki/Query_string) string. * \* Parameters → `outerTpl`: Placeholders `[+rowY.colX+]` works fine even source object has custom string keys. ## Version 3.8.2 (2022-08-10) + * \* Parameters: * \* `columns`: Wrong working with the `0` value has been fixed. * \* `colTpl`: Wrong working with the empty value has been fixed. ## Version 3.8.1 (2022-06-09) + * \* Parameters → `colTpl`: Support of various column numbers in different rows has been improved. ## Version 3.8 (2022-06-04) + * \* Parameters: * \+ `inputString`: Supports JSON with any nesting level. * \+ `colTpl[$i]` → Placeholders: @@ -30,11 +43,13 @@ ## Version 3.7 (2021-10-05) + * \+ Parameters → `rowTpl`, `colTpl[i]`: The new placeholder `[+rowKey+]` has been added (see README). * \+ Parameters → `colTpl[i]`: The new placeholders `[+total+]` and `[+resultTotal+]` have beed added (see README). ## Version 3.6 (2021-06-28) + * \* Attention! PHP >= 5.6 is required. * \* Attention! (MODX)EvolutionCMS.libraries.ddTools >= 0.50 is required. * \* Attention! (MODX)EvolutionCMS.snippets.ddTypograph >= 2.5 is required. @@ -54,10 +69,12 @@ ## Version 3.5.1 (2020-06-22) + * \* Improved compatibility with new versions of (MODX)EvolutionCMS.libraries.ddTools. ## Version 3.5 (2020-05-25) + * \+ Parameters → `inputString`: Can also be a JSON object, not just an array. * \* Parameters → `filter`: * \* “Is equal” operator changed to `==` from `::` (with backward compatibility). @@ -73,6 +90,7 @@ ## Version 3.4 (2018-11-14) + * \+ Parameters → `placeholders`: * \+ Added arrays support. * \+ Added JSON format support. @@ -83,6 +101,7 @@ ## Version 3.3 (2016-06-06) + * \+ Parameters → `outerTpl`, `rowTpl`, `colTpl`: Added the ability to use inline templates in snippet call, using `'@CODE:'` prefix. * \+ Parameters → `rowTpl`, `colTpl`: Additional data from the `placeholders` parameter are now also will be passed into row and column templates * \* Parameters → `placeholders`: Additional data has to be passed through the parameter must be a Query string (the old format is still supported but deprecated). @@ -94,6 +113,7 @@ ## Version 3.2 (2015-06-23) + * \+ Parameters → `colTpl:` The `[+rowNumber+]` placeholder is now also available within column templates. * \+ Parameters → `rowTpl`, `colTpl`: The new placeholder `[+rowNumber.zeroBased+]` (index of the current row, starts at 0) was added to row and column templates. It’s very useful sometimes. * \* Refactoring: @@ -104,10 +124,12 @@ ## Version 3.1 (2014-07-03) + * \+ Parameters → `outputFormat`: The new output format type `htmlarray` has been added. It is a one-dimensional array, which elements are completely processed rows. As with `array`, it makes sense to use the parameter only with `resultToPlaceholder`. ## Version 3.0b (2014-03-02) + * \* Attention! (MODX)EvolutionCMS.libraries.ddTools >= 0.11 is required. * \* The `\ddTools:sort2dArray` method is used for sorting instead of the local function. * \* The `\ddTools:getTemplateVarOutput` method is used for getting field value instead of (MODX)EvolutionCMS.snippets.ddGetDocumentField. @@ -143,6 +165,7 @@ ## Version 2.18 (2013-11-11) + * \* Attention! (MODX)EvolutionCMS.libraries.ddTools >= 0.10 is required. * \+ Parameters → `tplWrap`, `tplY`: The new placeholder `[+resultTotal+]` being used in the chunks holds the total number of **RETURNED** elements. * \* Parameters → `tplWrap`: @@ -153,18 +176,22 @@ ## Version 2.17 (2013-09-18) + * \+ Parameters → `vals`: Filtration of all columns is now available. ## Version 2.16.2 (2013-07-11) + * \* Values contained in the integer type columns are being compared like integers while sorting. ## Version 2.16.1 (2013-06-13) + * \* Bugfix: Undeclared variables in PHP >= 5.3. ## Version 2.16 (2013-03-28) + * \* Attention! (MODX)EvolutionCMS.snippets.ddGetDocumentField >= 2.4 is required. * \+ Parameters → `tplWrap`: The `[+total+]` placeholder is now available. * \+ Parameters → `splY`, `splX`: Can process regular expressions. @@ -174,16 +201,19 @@ ## Version 2.15 (2013-02-11) + * \+ Parameters → `totalPlaceholder`. The new parameter. The outputting of the total number of rows into an external placeholder has been added. ## Version 2.14 (2013-01-10) + * \+ Parameters → `tplY`: The placeholder `[+total+]` that is the number of all rows has been added into the chunk. ## Version 2.13 (2012-09-03) + * \+ Parameters → `sortDir`: The `'REVERSE'` value of the parameter has been added. Values would be returned in reverse order if the parameter equaled `'REVERSE'`. - + \ No newline at end of file diff --git a/CHANGELOG_ru.md b/CHANGELOG_ru.md index cd2d076..5504d94 100644 --- a/CHANGELOG_ru.md +++ b/CHANGELOG_ru.md @@ -1,22 +1,35 @@ # (MODX)EvolutionCMS.snippets.ddGetMultipleField changelog +## Версия 3.10 (2024-09-06) + +* \+ Параметры → `rowTpl` → Доступные плейсхолдеры: + * \+ `[+allColumnValuesObjectJson+]`: Новый плейсхолдер. Содержит значения всех колонок в виде JSON-объекта, где ключи — исходные ключи колонок, значения — значения. + * \+ `[+`_columnKey_`.`_nestedProperty_`+]`, `[+col`_columnNumber_`.`_nestedProperty_`+]`: Новые плейсхолдеры. Содержат значения вложенных свойств, когда значение колонки является объектом. +* \* `\ddTools::getTpl` используется вместо `$modx->getTpl` (стало чуть меньше багов). +* \* Внимание! Требуется (MODX)EvolutionCMS.libraries.ddTools >= 0.62. + + ## Версия 3.9 (2023-01-11) + * \+ Параметры → `inputString`: Также может быть задан, как [HJSON](https://hjson.github.io/) или [Query formatted string](https://en.wikipedia.org/wiki/Query_string). * \* Параметры → `outerTpl`: Плейсхолдеры `[+rowY.colX+]` работают нормально даже если исходный объект имеет произвольные строковые ключи. ## Версия 3.8.2 (2022-08-10) + * \* Параметры: * \* `columns`: Исправлена некорректная работа со значением `0`. * \* `colTpl`: Исправлена некорректная работа с пустым значением. ## Версия 3.8.1 (2022-06-09) + * \* Параметры → `colTpl`: Улучшена поддержка различного количества колонок в разных строках. ## Версия 3.8 (2022-06-04) + * \* Параметры: * \+ `inputString`: Поддерживает JSON с любым уровнем вложенности. * \+ `colTpl[$i]` → Плейсхолдеры: @@ -30,11 +43,13 @@ ## Версия 3.7 (2021-10-05) + * \+ Параметры → `rowTpl`, `colTpl[i]`: Добавлен новый плейсхолдер `[+rowKey+]` (см. README). * \+ Параметры → `colTpl[i]`: Добавлены новые плейсхолдеры `[+total+]` и `[+resultTotal+]` (см. README). ## Версия 3.6 (2021-06-28) + * \* Внимание! Требуется PHP >= 5.6. * \* Внимание! Требуется (MODX)EvolutionCMS.libraries.ddTools >= 0.50. * \* Внимание! Требуется (MODX)EvolutionCMS.snippets.ddTypograph >= 2.5. @@ -54,10 +69,12 @@ ## Версия 3.5.1 (2020-06-22) + * \* Улучшена совместимость с новыми версиями (MODX)EvolutionCMS.libraries.ddTools. ## Версия 3.5 (2020-05-25) + * \+ Параметры → `inputString`: Также может быть и JSON объектом, не только массивом. * \* Параметры → `filter`: * \* Оператор «равно» изменён на `==` с `::` (с обратной совместимостью). @@ -73,6 +90,7 @@ ## Версия 3.4 (2018-11-14) + * \+ Параметры → `placeholders`: * \+ Добавлена поддержка массивов * \+ Добавлена поддержка формата JSON. @@ -83,6 +101,7 @@ ## Версия 3.3 (2016-06-06) + * \+ Параметры → `outerTpl`, `rowTpl`, `colTpl`: Добавлена возможность использовать встроенные шаблоны, используя префикс `'@CODE:'`. * \+ Параметры → `rowTpl`, `colTpl`: Дополнительные данные из параметра `placeholders` теперь также будут переданы в шаблоны строк и колонок. * \* Параметры → `placeholders`: Дополнительные данные, передаваемые в параметр `placeholders` должны быть в виде Query string (старый формат поддерживается, но не рекомендуется к использвоанию). @@ -94,6 +113,7 @@ ## Версия 3.2 (2015-06-23) + * \+ Параметры → `colTpl:` Плэйсхолдер `[+rowNumber+]` также доступен в шаблонах колонок. * \+ Параметры → `rowTpl`, `colTpl`: Доступен довый плэйсхолдер `[+rowNumber.zeroBased+]` — номер строки, начинающийся с 0, это бывает удобно. * \* Рефакторинг: @@ -104,10 +124,12 @@ ## Версия 3.1 (2014-07-03) + * \+ Параметры → `outputFormat`: Добавлен формат вывода `htmlarray` — одномерный массив, элементы которого — готовые полностью обработанные строки. Как и `array`, имеет смысл использовать вместе с параметром `resultToPlaceholder`. ## Версия 3.0b (2014-03-02) + * \* Внимание! Требуется (MODX)EvolutionCMS.libraries.ddTools >= 0.11. * \* Вместо локальной функции для сортировки используется метод `\ddTools:sort2dArray`. * \* Значение поля получается при помощи метода `\ddTools:getTemplateVarOutput`, (MODX)EvolutionCMS.snippets.ddGetDocumentField больше не используется. @@ -143,6 +165,7 @@ ## Версия 2.18 (2013-11-11) + * \* Внимание! Требуется (MODX)EvolutionCMS.libraries.ddTools >= 0.10. * \+ Параметры → `tplWrap`, `tplY`: Добавлен плэйсхолдер `[+resultTotal+]`, содержащий количество **возвращаемых** элементов. * \* Параметры → `tplWrap`: @@ -153,18 +176,22 @@ ## Версия 2.17 (2013-09-18) + * \+ Параметры → `vals`: Добавлена фильтрация по всем колонкам. ## Версия 2.16.2 (2013-07-11) + * \* При сортировке добавлена обработка числовых значений, теперь они сравниваются как числа, а не как строки. ## Версия 2.16.1 (2013-06-13) + * \* Исправлена ошибка с обращением к не объявленным переменным (PHP >= 5.3). ## Версия 2.16 (2013-03-28) + * \* Внимание! Требуется (MODX)EvolutionCMS.snippets.ddGetDocumentField >= 2.4. * \+ Параметры → `tplWrap`: Плэйсхолдер `[+total+]` теперь выводится и здесь. * \+ Параметры → `splY`, `splX`: Теперь могут принимать регулярные выражения. @@ -174,16 +201,19 @@ ## Версия 2.15 (2013-02-11) + * \+ Параметры → `totalPlaceholder`: Новый параметр. Добавлена возможность выводить общее количество строк во внешний плэйсхолдер. ## Версия 2.14 (2013-01-10) + * \+ Параметры → `tplY`: Добавлен плэйсхолдер `[+total+]`, содержащий общее количество строк. ## Версия 2.13 (2012-09-03) + * \+ Параметры → `sortDir`: Добавлено возможное значение `'REVERSE'`, при котором значения выводятся просто в обратном порядке. - + \ No newline at end of file diff --git a/README.md b/README.md index 7471ef7..8797a98 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # (MODX)EvolutionCMS.snippets.ddGetMultipleField A snippet for processing, manipulations and custom output structured data (JSON or separated by delimiters strings). -The fields formed by the [mm_ddMultipleFields](https://code.divandesign.biz/modx/mm_ddmultiplefields) widget values output gets more convinient with the snippet. +The fields formed by the [mm_ddMultipleFields](https://code.divandesign.ru/modx/mm_ddmultiplefields) widget values output gets more convinient with the snippet. Features: * Field value getting of a required document (TV) by its ID. The `inputString_docField` and `inputString_docId` parameters. @@ -21,43 +21,25 @@ Features: * PHP >= 5.6 * [(MODX)EvolutionCMS](https://github.com/evolution-cms/evolution) >= 1.1 -* [(MODX)EvolutionCMS.libraries.ddTools](https://code.divandesign.biz/modx/ddtools) >= 0.50 -* [(MODX)EvolutionCMS.snippets.ddTypograph](https://code.divandesign.biz/modx/ddtypograph) >= 2.5 (if typography is required) +* [(MODX)EvolutionCMS.libraries.ddTools](https://code.divandesign.ru/modx/ddtools) >= 0.62 +* [(MODX)EvolutionCMS.snippets.ddTypograph](https://code.divandesign.ru/modx/ddtypograph) >= 2.5 (if typography is required) ## Installation -### Manually - - -#### 1. Elements → Snippets: Create a new snippet with the following data - -1. Snippet name: `ddGetMultipleField`. -2. Description: `3.9 A snippet for processing, manipulations and custom output structured data (JSON or separated by delimiters strings).`. -3. Category: `Core`. -4. Parse DocBlock: `no`. -5. Snippet code (php): Insert content of the `ddGetMultipleField_snippet.php` file from the archive. - - -#### 2. Elements → Manage Files - -1. Create a new folder `assets/snippets/ddGetMultipleField/`. -2. Extract the archive to the folder (except `ddGetMultipleField_snippet.php`). - - ### Using [(MODX)EvolutionCMS.libraries.ddInstaller](https://github.com/DivanDesign/EvolutionCMS.libraries.ddInstaller) Just run the following PHP code in your sources or [Console](https://github.com/vanchelo/MODX-Evolution-Ajax-Console): ```php -//Include (MODX)EvolutionCMS.libraries.ddInstaller +// Include (MODX)EvolutionCMS.libraries.ddInstaller require_once( $modx->getConfig('base_path') . 'assets/libs/ddInstaller/require.php' ); -//Install (MODX)EvolutionCMS.snippets.ddGetMultipleField +// Install (MODX)EvolutionCMS.snippets.ddGetMultipleField \DDInstaller::install([ 'url' => 'https://github.com/DivanDesign/EvolutionCMS.snippets.ddGetMultipleField', 'type' => 'snippet' @@ -68,13 +50,31 @@ require_once( * If `ddGetMultipleField` is already exist on your site, `ddInstaller` will check it version and update it if needed. +### Manually + + +#### 1. Elements → Snippets: Create a new snippet with the following data + +1. Snippet name: `ddGetMultipleField`. +2. Description: `3.10 A snippet for processing, manipulations and custom output structured data (JSON or separated by delimiters strings).`. +3. Category: `Core`. +4. Parse DocBlock: `no`. +5. Snippet code (php): Insert content of the `ddGetMultipleField_snippet.php` file from the archive. + + +#### 2. Elements → Manage Files + +1. Create a new folder `assets/snippets/ddGetMultipleField/`. +2. Extract the archive to the folder (except `ddGetMultipleField_snippet.php`). + + ## Parameters description From the pair of `inputString` / `inputString_docField` parameters one is required. * `inputString` - * Desctription: The input string containing values. - Also supports JSON with any nesting level. + * Description: The input string containing values. + * Also supports JSON with any nesting level. * Valid values: * `stringJsonArray` — [JSON](https://en.wikipedia.org/wiki/JSON) array * `stringJsonObject` — [JSON](https://en.wikipedia.org/wiki/JSON) object @@ -85,44 +85,44 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * **Required** * `inputString_docField` - * Desctription: The name of the document field/TV which value is required to get. - If the parameter is passed then the input string will be taken from the field / TV and `inputString` will be ignored. + * Description: The name of the document field/TV which value is required to get. + * If the parameter is passed then the input string will be taken from the field / TV and `inputString` will be ignored. * Valid values: `string` * Default value: — * `inputString_docId` - * Desctription: ID of the document which field/TV value is required to get. + * Description: ID of the document which field/TV value is required to get. * Valid values: `integer` * Default value: `$modx->documentIdentifier` (the current document ID) * `inputString_rowDelimiter` - * Desctription: The input string row delimiter (when `inputString` is not JSON). + * Description: The input string row delimiter (when `inputString` is not JSON). * Valid values: * `string` * `regexp` * Default value: `'||'` * `inputString_colDelimiter` - * Desctription: The input string column delimiter (when `inputString` is not JSON). + * Description: The input string column delimiter (when `inputString` is not JSON). * Valid values: * `string` * `regexp` * Default value: `'::'` * `startRow` - * Desctription: The index of the initial row (indexes start at `0`). + * Description: The index of the initial row (indexes start at `0`). * Valid values: `integer` * Default value: `0` * `totalRows` - * Desctription: The maximum number of rows to return. + * Description: The maximum number of rows to return. * Valid values: * `integer` * `'all'` — all rows will be returned * Default value: `'all'` * `columns` - * Desctription: The indexes of columns to return (indexes start at `0`). + * Description: The indexes of columns to return (indexes start at `0`). * Valid values: * `stringCommaSeparated` * `array` @@ -130,7 +130,7 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * Default value: `'all'` * `filter` - * Desctription: Filter clause for columns. + * Description: Filter clause for columns. * Thus, ``` 0 == 'a' || @@ -162,29 +162,29 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * Default value: — * `removeEmptyRows` - * Desctription: Is it required to remove empty rows? + * Description: Is it required to remove empty rows? * Valid values: * `0` * `1` * Default value: `1` * `removeEmptyCols` - * Desctription: Is it required to remove empty columns? + * Description: Is it required to remove empty columns? * Valid values: * `0` * `1` * Default value: `1` * `sortBy` - * Desctription: The index of the column to sort by (indexes start at `0`). - The parameter also takes comma-separated values for multiple sort, e.g. `'0,1'`. + * Description: The index of the column to sort by (indexes start at `0`). + * The parameter also takes comma-separated values for multiple sort, e.g. `'0,1'`. * Valid values: * `stringCommaSeparated` * `array` * Default value: `'0'` * `sortDir` - * Desctription: Rows sorting direction (case insensitive). + * Description: Rows sorting direction (case insensitive). * Valid values: * `'ASC'` — the rows will be returned in ascending order * `'DESC'` — the rows will be returned in descending order @@ -194,15 +194,15 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * Default value: `''` * `typography` - * Desctription: The comma separated indexes of the columns which values have to be corrected (indexes start at `0`). - If unset, there will be no correction. + * Description: The comma separated indexes of the columns which values have to be corrected (indexes start at `0`). + * If unset, there will be no correction. * Valid values: * `stringCommaSeparated` * `array` * Default value: — * `outputFormat` - * Desctription: Result output format (case insensitive). + * Description: Result output format (case insensitive). * Valid values: * `'html'` * `'json'` @@ -211,52 +211,54 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * Default value: `'html'` * `rowGlue` - * Desctription: The string that combines rows while rendering. - It can be used along with `rowTpl`. + * Description: The string that combines rows while rendering. + * It can be used along with `rowTpl`. * Valid values: `string` * Default value: `''` * `colGlue` - * Desctription: The string that combines columns while rendering. - It can be used along with `colTpl` and `rowTpl`. + * Description: The string that combines columns while rendering. + * It can be used along with `colTpl` and `rowTpl`. * Valid values: `string` * Default value: `''` * `rowTpl` - * Desctription: The template for row rendering (`outputFormat` has to be == `'html'`). - Available placeholders: - * `[+rowNumber+]` — index of current row, starts at `1` - * `[+rowNumber.zeroBased+]` — index of current row, starts at `0` - * `[+rowKey+]` — key of current row, it is usefull for objects or associative arrays in `inputString`, for indexed arrays the placeholder is equal to `[+rowNumber.zeroBased+]` - * `[+total+]` — total number of rows - * `[+resultTotal+]` — total number of returned rows - * `[+col0+]`, `[+col1+]`, etc — column values - * `[+`_columnKey_`+]` — column values, when _columnKey_ is original column key (see examples below) - * `[+allColumnValues+]` — values of all columns combined by `colGlue` + * Description: The template for row rendering (`outputFormat` has to be == `'html'`). + * Available placeholders: + * `[+rowNumber+]` — index of current row, starts at `1` + * `[+rowNumber.zeroBased+]` — index of current row, starts at `0` + * `[+rowKey+]` — key of current row, it is usefull for objects or associative arrays in `inputString`, for indexed arrays the placeholder is equal to `[+rowNumber.zeroBased+]` + * `[+total+]` — total number of rows + * `[+resultTotal+]` — total number of returned rows + * `[+col`_columnNumber_`+]` (e. g. `[+col0+]`, `[+col1+]`, etc) — column values, when _columnNumber_ is zero-based column number + * `[+`_columnKey_`+]` — column values, when _columnKey_ is original column key (see examples below) + * `[+`_columnKey_`.`_nestedProperty_`+]`, `[+col`_columnNumber_`.`_nestedProperty_`+]` — values of a nested properties, if a column value is an object + * `[+allColumnValues+]` — values of all columns combined by `colGlue` + * `[+allColumnValuesObjectJson+]` — values of all columns as a JSON object, where keys are original column keys, values are values * Valid values: * `stringChunkName` * `string` — use inline templates starting with `@CODE:` * Default value: — * `colTpl` - * Desctription: The comma-separated list of templates for column rendering (`outputFormat` has to be == `'html'`). - If the number of templates is lesser than the number of columns then the last passed template will be used to render the rest of the columns. + * Description: The comma-separated list of templates for column rendering (`outputFormat` has to be == `'html'`). + * If the number of templates is lesser than the number of columns then the last passed template will be used to render the rest of the columns. * Valid values: * `stringCommaSeparated` * `array` * Default value: — * `colTpl[$i]` - * Desctription: The template for column rendering. - Available placeholders: - * `[+val+]` — value of the column - * `[+columnIndex+]` — index of the column, starts at `0` - * `[+columnKey+]` — key of the column, it is usefull for objects or associative arrays in `inputString`, for indexed arrays the placeholder is equal to `[+columnIndex+]` - * `[+rowNumber+]` — index of current row, starts at `1` - * `[+rowNumber.zeroBased+]` — index of current row, starts at `0` - * `[+rowKey+]` — key of current row, it is usefull for objects or associative arrays in `inputString`, for indexed arrays the placeholder is equal to `[+rowNumber.zeroBased+]` - * `[+total+]` — total number of rows - * `[+resultTotal+]` — total number of returned rows + * Description: The template for column rendering. + * Available placeholders: + * `[+val+]` — value of the column + * `[+columnIndex+]` — index of the column, starts at `0` + * `[+columnKey+]` — key of the column, it is usefull for objects or associative arrays in `inputString`, for indexed arrays the placeholder is equal to `[+columnIndex+]` + * `[+rowNumber+]` — index of current row, starts at `1` + * `[+rowNumber.zeroBased+]` — index of current row, starts at `0` + * `[+rowKey+]` — key of current row, it is usefull for objects or associative arrays in `inputString`, for indexed arrays the placeholder is equal to `[+rowNumber.zeroBased+]` + * `[+total+]` — total number of rows + * `[+resultTotal+]` — total number of returned rows * Valid values: * `stringChunkName` * `string` — use inline templates starting with `@CODE:` @@ -264,36 +266,35 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * Default value: `'null'` * `outerTpl` - * Desctription: Wrapper template (`outputFormat` has to be != `'array'`). - Available placeholders: - * `[+result+]` — snippet result - * `[+total+]` — total number of rows - * `[+resultTotal+]` — total number of returned rows - * `[+rowY.colX+]` — value (`Y` — row number, `X` — column number) - * `[+rowKey.colX+]` — value (`Key` — row key, `X` — column number) + * Description: Wrapper template (`outputFormat` has to be != `'array'`). + * Available placeholders: + * `[+result+]` — snippet result + * `[+total+]` — total number of rows + * `[+resultTotal+]` — total number of returned rows + * `[+rowY.colX+]` — value (`Y` — row number, `X` — column number) + * `[+rowKey.colX+]` — value (`Key` — row key, `X` — column number) * Valid values: * `stringChunkName` * `string` — use inline templates starting with `@CODE:` * Default value: — * `placeholders` - * Desctription: - Additional data has to be passed into the `outerTpl`, `rowTpl` and `colTpl` templates. - Nested objects and arrays are supported too: - * `{"someOne": "1", "someTwo": "test" }` => `[+someOne+], [+someTwo+]`. - * `{"some": {"a": "one", "b": "two"} }` => `[+some.a+]`, `[+some.b+]`. - * `{"some": ["one", "two"] }` => `[+some.0+]`, `[+some.1+]`. + * Description: Additional data has to be passed into the `outerTpl`, `rowTpl` and `colTpl` templates. + * Nested objects and arrays are supported too: + * `{"someOne": "1", "someTwo": "test" }` => `[+someOne+], [+someTwo+]`. + * `{"some": {"a": "one", "b": "two"} }` => `[+some.a+]`, `[+some.b+]`. + * `{"some": ["one", "two"] }` => `[+some.0+]`, `[+some.1+]`. * Valid values: * `stringJsonObject` — as [JSON](https://en.wikipedia.org/wiki/JSON) * `stringHjsonObject` — as [HJSON](https://hjson.github.io/) - * `stringQueryFormated` — as [Query string](https://en.wikipedia.org/wiki/Query_string) + * `stringQueryFormatted` — as [Query string](https://en.wikipedia.org/wiki/Query_string) * It can also be set as a native PHP object or array (e. g. for calls through `$modx->runSnippet`): * `arrayAssociative` * `object` * Default value: — * `urlencode` - * Desctription: Is it required to URL encode the result? + * Description: Is it required to URL encode the result? * `outputFormat` has to be != `'array'`. * URL encoding is used according to RFC 3986. * Valid values: @@ -302,14 +303,14 @@ From the pair of `inputString` / `inputString_docField` parameters one is requir * Default value: `0` * `totalRowsToPlaceholder` - * Desctription: The name of the global (MODX)Evolution placeholder that holds the total number of rows. - The placeholder won't be set if `totalRowsToPlaceholder` is empty. + * Description: The name of the global (MODX)Evolution placeholder that holds the total number of rows. + * The placeholder won't be set if `totalRowsToPlaceholder` is empty. * Valid values: `string` * Default value: — * `resultToPlaceholder` - * Desctription: The name of the global (MODX)Evolution placeholder that holds the snippet result. - The result will be returned in a regular manner if the parameter is empty. + * Description: The name of the global (MODX)Evolution placeholder that holds the snippet result. + * The result will be returned in a regular manner if the parameter is empty. * Valid values: `string` * Default value: — @@ -478,7 +479,7 @@ Returns: ### Return document tags separated by commas using a regular expression in `inputString_rowDelimiter` -[(MODX)EvolutionCMS.plugins.ManagerManager.mm_widget_tags](https://code.divandesign.biz/modx/mm_widget_tags) is applied to `tags` TV where document tags are stored in `tags`. +[(MODX)EvolutionCMS.plugins.ManagerManager.mm_widget_tags](https://code.divandesign.ru/modx/mm_widget_tags) is applied to `tags` TV where document tags are stored in `tags`. User fills in the tags separated by commas, while the field may be filled both with spaces on the sides and without them. `tags` TV value: @@ -699,13 +700,13 @@ Returns: ### Run the snippet through `\DDTools\Snippet::runSnippet` without DB and eval ```php -//Include (MODX)EvolutionCMS.libraries.ddTools +// Include (MODX)EvolutionCMS.libraries.ddTools require_once( $modx->getConfig('base_path') . 'assets/libs/ddTools/modx.ddtools.class.php' ); -//Run (MODX)EvolutionCMS.snippets.ddGetMultipleField +// Run (MODX)EvolutionCMS.snippets.ddGetMultipleField \DDTools\Snippet::runSnippet([ 'name' => 'ddGetMultipleField', 'params' => [ @@ -719,8 +720,8 @@ require_once( "Example image 2" ] ]', - 'rowTpl' => '@CODE:[+col1+]' - ] + 'rowTpl' => '@CODE:[+col1+]', + ], ]); ``` @@ -730,9 +731,10 @@ _It is hard to write here all possible examples so if here is something that you ## Links -* [Home page](https://code.divandesign.biz/modx/ddgetmultiplefield) +* [Home page](https://code.divandesign.ru/modx/ddgetmultiplefield) * [Telegram chat](https://t.me/dd_code) * [Packagist](https://packagist.org/packages/dd/evolutioncms-snippets-ddgetmultiplefield) +* [GitHub](https://github.com/DivanDesign/EvolutionCMS.snippets.ddGetMultipleField) - \ No newline at end of file + \ No newline at end of file diff --git a/README_ru.md b/README_ru.md index 0f8ac73..f79e89d 100644 --- a/README_ru.md +++ b/README_ru.md @@ -1,7 +1,7 @@ # (MODX)EvolutionCMS.snippets.ddGetMultipleField Сниппет для обработки, изменения и произвольного вывода структурированных данных (JSON или разделённых через определённые разделители). -Удобно использовать для вывода значений полей документов, сформированных виджетом [mm_ddMultipleFields](https://code.divandesign.biz/modx/mm_ddmultiplefields). +Удобно использовать для вывода значений полей документов, сформированных виджетом [mm_ddMultipleFields](https://code.divandesign.ru/modx/mm_ddmultiplefields). Возможности: * Получение необходимого поля документа / TV по его ID. Параметры `inputString_docField` и `inputString_docId`. @@ -21,43 +21,25 @@ * PHP >= 5.6 * [(MODX)EvolutionCMS](https://github.com/evolution-cms/evolution) >= 1.1 -* [(MODX)EvolutionCMS.libraries.ddTools](https://code.divandesign.biz/modx/ddtools) >= 0.50 -* [(MODX)EvolutionCMS.snippets.ddTypograph](https://code.divandesign.biz/modx/ddtypograph) >= 2.5 (if typography is required) +* [(MODX)EvolutionCMS.libraries.ddTools](https://code.divandesign.ru/modx/ddtools) >= 0.62 +* [(MODX)EvolutionCMS.snippets.ddTypograph](https://code.divandesign.ru/modx/ddtypograph) >= 2.5 (if typography is required) ## Установка -### Вручную - - -#### 1. Элементы → Сниппеты: Создайте новый сниппет со следующими параметрами - -1. Название сниппета: `ddGetMultipleField`. -2. Описание: `3.9 Сниппет для обработки, изменения и произвольного вывода структурированных данных (JSON или разделённых через определённые разделители).`. -3. Категория: `Core`. -4. Анализировать DocBlock: `no`. -5. Код сниппета (php): Вставьте содержимое файла `ddGetMultipleField_snippet.php` из архива. - - -#### 2. Элементы → Управление файлами - -1. Создайте новую папку `assets/snippets/ddGetMultipleField/`. -2. Извлеките содержимое архива в неё (кроме файла `ddGetMultipleField_snippet.php`). - - ### Используя [(MODX)EvolutionCMS.libraries.ddInstaller](https://github.com/DivanDesign/EvolutionCMS.libraries.ddInstaller) Просто вызовите следующий код в своих исходинках или модуле [Console](https://github.com/vanchelo/MODX-Evolution-Ajax-Console): ```php -//Подключение (MODX)EvolutionCMS.libraries.ddInstaller +// Подключение (MODX)EvolutionCMS.libraries.ddInstaller require_once( $modx->getConfig('base_path') . 'assets/libs/ddInstaller/require.php' ); -//Установка (MODX)EvolutionCMS.snippets.ddGetMultipleField +// Установка (MODX)EvolutionCMS.snippets.ddGetMultipleField \DDInstaller::install([ 'url' => 'https://github.com/DivanDesign/EvolutionCMS.snippets.ddGetMultipleField', 'type' => 'snippet' @@ -68,13 +50,31 @@ require_once( * Если `ddGetMultipleField` уже есть на вашем сайте, `ddInstaller` проверит его версию и обновит, если нужно. +### Вручную + + +#### 1. Элементы → Сниппеты: Создайте новый сниппет со следующими параметрами + +1. Название сниппета: `ddGetMultipleField`. +2. Описание: `3.10 Сниппет для обработки, изменения и произвольного вывода структурированных данных (JSON или разделённых через определённые разделители).`. +3. Категория: `Core`. +4. Анализировать DocBlock: `no`. +5. Код сниппета (php): Вставьте содержимое файла `ddGetMultipleField_snippet.php` из архива. + + +#### 2. Элементы → Управление файлами + +1. Создайте новую папку `assets/snippets/ddGetMultipleField/`. +2. Извлеките содержимое архива в неё (кроме файла `ddGetMultipleField_snippet.php`). + + ## Описание параметров Из пары параметров `inputString` / `inputString_docField` необходимо передавать лишь один. * `inputString` - * Описание: Исходная строка, содержащая значение. - Также поддерживает JSON с любым уровнем вложенности. + * Описание: Исходная строка, содержащая значение. + * Также поддерживает JSON с любым уровнем вложенности. * Допустимые значения: * `stringJsonArray` — [JSON](https://ru.wikipedia.org/wiki/JSON) массив * `stringJsonObject` — [JSON](https://ru.wikipedia.org/wiki/JSON) объект @@ -85,8 +85,8 @@ require_once( * **Обязателен** * `inputString_docField` - * Описание: Имя поля документа / TV, содержащего значение. - В этом случае параметр `inputString` игнорируется, значение получается из поля документа. + * Описание: Имя поля документа / TV, содержащего значение. + * В этом случае параметр `inputString` игнорируется, значение получается из поля документа. * Допустимые значения: `string` * Значение по умолчанию: — @@ -176,8 +176,8 @@ require_once( * Значение по умолчанию: `1` * `sortBy` - * Описание: Номер колонки, по которой необходимо сортировать (нумеруются с `0`). - Для множественной сортировки параметры указываются через запятую (например: `'0,1'`). + * Описание: Номер колонки, по которой необходимо сортировать (нумеруются с `0`). + * Для множественной сортировки параметры указываются через запятую (например: `'0,1'`). * Допустимые значения: * `stringCommaSeparated` * `array` @@ -194,8 +194,8 @@ require_once( * Значение по умолчанию: `''` * `typography` - * Описание: Номера колонок через запятую, значения которых нужно типографировать (колонки нумеруются с `0`). - Если не задано, ничего не типографируется. + * Описание: Номера колонок через запятую, значения которых нужно типографировать (колонки нумеруются с `0`). + * Если не задано, ничего не типографируется. * Допустимые значения: * `stringCommaSeparated` * `array` @@ -211,50 +211,52 @@ require_once( * Значение по умолчанию: `'html'` * `rowGlue` - * Описание: Разделитель (объединитель) между строками при выводе. - Может использоваться совместно с шаблоном `rowTpl`. + * Описание: Разделитель (объединитель) между строками при выводе. + * Может использоваться совместно с шаблоном `rowTpl`. * Допустимые значения: `string` * Значение по умолчанию: `''` * `colGlue` - * Описание: Разделитель (объединитель) между колонками при выводе. - Может использоваться совместно с шаблоном `colTpl` и `rowTpl`. + * Описание: Разделитель (объединитель) между колонками при выводе. + * Может использоваться совместно с шаблоном `colTpl` и `rowTpl`. * Допустимые значения: `string` * Значение по умолчанию: `''` * `rowTpl` - * Описание: Шаблон для вывода строк (при `outputFormat` == `'html'`). - Доступные плейсхолдеры: - * `[+rowNumber+]` — номер текущей строки, начинающийся с `1` - * `[+rowNumber.zeroBased+]` — номер текущей строки, начинающийся с `0` - * `[+rowKey+]` — ключ текущей строки, полезно для объектов или ассоциативных массивов в `inputString`, для индексировнных массивов плейсхолдер эквивалентен `[+rowNumber.zeroBased+]` - * `[+total+]` — бщее количество строк - * `[+resultTotal+]` — количество возвращаемых строк - * `[+col0+]`, `[+col1+]` и т. п. — значения соответствующих колонок - * `[+`_columnKey_`+]` — значения колонок, где _columnKey_ — оригинальный ключ колонки (см. примеры ниже) - * `[+allColumnValues+]` — значения всех колонок, объединённые через `colGlue` + * Описание: Шаблон для вывода строк (при `outputFormat` == `'html'`). + * Доступные плейсхолдеры: + * `[+rowNumber+]` — номер текущей строки, начинающийся с `1` + * `[+rowNumber.zeroBased+]` — номер текущей строки, начинающийся с `0` + * `[+rowKey+]` — ключ текущей строки, полезно для объектов или ассоциативных массивов в `inputString`, для индексировнных массивов плейсхолдер эквивалентен `[+rowNumber.zeroBased+]` + * `[+total+]` — бщее количество строк + * `[+resultTotal+]` — количество возвращаемых строк + * `[+col`_columnNumber_`+]` (например, `[+col0+]`, `[+col1+]` и т. п.) — значения соответствующих колонок, где _columnNumber_ — номер колонки, начинающийся с `0` + * `[+`_columnKey_`+]` — значения колонок, где _columnKey_ — оригинальный ключ колонки (см. примеры ниже) + * `[+`_columnKey_`.`_nestedProperty_`+]`, `[+col`_columnNumber_`.`_nestedProperty_`+]` — значения вложенных свойств, когда значение колонки является объектом + * `[+allColumnValues+]` — значения всех колонок, объединённые через `colGlue` + * `[+allColumnValuesObjectJson+]` — значения всех колонок в виде JSON-объекта, где ключи — исходные ключи колонок, значения — значения * Допустимые значения: * `stringChunkName` * `string` — передавать код напрямую без чанка можно начиная значение с `@CODE:` * Значение по умолчанию: — * `colTpl` - * Описание: Список шаблонов для вывода колонок, через запятую (при `outputFormat` == `'html'`). - Если шаблонов меньше, чем колонок, для всех недостающих выставляется последний указанный шаблон. + * Описание: Список шаблонов для вывода колонок, через запятую (при `outputFormat` == `'html'`). + * Если шаблонов меньше, чем колонок, для всех недостающих выставляется последний указанный шаблон. * Допустимые значения: * `stringCommaSeparated` * `array` * Значение по умолчанию: — * `colTpl[$i]` - * Описание: Шаблон для вывода колонки. - Доступные плейсхолдеры: - * `[+val+]` — значение колонки - * `[+columnIndex+]` — номер колонки, начинающийся с `0` - * `[+columnKey+]` — ключ колонки, полезно для объектов или ассоциативных массивов в `inputString`, для индексировнных массивов плейсхолдер эквивалентен `[+columnIndex+]` - * `[+rowNumber+]` — номер строки, начинающийся с `1` - * `[+rowNumber.zeroBased+]` — номер строки, начинающийся с `0` - * `[+rowKey+]` — ключ текущей строки, полезно для объектов или ассоциативных массивов в `inputString`, для индексировнных массивов плейсхолдер эквивалентен `[+rowNumber.zeroBased+]` + * Описание: Шаблон для вывода колонки. + * Доступные плейсхолдеры: + * `[+val+]` — значение колонки + * `[+columnIndex+]` — номер колонки, начинающийся с `0` + * `[+columnKey+]` — ключ колонки, полезно для объектов или ассоциативных массивов в `inputString`, для индексировнных массивов плейсхолдер эквивалентен `[+columnIndex+]` + * `[+rowNumber+]` — номер строки, начинающийся с `1` + * `[+rowNumber.zeroBased+]` — номер строки, начинающийся с `0` + * `[+rowKey+]` — ключ текущей строки, полезно для объектов или ассоциативных массивов в `inputString`, для индексировнных массивов плейсхолдер эквивалентен `[+rowNumber.zeroBased+]` * Допустимые значения: * `stringChunkName` * `string` — передавать код напрямую без чанка можно начиная значение с `@CODE:` @@ -262,35 +264,34 @@ require_once( * Значение по умолчанию: — * `outerTpl` - * Описание: Шаблон внешней обёртки (при `outputFormat` != `'array'`). - Доступные плейсхолдеры: - * `[+result+]` — результат сниппета - * `[+total+]` — общее количество строк - * `[+resultTotal+]` — количество возвращаемых строк - * `[+rowY.colX+]` — значение (где `Y` — номер строки, `X` — номер колонки) + * Описание: Шаблон внешней обёртки (при `outputFormat` != `'array'`). + * Доступные плейсхолдеры: + * `[+result+]` — результат сниппета + * `[+total+]` — общее количество строк + * `[+resultTotal+]` — количество возвращаемых строк + * `[+rowY.colX+]` — значение (где `Y` — номер строки, `X` — номер колонки) * Допустимые значения: * `stringChunkName` * `string` — передавать код напрямую без чанка можно начиная значение с `@CODE:` * Значение по умолчанию: — * `placeholders` - * Описание: - Дополнительные данные, которые будут переданы в шаблоны `outerTpl`, `rowTpl` и `colTpl`. - Вложенные объекты и массивы также поддерживаются: - * `{"someOne": "1", "someTwo": "test" }` => `[+someOne+], [+someTwo+]`. - * `{"some": {"a": "one", "b": "two"} }` => `[+some.a+]`, `[+some.b+]`. - * `{"some": ["one", "two"] }` => `[+some.0+]`, `[+some.1+]`. + * Описание: Дополнительные данные, которые будут переданы в шаблоны `outerTpl`, `rowTpl` и `colTpl`. + * Вложенные объекты и массивы также поддерживаются: + * `{"someOne": "1", "someTwo": "test" }` => `[+someOne+], [+someTwo+]`. + * `{"some": {"a": "one", "b": "two"} }` => `[+some.a+]`, `[+some.b+]`. + * `{"some": ["one", "two"] }` => `[+some.0+]`, `[+some.1+]`. * Допустимые значения: * `stringJsonObject` — в виде [JSON](https://ru.wikipedia.org/wiki/JSON) * `stringHjsonObject` — в виде [HJSON](https://hjson.github.io/) - * `stringQueryFormated` — в виде [Query string](https://en.wikipedia.org/wiki/Query_string) + * `stringQueryFormatted` — в виде [Query string](https://en.wikipedia.org/wiki/Query_string) * Также может быть задан, как нативный PHP объект или массив (например, для вызовов через `$modx->runSnippet`). * `arrayAssociative` * `object` * Значение по умолчанию: — * `urlencode` - * Описание: Надо URL-кодировать результирующую строку? + * Описание: Надо URL-кодировать результирующую строку? * При `outputFormat` != `'array'`. * Строка кодируется согласно RFC 3986. * Допустимые значения: @@ -299,14 +300,14 @@ require_once( * Значение по умолчанию: `0` * `totalRowsToPlaceholder` - * Описание: Имя внешнего плэйсхолдера (MODX)Evolution, в который нужно вывести общее количество строк. - Если параметр не задан — не выводится. + * Описание: Имя внешнего плэйсхолдера (MODX)Evolution, в который нужно вывести общее количество строк. + * Если параметр не задан — не выводится. * Допустимые значения: `string` * Значение по умолчанию: — * `resultToPlaceholder` - * Описание: Имя внешнего плэйсхолдера (MODX)Evolution, в который нужно сохранить результат работы сниппета вместо обычного вывода. - Если параметр не задан — сниппет просто возвращает реузльтат. + * Описание: Имя внешнего плэйсхолдера (MODX)Evolution, в который нужно сохранить результат работы сниппета вместо обычного вывода. + * Если параметр не задан — сниппет просто возвращает реузльтат. * Допустимые значения: `string` * Значение по умолчанию: — @@ -475,7 +476,7 @@ assets/images/some_img1.jpg::Изображение 1||assets/images/some_img2.j ### Вывод тегов документа через запятую с использованием регулярного выражения в `inputString_rowDelimiter` -Пусть теги документа у нас хранятся в TV `tags` и к этой TV у нас применён виджет [(MODX)EvolutionCMS.plugins.ManagerManager.mm_widget_tags](https://code.divandesign.biz/modx/mm_widget_tags). +Пусть теги документа у нас хранятся в TV `tags` и к этой TV у нас применён виджет [(MODX)EvolutionCMS.plugins.ManagerManager.mm_widget_tags](https://code.divandesign.ru/modx/mm_widget_tags). Пользователь заполняет теги через запятую, при этом, может заполняться как с пробелами по краям, так и без них. Значение TV `tags`: @@ -696,13 +697,13 @@ Returns: ### Запустить сниппет через `\DDTools\Snippet::runSnippet` без DB и eval ```php -//Подключение (MODX)EvolutionCMS.libraries.ddTools +// Подключение (MODX)EvolutionCMS.libraries.ddTools require_once( $modx->getConfig('base_path') . 'assets/libs/ddTools/modx.ddtools.class.php' ); -//Запуск (MODX)EvolutionCMS.snippets.ddGetMultipleField +// Запуск (MODX)EvolutionCMS.snippets.ddGetMultipleField \DDTools\Snippet::runSnippet([ 'name' => 'ddGetMultipleField', 'params' => [ @@ -716,8 +717,8 @@ require_once( "Пример изображения 2" ] ]', - 'rowTpl' => '@CODE:[+col1+]' - ] + 'rowTpl' => '@CODE:[+col1+]', + ], ]); ``` @@ -730,6 +731,7 @@ _Примеров здесь можно напридумывать велико * [Home page](https://code.divandesign.ru/modx/ddgetmultiplefield) * [Telegram chat](https://t.me/dd_code) * [Packagist](https://packagist.org/packages/dd/evolutioncms-snippets-ddgetmultiplefield) +* [GitHub](https://github.com/DivanDesign/EvolutionCMS.snippets.ddGetMultipleField) - \ No newline at end of file + \ No newline at end of file diff --git a/composer.json b/composer.json index d80dcc9..57e9ae0 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "dd/evolutioncms-snippets-ddgetmultiplefield", "type": "modxevo-snippet", - "version": "3.9.0", + "version": "3.10.0", "description": "A snippet for processing, manipulations and custom output structured data (JSON or separated by delimiters strings).", "keywords": [ "modx", @@ -20,22 +20,16 @@ "get multiple field", "sort json" ], - "homepage": "https://code.divandesign.biz/modx/ddgetmultiplefield", + "homepage": "https://code.divandesign.ru/modx/ddgetmultiplefield", "support": { "chat": "https://t.me/dd_code" }, "authors": [ - { - "name": "DD Group", - "email": "code@DivanDesign.biz", - "homepage": "https://code.divandesign.biz", - "role": "Owner" - }, { "name": "Ilyas Ronef", "email": "ilyas@DivanDesign.ru", "homepage": "https://ronef.ru", - "role": "Developer" + "role": "Owner" }, { "name": "Alexey Davydov", @@ -56,7 +50,12 @@ ], "require": { "php": ">=5.6.0", - "dd/evolutioncms-libraries-ddtools": ">=0.50.0", + "dd/evolutioncms-libraries-ddtools": ">=0.62.0", "dd/evolutioncms-snippets-ddtypograph": ">=2.5.0" + }, + "autoload": { + "psr-4": { + "ddGetMultipleField\\": "src/" + } } } \ No newline at end of file diff --git a/ddGetMultipleField_snippet.php b/ddGetMultipleField_snippet.php index 9cc0cd5..a62a5f6 100644 --- a/ddGetMultipleField_snippet.php +++ b/ddGetMultipleField_snippet.php @@ -1,23 +1,23 @@ getConfig('base_path') . - 'assets/libs/ddTools/modx.ddtools.class.php' + $modx->getConfig('base_path') + . 'assets/libs/ddTools/modx.ddtools.class.php' ); return \DDTools\Snippet::runSnippet([ 'name' => 'ddGetMultipleField', - 'params' => $params + 'params' => $params, ]); ?> \ No newline at end of file diff --git a/require.php b/require.php index 68aea4c..5ac08ae 100644 --- a/require.php +++ b/require.php @@ -1,12 +1,12 @@ '', 'inputString_docField' => null, 'inputString_docId' => null, @@ -30,7 +30,7 @@ class Snippet extends \DDTools\Snippet { 'placeholders' => [], 'urlencode' => false, 'totalRowsToPlaceholder' => null, - 'resultToPlaceholder' => null + 'resultToPlaceholder' => null, ], $paramsTypes = [ @@ -38,7 +38,7 @@ class Snippet extends \DDTools\Snippet { 'removeEmptyCols' => 'boolean', 'urlencode' => 'boolean', 'startRow' => 'integer', - 'placeholders' => 'objectArray' + 'placeholders' => 'objectArray', ], $renamedParamsCompliance = [ @@ -46,38 +46,38 @@ class Snippet extends \DDTools\Snippet { 'inputString_docField' => 'docField', 'inputString_docId' => 'docId', 'inputString_rowDelimiter' => 'rowDelimiter', - 'inputString_colDelimiter' => 'colDelimiter' + 'inputString_colDelimiter' => 'colDelimiter', ] ; /** * prepareParams - * @version 1.1.2 (2022-08-10) + * @version 1.1.5 (2024-09-06) * * @param $params {stdClass|arrayAssociative|stringJsonObject|stringHjsonObject|stringQueryFormatted} * * @return {void} */ protected function prepareParams($params = []){ - //Call base method + // Call base method parent::prepareParams($params); - //Comma separated string + // Comma separated string foreach ( [ 'sortBy', 'typography', 'colTpl' - ] as - $paramName + ] + as $paramName ){ if ( - //Only strings can be exploded - !is_array($this->params->{$paramName}) && - ( - //Zero indexes for `sortBy` and `typography` must be used - $this->params->{$paramName} === '0' || - !empty($this->params->{$paramName}) + // Only strings can be exploded + !is_array($this->params->{$paramName}) + && ( + // Zero indexes for `sortBy` and `typography` must be used + $this->params->{$paramName} === '0' + || !empty($this->params->{$paramName}) ) ){ $this->params->{$paramName} = explode( @@ -92,8 +92,8 @@ protected function prepareParams($params = []){ } if ( - $this->params->columns !== 'all' && - !is_array($this->params->columns) + $this->params->columns !== 'all' + && !is_array($this->params->columns) ){ $this->params->columns = explode( ',', @@ -101,7 +101,7 @@ protected function prepareParams($params = []){ ); } - //Хитро-мудро для array_intersect_key + // Хитро-мудро для array_intersect_key if (is_array($this->params->columns)){ $this->params->columns = array_combine( $this->params->columns, @@ -115,30 +115,30 @@ protected function prepareParams($params = []){ $this->params->outputFormat = strtolower($this->params->outputFormat); - //Prepare templates + // Prepare templates foreach ( [ 'rowTpl', 'outerTpl' - ] as - $paramName + ] + as $paramName ){ - //Chunk content or inline template - $this->params->{$paramName} = \ddTools::$modx->getTpl($this->params->{$paramName}); + // Chunk content or inline template + $this->params->{$paramName} = \ddTools::getTpl($this->params->{$paramName}); } if (empty($this->params->colTpl)){ - //Without templates by default + // Without templates by default $this->params->colTpl = ['']; }else{ - //Получим содержимое шаблонов + // Получим содержимое шаблонов foreach ( - $this->params->colTpl as - $colTpl_itemNumber => - $colTpl_itemValue + $this->params->colTpl + as $colTpl_itemNumber + => $colTpl_itemValue ){ - //Chunk content or inline template - $this->params->colTpl[$colTpl_itemNumber] = \ddTools::$modx->getTpl($this->params->colTpl[$colTpl_itemNumber]); + // Chunk content or inline template + $this->params->colTpl[$colTpl_itemNumber] = \ddTools::getTpl($this->params->colTpl[$colTpl_itemNumber]); } $this->params->colTpl = str_replace( @@ -148,10 +148,10 @@ protected function prepareParams($params = []){ ); } - //Unfold for arrays support (e. g. `{"somePlaceholder1": "test", "somePlaceholder2": {"a": "one", "b": "two"} }` => `[+somePlaceholder1+]`, `[+somePlaceholder2.a+]`, `[+somePlaceholder2.b+]`; `{"somePlaceholder1": "test", "somePlaceholder2": ["one", "two"] }` => `[+somePlaceholder1+]`, `[+somePlaceholder2.0+]`, `[somePlaceholder2.1]`) + // Unfold for arrays support (e. g. `{"somePlaceholder1": "test", "somePlaceholder2": {"a": "one", "b": "two"} }` => `[+somePlaceholder1+]`, `[+somePlaceholder2.a+]`, `[+somePlaceholder2.b+]`; `{"somePlaceholder1": "test", "somePlaceholder2": ["one", "two"] }` => `[+somePlaceholder1+]`, `[+somePlaceholder2.0+]`, `[somePlaceholder2.1]`) $this->params->placeholders = \ddTools::unfoldArray($this->params->placeholders); - //Если задано имя поля, которое необходимо получить + // Если задано имя поля, которое необходимо получить if (!empty($this->params->inputString_docField)){ $this->params->inputString = \ddTools::getTemplateVarOutput( [$this->params->inputString_docField], @@ -161,75 +161,76 @@ protected function prepareParams($params = []){ $this->params->inputString = $this->params->inputString[$this->params->inputString_docField]; } - //Если заданы условия фильтрации + // Если заданы условия фильтрации if (!empty($this->params->filter)){ - //Backward compatibility + // Backward compatibility $this->params->filter = str_replace( [ '::', - '<>' + '<>', ], [ '==', - '!=' + '!=', ], $this->params->filter ); - //Разбиваем по условию «или» + // Разбиваем по условию «или» $filterSource = explode( '||', $this->params->filter ); - //Clear + // Clear $this->params->filter = []; - //Перебираем по условию «или» + // Перебираем по условию «или» foreach ( - $filterSource as - $orIndex => - $orCondition + $filterSource + as $orIndex + => $orCondition ){ $this->params->filter[$orIndex] = []; - //Перебираем по условию «и» + // Перебираем по условию «и» foreach ( - //Разбиваем по условию «и» + // Разбиваем по условию «и» explode( '&&', $orCondition - ) as - $andIndex => - $andCondition + ) + as $andIndex + => $andCondition ){ - //Добавляем вид сравнения для колонки + // Добавляем вид сравнения для колонки $this->params->filter[$orIndex][$andIndex] = [ 'isEqual' => strpos( $andCondition, '==' - ) !== false + ) + !== false , 'columnKey' => '', - 'columnValue' => '' + 'columnValue' => '', ]; - //Разбиваем по колонке/значению + // Разбиваем по колонке/значению $andCondition = explode( ( - $this->params->filter[$orIndex][$andIndex]['isEqual'] ? - '==' : - '!=' + $this->params->filter[$orIndex][$andIndex]['isEqual'] + ? '==' + : '!=' ), $andCondition ); - //Добавляем правило для соответствующей колонки + // Добавляем правило для соответствующей колонки $this->params->filter[$orIndex][$andIndex]['columnKey'] = trim($andCondition[0]); $this->params->filter[$orIndex][$andIndex]['columnValue'] = trim( $andCondition[1], - //Trim whitespaces and quotes + // Trim whitespaces and quotes " \t\n\r\0\x0B\"'" ); } @@ -239,17 +240,17 @@ protected function prepareParams($params = []){ /** * run - * @version 1.7.1 (2023-01-11) + * @version 1.9.1 (2024-09-06) * * @return {string} */ public function run(){ - //The snippet must return an empty string even if result is absent + // The snippet must return an empty string even if result is absent $result = ''; - //Если задано значение поля + // Если задано значение поля if (strlen($this->params->inputString) > 0){ - //Являются ли разделители регулярками + // Являются ли разделители регулярками $inputString_rowDelimiterIsRegexp = ( filter_var( @@ -257,13 +258,14 @@ public function run(){ FILTER_VALIDATE_REGEXP, [ 'options' => [ - 'regexp' => '/^\/.*\/[a-z]*$/' - ] + 'regexp' => '/^\/.*\/[a-z]*$/', + ], ] - ) !== false - ) ? - true : - false + ) + !== false + ) + ? true + : false ; $inputString_colDelimiterIsRegexp = @@ -273,16 +275,17 @@ public function run(){ FILTER_VALIDATE_REGEXP, [ 'options' => [ - 'regexp' => '/^\/.*\/[a-z]*$/' - ] + 'regexp' => '/^\/.*\/[a-z]*$/', + ], ] - ) !== false - ) ? - true : - false + ) + !== false + ) + ? true + : false ; - //JSON (first letter is “{” or “[”) + // JSON (first letter is “{” or “[”) if ( in_array( substr( @@ -292,137 +295,139 @@ public function run(){ ), [ '{', - '[' + '[', ] ) ){ $data = \DDTools\ObjectTools::convertType([ 'object' => $this->params->inputString, - 'type' => 'objectArray' + 'type' => 'objectArray', ]); } - //Not JSON + // Not JSON if (empty($data)){ - //Разбиваем на строки + // Разбиваем на строки $data = - $inputString_rowDelimiterIsRegexp ? - preg_split( + $inputString_rowDelimiterIsRegexp + ? preg_split( $this->params->inputString_rowDelimiter, $this->params->inputString - ) : - explode( + ) + : explode( $this->params->inputString_rowDelimiter, $this->params->inputString ) ; } - //Convert data to array for code simplification + // Convert data to array for code simplification $data = (array) $data; - //Общее количество строк + // Общее количество строк $total = count($data); - //Перебираем строки, разбиваем на колонки + // Перебираем строки, разбиваем на колонки foreach ( - $data as - $rowKey => - $rowValue + $data + as $rowKey + => $rowValue ){ if (!is_array($rowValue)){ $data[$rowKey] = - $inputString_colDelimiterIsRegexp ? - preg_split( + $inputString_colDelimiterIsRegexp + ? preg_split( $this->params->inputString_colDelimiter, $rowValue - ) : - explode( + ) + : explode( $this->params->inputString_colDelimiter, $rowValue ) ; } - //Если необходимо получить какие-то конкретные значения + // Если необходимо получить какие-то конкретные значения if (!empty($this->params->filter)){ - //Перебираем условия `or` + // Перебираем условия `or` foreach ( - $this->params->filter as - $orIndex => - $orCondition + $this->params->filter + as $orIndex + => $orCondition ){ - //Считаем, что вариант проходит, если не доказано обратное + // Считаем, что вариант проходит, если не доказано обратное $isFound = true; - //Перебираем условия `and` + // Перебираем условия `and` foreach ( - $orCondition as - $andIndex => - $andCondition + $orCondition + as $andIndex + => $andCondition ){ - //В зависимости от того, должно или нет значение в колонке быть равно фильтру, присваиваем флагу результат + // В зависимости от того, должно или нет значение в колонке быть равно фильтру, присваиваем флагу результат if ($andCondition['isEqual']){ - //Если должно быть равно + // Если должно быть равно $isFound = $data[$rowKey][$andCondition['columnKey']] == $andCondition['columnValue']; }else{ - //Если не должно быть равно + // Если не должно быть равно $isFound = $data[$rowKey][$andCondition['columnKey']] != $andCondition['columnValue']; } - //Если условие сменилось на ложь, значит переходим к следующему условию `or` + // Если условие сменилось на ложь, значит переходим к следующему условию `or` if (!$isFound){ break; } } - //Если все условия `and` прошли проверку, выходим из цикла `or` + // Если все условия `and` прошли проверку, выходим из цикла `or` if ($isFound){ break; } } - //Если на выходе из цикла мы видим, что ни одно из условий не выполнено, сносим строку нафиг + // Если на выходе из цикла мы видим, что ни одно из условий не выполнено, сносим строку нафиг if (!$isFound){ unset($data[$rowKey]); } } - //Если нужно получить какую-то конкретную колонку + // Если нужно получить какую-то конкретную колонку if ( - $this->params->columns != 'all' && - //Также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее - isset($data[$rowKey]) + $this->params->columns != 'all' + // Также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее + && isset($data[$rowKey]) ){ - //Выбираем только необходимые колонки + Сбрасываем ключи массива + // Выбираем только необходимые колонки + Сбрасываем ключи массива $data[$rowKey] = array_values(array_intersect_key( $data[$rowKey], $this->params->columns )); } - //Если нужно удалять пустые строки + // Если нужно удалять пустые строки if ( - $this->params->removeEmptyRows && - //Также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее - isset($data[$rowKey]) && - //Если строка пустая - strlen(implode( - '', - $data[$rowKey] - )) == 0 + $this->params->removeEmptyRows + // Также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее + && isset($data[$rowKey]) + // Если строка пустая + && strlen( + implode( + '', + $data[$rowKey] + ) + ) == 0 ){ unset($data[$rowKey]); } } - //Если что-то есть (могло ничего не остаться после удаления пустых и/или получения по значениям) + // Если что-то есть (могло ничего не остаться после удаления пустых и/или получения по значениям) if (count($data) > 0){ - //Если надо сортировать + // Если надо сортировать if (!empty($this->params->sortDir)){ - //Если надо в случайном порядке - шафлим + // Если надо в случайном порядке - шафлим if ($this->params->sortDir == 'RAND'){ - //Shuffle array preserve keys + // Shuffle array preserve keys uksort( $data, function(){ @@ -432,35 +437,35 @@ function(){ ); } ); - //Если надо просто в обратном порядке + // Если надо просто в обратном порядке }elseif ($this->params->sortDir == 'REVERSE'){ $data = array_reverse($data); }else{ - //Сортируем результаты + // Сортируем результаты $data = \ddTools::sort2dArray( $data, $this->params->sortBy, ( - $this->params->sortDir == 'ASC' ? - 1 : - -1 + $this->params->sortDir == 'ASC' + ? 1 + : -1 ) ); } } - //Обрабатываем слишком большой индекс + // Обрабатываем слишком большой индекс if ($this->params->startRow > count($data) - 1){ $this->params->startRow = count($data) - 1; } - //Если нужны все элементы + // Если нужны все элементы if ($this->params->totalRows == 'all'){ $data = array_slice( $data, $this->params->startRow, null, - //preserve keys + // preserve keys true ); }else{ @@ -468,15 +473,15 @@ function(){ $data, $this->params->startRow, $this->params->totalRows, - //preserve keys + // preserve keys true ); } - //Общее количество возвращаемых строк + // Общее количество возвращаемых строк $resultTotal = count($data); - //Плэйсхолдер с общим количеством + // Плэйсхолдер с общим количеством if (!empty($this->params->totalRowsToPlaceholder)){ \ddTools::$modx->setPlaceholder( $this->params->totalRowsToPlaceholder, @@ -484,33 +489,33 @@ function(){ ); } - //Если нужно типографировать + // Если нужно типографировать if (!empty($this->params->typography)){ - //Придётся ещё раз перебрать результат + // Придётся ещё раз перебрать результат foreach ( - $data as - $rowKey => - $rowValue + $data + as $rowKey + => $rowValue ){ - //Перебираем колонки, заданные для типографирования + // Перебираем колонки, заданные для типографирования foreach ( - $this->params->typography as - $columnKey + $this->params->typography + as $columnKey ){ - //Если такая колонка существует, типографируем + // Если такая колонка существует, типографируем if (isset($data[$rowKey][$columnKey])){ $data[$rowKey][$columnKey] = \DDTools\Snippet::runSnippet([ 'name' => 'ddTypograph', 'params' => [ - 'text' => $data[$rowKey][$columnKey] - ] + 'text' => $data[$rowKey][$columnKey], + ], ]); } } } } - //Если вывод в массив + // Если вывод в массив if ($this->params->outputFormat == 'array'){ $result = $data; }else{ @@ -519,73 +524,67 @@ function(){ $placeholdersGeneral = \DDTools\ObjectTools::extend([ 'objects' => [ [ - //Количество элементов + // Количество элементов 'total' => $total, - 'resultTotal' => $resultTotal + 'resultTotal' => $resultTotal, ], - //User's placeholders can overwrite original data if needed, so they must be placed at the end - $this->params->placeholders - ] + // User's placeholders can overwrite original data if needed, so they must be placed at the end + $this->params->placeholders, + ], ]); - //Если вывод просто в формате html + // Если вывод просто в формате html if ( - $this->params->outputFormat == 'html' || - $this->params->outputFormat == 'htmlarray' + $this->params->outputFormat == 'html' + || $this->params->outputFormat == 'htmlarray' ){ $rowIndex = 0; - //Перебираем строки + // Перебираем строки foreach ( - $data as - $rowKey => - $rowValue + $data + as $rowKey + => $rowValue ){ $rowPlaceholders = \DDTools\ObjectTools::extend([ 'objects' => [ - //Row placeholders + // Row placeholders [ - //Запишем номер строки + // Запишем номер строки 'rowNumber.zeroBased' => $rowIndex, 'rowNumber' => $rowIndex + 1, - 'rowKey' => $rowKey + 'rowKey' => $rowKey, ], - //User's placeholders can overwrite original data if needed, so they must be placed at the end - $placeholdersGeneral - ] + // User's placeholders can overwrite original data if needed, so they must be placed at the end + $placeholdersGeneral, + ], ]); $rowData = (object) [ - 'allColumnValues' => [] + 'allColumnValues' => [], + 'allColumnValuesObjectJson' => new \stdClass(), ]; $columnIndex = 0; - //Перебираем колонки + // Перебираем колонки foreach ( - $rowValue as - $columnKey => - $columnValue + $rowValue + as $columnKey + => $columnValue ){ - //If the column is used + // If the column is used if ( - !empty($columnValue) || - !$this->params->removeEmptyCols + !empty($columnValue) + || !$this->params->removeEmptyCols ){ - if (is_array($columnValue)){ - $columnValue = \DDTools\ObjectTools::convertType([ - 'object' => $columnValue, - 'type' => 'stringJsonAuto' - ]); - } - - //If template for this column is not set + // If template for this column is not set if (!isset($this->params->colTpl[$columnIndex])){ - //Use previous + // Use previous $this->params->colTpl[$columnIndex] = $this->params->colTpl[$columnIndex - 1]; } - //If template for the column is needed + // If template for the column is needed if (!empty($this->params->colTpl[$columnIndex])){ $columnValue = \ddTools::parseText([ 'text' => $this->params->colTpl[$columnIndex], @@ -594,24 +593,33 @@ function(){ [ 'val' => $columnValue, 'columnIndex' => $columnIndex, - 'columnKey' => $columnKey + 'columnKey' => $columnKey, ], - //User's placeholders can overwrite original data if needed, so they must be placed at the end - $rowPlaceholders - ] + // User's placeholders can overwrite original data if needed, so they must be placed at the end + $rowPlaceholders, + ], ]), - 'mergeAll' => false + 'isCompletelyParsingEnabled' => false, ]); } - //Save for implode later by $this->params->colGlue - $rowData->allColumnValues[] = $columnValue; + // Save for implode later by $this->params->colGlue + $rowData->allColumnValues[] = + ! is_array($columnValue) + ? $columnValue + : \DDTools\ObjectTools::convertType([ + 'object' => $columnValue, + 'type' => 'stringJsonAuto', + ]) + ; } - //Save column value by index + // Save column value by index $rowData->{'col' . $columnIndex} = $columnValue; - //And by original column key + // And by original column key $rowData->{$columnKey} = $columnValue; + // Row JSON + $rowData->allColumnValuesObjectJson->{$columnKey} = $columnValue; $columnIndex++; } @@ -627,10 +635,10 @@ function(){ 'data' => \DDTools\ObjectTools::extend([ 'objects' => [ $rowData, - //User's placeholders can overwrite original data if needed, so they must be placed at the end - $rowPlaceholders - ] - ]) + // User's placeholders can overwrite original data if needed, so they must be placed at the end + $rowPlaceholders, + ], + ]), ]); }else{ $resTemp[$rowKey] = $rowData->allColumnValues; @@ -647,14 +655,14 @@ function(){ }else{ $result = $resTemp; } - //Если вывод в формате JSON + // Если вывод в формате JSON }elseif ($this->params->outputFormat == 'json'){ $resTemp = $data; - //Если нужно выводить только одну колонку + // Если нужно выводить только одну колонку if ( - $this->params->columns != 'all' && - count($this->params->columns) == 1 + $this->params->columns != 'all' + && count($this->params->columns) == 1 ){ $resTemp = array_map( 'implode', @@ -662,40 +670,40 @@ function(){ ); } - //Если нужно получить какой-то конкретный элемент, а не все + // Если нужно получить какой-то конкретный элемент, а не все if ($this->params->totalRows == '1'){ $result = json_encode($resTemp[$this->params->startRow]); }else{ $result = json_encode($resTemp); } - //Это чтобы MODX не воспринимал как вызов сниппета + // Это чтобы MODX не воспринимал как вызов сниппета $result = strtr( $result, [ '[[' => '[ [', - ']]' => '] ]' + ']]' => '] ]', ] ); } - //Если оборачивающий шаблон задан (и вывод не в массив), парсим его + // Если оборачивающий шаблон задан (и вывод не в массив), парсим его if (!empty($this->params->outerTpl)){ $resTemp = []; - //Элемент массива 'result' должен находиться самым первым, иначе дополнительные переданные плэйсхолдеры в тексте не найдутся! + // Элемент массива 'result' должен находиться самым первым, иначе дополнительные переданные плэйсхолдеры в тексте не найдутся! $resTemp['result'] = $result; - //Преобразуем результат в одномерный массив + // Преобразуем результат в одномерный массив $data = \ddTools::unfoldArray($data); $rowIndex = 0; - //Добавляем 'row' и 'val' к ключам + // Добавляем 'row' и 'val' к ключам foreach ( - $data as - $rowKey => - $rowValue + $data + as $rowKey + => $rowValue ){ $rowKeyNew = preg_replace( '/(.+?)\.(.+?)/', @@ -720,18 +728,18 @@ function(){ $resTemp = \DDTools\ObjectTools::extend([ 'objects' => [ $resTemp, - //User's placeholders can overwrite original data if needed, so they must be placed at the end - $placeholdersGeneral - ] + // User's placeholders can overwrite original data if needed, so they must be placed at the end + $placeholdersGeneral, + ], ]); $result = \ddTools::parseText([ 'text' => $this->params->outerTpl, - 'data' => $resTemp + 'data' => $resTemp, ]); } - //Если нужно URL-кодировать строку + // Если нужно URL-кодировать строку if ($this->params->urlencode){ $result = rawurlencode($result); } @@ -739,7 +747,7 @@ function(){ } } - //Если надо, выводим в плэйсхолдер + // Если надо, выводим в плэйсхолдер if (!empty($this->params->resultToPlaceholder)){ \ddTools::$modx->setPlaceholder( $this->params->resultToPlaceholder,