From ed1b70b7e459c6d47489be3a8d830f70db1983e9 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Mon, 6 Jun 2016 16:45:20 +0500 Subject: [PATCH 01/11] =?UTF-8?q?+=20Arrays=20support=20for=20=E2=80=9Cpla?= =?UTF-8?q?ceholders=E2=80=9D=20were=20added.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddGetMultipleField.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index 391725b..925bafd 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -30,7 +30,7 @@ * @param $rowTpl {string: chunkName|string} - The template for row rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. Available placeholders: [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0), [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+col0+],[+col1+],… (column values). Default: ''. * @param $colTpl {comma separated string: chunkName|string; 'null'} - The comma-separated list of templates for column rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. 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. 'null' specifies rendering without a template. Available placeholders: [+val+], [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0). Default: ''. * @param $outerTpl {string: chunkName|string} - Wrapper template (“outputFormat” has to be != 'array'). Use inline templates starting with “@CODE:”. Available placeholders: [+result+], [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+rowY.colX+] (“Y” — row number, “X” — column number). Default: ''. - * @param $placeholders {query string} - Additional data as query string (https://en.wikipedia.org/wiki/Query_string) has to be passed into “outerTpl”, “rowTpl” and “colTpl”. E. g. “pladeholder1=value1&pagetitle=My awesome pagetitle!”. Default: ''. + * @param $placeholders {query string} - Additional data as query string (https://en.wikipedia.org/wiki/Query_string) has to be passed into “outerTpl”, “rowTpl” and “colTpl”. E. g. “pladeholder1=value1&pagetitle=My awesome pagetitle!”. Arrays are supported too: “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”. Default: ''. * @param $urlencode {0; 1} - Is it required to URL encode the result? “outputFormat” has to be != 'array'. URL encoding is used according to RFC 3986. Default: 0. * @param $totalRowsToPlaceholder {string} - The name of the global MODX placeholder that holds the total number of rows. The placeholder won't be set if “totalRowsToPlaceholder” is empty. Default: ''. * @param $resultToPlaceholder {string} - The name of the global MODX placeholder that holds the snippet result. The result will be returned in a regular manner if the parameter is empty. Default: ''. @@ -224,6 +224,8 @@ if (strpos($placeholders, '=') !== false){ //Parse a query string parse_str($placeholders, $placeholders); + //Unfold for arrays support (e. g. “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”) + $placeholders = ddTools::unfoldArray($placeholders); }else{ //The old format $placeholders = ddTools::explodeAssoc($placeholders); From 0dd27c382f08e27f78cb48e7ad9422591f45c127 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Thu, 8 Dec 2016 18:56:09 +0500 Subject: [PATCH 02/11] * Minor changes. --- ddGetMultipleField.php | 115 +++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 40 deletions(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index 925bafd..e04dd10 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -1,44 +1,43 @@ = 1.0.13. - * @uses The library modx.ddTools 0.15.3. - * @uses The snippet ddTypograph 1.4.3 (if typography is required). + * @uses MODXEvo.library.ddTools >= 0.15.3. + * @uses MODXEvo.snippet.ddTypograph >= 1.4.3 (if typography is required). * - * @param $inputString {separated string} - The input string containing separated values. @required - * @param $inputString_docField {string} - 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. Default: —. - * @param $inputString_docId {integer} - ID of the document which field/TV value is required to get. “inputString_docId” equals the current document id since “inputString_docId” is unset. Default: —. - * @param $rowDelimiter {string; regexp} - The input string row delimiter. Default: '||'. - * @param $colDelimiter {string; regexp} - The input string column delimiter. Default: '::'. - * @param $startRow {integer} - The index of the initial row (indexes start at 0). Default: 0. - * @param $totalRows {integer; 'all'} - The maximum number of rows to return. All rows will be returned if “totalRows” == 'all'. Default: 'all'. - * @param $columns {comma separated string; 'all'} - The indexes of columns to return (indexes start at 0). All columns will be returned if “columns” == 'all'. Default: 'all'. - * @param $filter {separated string} - Filter clause for columns. Thus, '0::a||0::b||1::1' makes the columns with either 'a' or 'b' in the 0 column and with 1 in the 1 column to be returned. Default: ''. - * @param $removeEmptyRows {0; 1} - Is it required to remove empty rows? Default: 1. - * @param $removeEmptyCols {0; 1} - Is it required to remove empty columns? Default: 1. - * @param $sortBy {comma separated string} - 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'. Default: '0'. - * @param $sortDir {'ASC'; 'DESC'; 'RAND'; 'REVERSE'; ''} - Rows sorting direction. The rows will be returned in reversed order if “sortDir” == 'REVERSE'. Default: ''. - * @param $typography {comma separated string} - The comma separated indexes of the columns which values have to be corrected (indexes start at 0). If unset, there will be no correction. Default: —. - * @param $outputFormat {'html'; 'JSON'; 'array'; 'htmlarray'} - Result output format. Default: 'html'. - * @param $rowGlue {string} - The string that combines rows while rendering. It can be used along with “rowTpl”. Default: ''. - * @param $colGlue {string} - The string that combines columns while rendering. It can be used along with “colTpl”, but not with “rowTpl” for obvious reasons. Default: ''. - * @param $rowTpl {string: chunkName|string} - The template for row rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. Available placeholders: [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0), [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+col0+],[+col1+],… (column values). Default: ''. - * @param $colTpl {comma separated string: chunkName|string; 'null'} - The comma-separated list of templates for column rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. 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. 'null' specifies rendering without a template. Available placeholders: [+val+], [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0). Default: ''. - * @param $outerTpl {string: chunkName|string} - Wrapper template (“outputFormat” has to be != 'array'). Use inline templates starting with “@CODE:”. Available placeholders: [+result+], [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+rowY.colX+] (“Y” — row number, “X” — column number). Default: ''. - * @param $placeholders {query string} - Additional data as query string (https://en.wikipedia.org/wiki/Query_string) has to be passed into “outerTpl”, “rowTpl” and “colTpl”. E. g. “pladeholder1=value1&pagetitle=My awesome pagetitle!”. Arrays are supported too: “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”. Default: ''. - * @param $urlencode {0; 1} - Is it required to URL encode the result? “outputFormat” has to be != 'array'. URL encoding is used according to RFC 3986. Default: 0. - * @param $totalRowsToPlaceholder {string} - The name of the global MODX placeholder that holds the total number of rows. The placeholder won't be set if “totalRowsToPlaceholder” is empty. Default: ''. - * @param $resultToPlaceholder {string} - The name of the global MODX placeholder that holds the snippet result. The result will be returned in a regular manner if the parameter is empty. Default: ''. + * @param $inputString {string_separated} — The input string containing separated values. @required + * @param $inputString_docField {string} — 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. Default: —. + * @param $inputString_docId {integer} — ID of the document which field/TV value is required to get. “inputString_docId” equals the current document id since “inputString_docId” is unset. Default: —. + * @param $rowDelimiter {string|regexp} — The input string row delimiter. Default: '||'. + * @param $colDelimiter {string|regexp} — The input string column delimiter. Default: '::'. + * @param $startRow {integer} — The index of the initial row (indexes start at 0). Default: 0. + * @param $totalRows {integer|'all'} — The maximum number of rows to return. All rows will be returned if “totalRows” == 'all'. Default: 'all'. + * @param $columns {string_commaSeparated|'all'} — The indexes of columns to return (indexes start at 0). All columns will be returned if “columns” == 'all'. Default: 'all'. + * @param $filter {string_separated} — Filter clause for columns. Thus, '0::a||0::b||1::1' makes the columns with either 'a' or 'b' in the 0 column and with 1 in the 1 column to be returned. Default: ''. + * @param $removeEmptyRows {0|1} — Is it required to remove empty rows? Default: 1. + * @param $removeEmptyCols {0|1} — Is it required to remove empty columns? Default: 1. + * @param $sortBy {string_commaSeparated} — 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'. Default: '0'. + * @param $sortDir {'ASC'|'DESC'|'RAND'|'REVERSE'|''} — Rows sorting direction. The rows will be returned in reversed order if “sortDir” == 'REVERSE'. Default: ''. + * @param $typography {string_commaSeparated} — The comma separated indexes of the columns which values have to be corrected (indexes start at 0). If unset, there will be no correction. Default: —. + * @param $outputFormat {'html'|'JSON'|'array'|'htmlarray'} — Result output format. Default: 'html'. + * @param $rowGlue {string} — The string that combines rows while rendering. It can be used along with “rowTpl”. Default: ''. + * @param $colGlue {string} — The string that combines columns while rendering. It can be used along with “colTpl”, but not with “rowTpl” for obvious reasons. Default: ''. + * @param $rowTpl {string_chunkName|string} — The template for row rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. Available placeholders: [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0), [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+col0+],[+col1+],… (column values). Default: ''. + * @param $colTpl {string_commaSeparated_chunkName|string|'null'} — The comma-separated list of templates for column rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. 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. 'null' specifies rendering without a template. Available placeholders: [+val+], [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0). Default: ''. + * @param $outerTpl {string_chunkName|string} — Wrapper template (“outputFormat” has to be != 'array'). Use inline templates starting with “@CODE:”. Available placeholders: [+result+], [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+rowY.colX+] (“Y” — row number, “X” — column number). Default: ''. + * @param $placeholders {string_queryFormated} — Additional data as query string (https://en.wikipedia.org/wiki/Query_string) has to be passed into “outerTpl”, “rowTpl” and “colTpl”. E. g. “pladeholder1=value1&pagetitle=My awesome pagetitle!”. Arrays are supported too: “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”. Default: ''. + * @param $urlencode {0|1} — Is it required to URL encode the result? “outputFormat” has to be != 'array'. URL encoding is used according to RFC 3986. Default: 0. + * @param $totalRowsToPlaceholder {string} — The name of the global MODX placeholder that holds the total number of rows. The placeholder won't be set if “totalRowsToPlaceholder” is empty. Default: ''. + * @param $resultToPlaceholder {string} — The name of the global MODX placeholder that holds the snippet result. The result will be returned in a regular manner if the parameter is empty. Default: ''. * * @link http://code.divandesign.biz/modx/ddgetmultiplefield/3.3 * * @copyright 2009–2016 DivanDesign {@link http://www.DivanDesign.biz } - * http://www.DivanDesign.biz */ $ddToolsPath = $modx->getConfig('base_path').'assets/libs/ddTools/modx.ddtools.class.php'; @@ -137,14 +136,22 @@ } } - //Если нужно получить какую-то конкретную колонку (также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее) - if ($columns != 'all' && isset($data[$rowNumber])){ + //Если нужно получить какую-то конкретную колонку + if ( + $columns != 'all' && + //Также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее + isset($data[$rowNumber]) + ){ //Выбираем только необходимые колонки + Сбрасываем ключи массива $data[$rowNumber] = array_values(array_intersect_key($data[$rowNumber], $columns)); } - //Если нужно удалять пустые строки (также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее) - if ($removeEmptyRows && isset($data[$rowNumber])){ + //Если нужно удалять пустые строки + if ( + $removeEmptyRows && + //Также проверяем на то, что строка вообще существует, т.к. она могла быть уже удалена ранее + isset($data[$rowNumber]) + ){ //Если строка пустая, удаляем if (strlen(implode('', $data[$rowNumber])) == 0){unset($data[$rowNumber]);} } @@ -173,13 +180,23 @@ } } - if (!isset($startRow) || !is_numeric($startRow)){$startRow = '0';} + if ( + !isset($startRow) || + !is_numeric($startRow) + ){ + $startRow = '0'; + } //Обрабатываем слишком большой индекс if (!isset($data[$startRow])){$startRow = count($data) - 1;} //Если общее количество элементов не задано или задано плохо, читаем, что нужны все - if (!isset($totalRows) || !is_numeric($totalRows)){$totalRows = 'all';} + if ( + !isset($totalRows) || + !is_numeric($totalRows) + ){ + $totalRows = 'all'; + } //Если нужны все элементы if ($totalRows == 'all'){ @@ -219,7 +236,10 @@ $resTemp = array(); //Дополнительные данные - if (isset($placeholders) && trim($placeholders) != ''){ + if ( + isset($placeholders) && + trim($placeholders) != '' + ){ //If “=” exists if (strpos($placeholders, '=') !== false){ //Parse a query string @@ -236,7 +256,10 @@ } //Если вывод просто в формате html - if ($outputFormat == 'html' || $outputFormat == 'htmlarray'){ + if ( + $outputFormat == 'html' || + $outputFormat == 'htmlarray' + ){ //Шаблоны колонок $colTpl = isset($colTpl) ? explode(',', $colTpl) : false; @@ -275,11 +298,17 @@ //Перебираем колонки foreach ($row as $columnNumber => $column){ //Если нужно удалять пустые значения - if ($removeEmptyCols && !strlen($column)){ + if ( + $removeEmptyCols && + !strlen($column) + ){ $resTemp[$rowNumber]['col'.$columnNumber] = ''; }else{ //Если есть шаблоны значений колонок - if ($colTpl !== false && strlen($colTpl[$columnNumber]) > 0){ + if ( + $colTpl !== false && + strlen($colTpl[$columnNumber]) > 0 + ){ $resTemp[$rowNumber]['col'.$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge(array( 'val' => $column, 'rowNumber.zeroBased' => $resTemp[$rowNumber]['rowNumber.zeroBased'], @@ -298,7 +327,10 @@ //Если есть шаблоны значений колонок if ($colTpl !== false){ foreach ($row as $columnNumber => $column){ - if ($removeEmptyCols && !strlen($column)){ + if ( + $removeEmptyCols && + !strlen($column) + ){ unset($row[$columnNumber]); }else if (strlen($colTpl[$columnNumber]) > 0){ $row[$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge(array( @@ -323,7 +355,10 @@ $resTemp = $data; //Если нужно выводить только одну колонку - if ($columns != 'all' && count($columns) == 1){ + if ( + $columns != 'all' && + count($columns) == 1 + ){ $resTemp = array_map('implode', $resTemp); } From ff47b428f99ec3539a62339ccc1f74fa900def17 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Thu, 8 Dec 2016 19:16:25 +0500 Subject: [PATCH 03/11] * Short array syntax is used because it's more convenient. * Attention! PHP >= 5.4 is required. --- ddGetMultipleField.php | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index e04dd10..b6798cc 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -6,6 +6,7 @@ * @desc A snippet for separated by delimiters data output. * @note The fields formed by the mm_ddMultipleFields widget values ooutput gets more convinient with the snippet. * + * @uses PHP >= 5.4. * @uses MODX >= 1.0.13. * @uses MODXEvo.library.ddTools >= 0.15.3. * @uses MODXEvo.snippet.ddTypograph >= 1.4.3 (if typography is required). @@ -51,15 +52,15 @@ require_once $ddToolsPath; //Для обратной совместимости -extract(ddTools::verifyRenamedParams($params, array( +extract(ddTools::verifyRenamedParams($params, [ 'inputString' => 'string', 'inputString_docField' => 'docField', 'inputString_docId' => 'docId' -))); +])); //Если задано имя поля, которое необходимо получить if (isset($inputString_docField)){ - $inputString = ddTools::getTemplateVarOutput(array($inputString_docField), $inputString_docId); + $inputString = ddTools::getTemplateVarOutput([$inputString_docField], $inputString_docId); $inputString = $inputString[$inputString_docField]; } @@ -71,15 +72,15 @@ if (!isset($colDelimiter)){$colDelimiter = '::';} //Являются ли разделители регулярками - $rowDelimiterIsRegexp = (filter_var($rowDelimiter, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^\/.*\/[a-z]*$/'))) !== false) ? true : false; - $colDelimiterIsRegexp = (filter_var($colDelimiter, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^\/.*\/[a-z]*$/'))) !== false) ? true : false; + $rowDelimiterIsRegexp = (filter_var($rowDelimiter, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']]) !== false) ? true : false; + $colDelimiterIsRegexp = (filter_var($colDelimiter, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']]) !== false) ? true : false; //Если заданы условия фильтрации if (isset($filter)){ //Разбиваем по условиям $temp = explode('||', $filter); - $filter = array(); + $filter = []; foreach ($temp as $value){ //Разбиваем по колонке/значению @@ -93,7 +94,7 @@ //Если ни одно правило для этой колонки ещй не задано if (!isset($filter[$value[0]])){ - $filter[$value[0]] = array(); + $filter[$value[0]] = []; } //Добавляем правило для соответствующей колонки @@ -223,7 +224,7 @@ foreach ($typography as $v){ //Если такая колонка существует, типографируем if (isset($data[$rowNumber][$v])){ - $data[$rowNumber][$v] = $modx->runSnippet('ddTypograph', array('text' => $data[$rowNumber][$v])); + $data[$rowNumber][$v] = $modx->runSnippet('ddTypograph', ['text' => $data[$rowNumber][$v]]); } } } @@ -233,7 +234,7 @@ if ($outputFormat == 'array'){ $result = $data; }else{ - $resTemp = array(); + $resTemp = []; //Дополнительные данные if ( @@ -252,7 +253,7 @@ $modx->logEvent(1, 2, '

String separated by “::” && “||” in the “placeholders” parameter is deprecated. Use a query string.

The snippet has been called in the document with id '.$modx->documentIdentifier.'.

', $modx->currentSnippet); } }else{ - $placeholders = array(); + $placeholders = []; } //Если вывод просто в формате html @@ -286,14 +287,14 @@ //Перебираем строки foreach ($data as $rowNumber => $row){ - $resTemp[$rowNumber] = array( + $resTemp[$rowNumber] = [ //Запишем номер строки 'rowNumber.zeroBased' => $rowNumber, 'rowNumber' => $rowNumber + 1, //И общее количество элементов 'total' => $total, 'resultTotal' => $resultTotal - ); + ]; //Перебираем колонки foreach ($row as $columnNumber => $column){ @@ -309,11 +310,11 @@ $colTpl !== false && strlen($colTpl[$columnNumber]) > 0 ){ - $resTemp[$rowNumber]['col'.$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge(array( + $resTemp[$rowNumber]['col'.$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge([ 'val' => $column, 'rowNumber.zeroBased' => $resTemp[$rowNumber]['rowNumber.zeroBased'], 'rowNumber' => $resTemp[$rowNumber]['rowNumber'] - ), $placeholders)); + ], $placeholders)); }else{ $resTemp[$rowNumber]['col'.$columnNumber] = $column; } @@ -333,11 +334,11 @@ ){ unset($row[$columnNumber]); }else if (strlen($colTpl[$columnNumber]) > 0){ - $row[$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge(array( + $row[$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge([ 'val' => $column, 'rowNumber.zeroBased' => $rowNumber, 'rowNumber' => $rowNumber + 1 - ), $placeholders)); + ], $placeholders)); } } } @@ -370,7 +371,7 @@ } //Это чтобы модекс не воспринимал как вызов сниппета - $result = strtr($result, array('[[' => '[ [', ']]' => '] ]')); + $result = strtr($result, ['[[' => '[ [', ']]' => '] ]']); } //Если оборачивающий шаблон задан (и вывод не в массив), парсим его @@ -378,7 +379,7 @@ //Chunk content or inline template $outerTpl = (substr($outerTpl, 0, 6) == '@CODE:') ? substr($outerTpl, 6) : $modx->getChunk($outerTpl); - $resTemp = array(); + $resTemp = []; //Элемент массива 'result' должен находиться самым первым, иначе дополнительные переданные плэйсхолдеры в тексте не найдутся! $resTemp['result'] = $result; From e33fa3bb04b60f7cf6f71e4a429ad40ca0e8a183 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 15 Apr 2017 18:56:21 +0500 Subject: [PATCH 04/11] * Minor changes: Code style. --- ddGetMultipleField.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index b6798cc..ad4ddb8 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -67,7 +67,10 @@ $result = ''; //Если задано значение поля -if (isset($inputString) && strlen($inputString) > 0){ +if ( + isset($inputString) && + strlen($inputString) > 0 +){ if (!isset($rowDelimiter)){$rowDelimiter = '||';} if (!isset($colDelimiter)){$colDelimiter = '::';} From 5a28155a633975d3ab55b2f748991062ed2a440f Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 15 Apr 2017 19:50:59 +0500 Subject: [PATCH 05/11] =?UTF-8?q?+=20Added=20JSON=20format=20support=20for?= =?UTF-8?q?=20the=20=E2=80=9Cplaceholders=E2=80=9D=20parameter.=20*=20Atte?= =?UTF-8?q?ntion!=20MODXEvo.library.ddTools=20>=3D=200.18=20is=20required.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddGetMultipleField.php | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index ad4ddb8..a61f1f9 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -8,7 +8,7 @@ * * @uses PHP >= 5.4. * @uses MODX >= 1.0.13. - * @uses MODXEvo.library.ddTools >= 0.15.3. + * @uses MODXEvo.library.ddTools >= 0.18. * @uses MODXEvo.snippet.ddTypograph >= 1.4.3 (if typography is required). * * @param $inputString {string_separated} — The input string containing separated values. @required @@ -31,7 +31,7 @@ * @param $rowTpl {string_chunkName|string} — The template for row rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. Available placeholders: [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0), [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+col0+],[+col1+],… (column values). Default: ''. * @param $colTpl {string_commaSeparated_chunkName|string|'null'} — The comma-separated list of templates for column rendering (“outputFormat” has to be == 'html'). Use inline templates starting with “@CODE:”. 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. 'null' specifies rendering without a template. Available placeholders: [+val+], [+rowNumber+] (index of current row, starts at 1), [+rowNumber.zeroBased+] (index of current row, starts at 0). Default: ''. * @param $outerTpl {string_chunkName|string} — Wrapper template (“outputFormat” has to be != 'array'). Use inline templates starting with “@CODE:”. Available placeholders: [+result+], [+total+] (total number of rows), [+resultTotal+] (total number of returned rows), [+rowY.colX+] (“Y” — row number, “X” — column number). Default: ''. - * @param $placeholders {string_queryFormated} — Additional data as query string (https://en.wikipedia.org/wiki/Query_string) has to be passed into “outerTpl”, “rowTpl” and “colTpl”. E. g. “pladeholder1=value1&pagetitle=My awesome pagetitle!”. Arrays are supported too: “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”. Default: ''. + * @param $placeholders {stirng_json|string_queryFormated} — Additional data as JSON (https://en.wikipedia.org/wiki/JSON) or Query string (https://en.wikipedia.org/wiki/Query_string) has to be passed into “outerTpl”, “rowTpl” and “colTpl”. E. g. `{"pladeholder1": "value1", "pagetitle": "My awesome pagetitle!"}` or `pladeholder1=value1&pagetitle=My awesome pagetitle!`. Arrays are supported too: “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”. Default: ''. * @param $urlencode {0|1} — Is it required to URL encode the result? “outputFormat” has to be != 'array'. URL encoding is used according to RFC 3986. Default: 0. * @param $totalRowsToPlaceholder {string} — The name of the global MODX placeholder that holds the total number of rows. The placeholder won't be set if “totalRowsToPlaceholder” is empty. Default: ''. * @param $resultToPlaceholder {string} — The name of the global MODX placeholder that holds the snippet result. The result will be returned in a regular manner if the parameter is empty. Default: ''. @@ -244,17 +244,9 @@ isset($placeholders) && trim($placeholders) != '' ){ - //If “=” exists - if (strpos($placeholders, '=') !== false){ - //Parse a query string - parse_str($placeholders, $placeholders); - //Unfold for arrays support (e. g. “some[a]=one&some[b]=two” => “[+some.a+]”, “[+some.b+]”; “some[]=one&some[]=two” => “[+some.0+]”, “[some.1]”) - $placeholders = ddTools::unfoldArray($placeholders); - }else{ - //The old format - $placeholders = ddTools::explodeAssoc($placeholders); - $modx->logEvent(1, 2, '

String separated by “::” && “||” in the “placeholders” parameter is deprecated. Use a query string.

The snippet has been called in the document with id '.$modx->documentIdentifier.'.

', $modx->currentSnippet); - } + $placeholders = ddTools::encodedStringToArray($placeholders); + //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]”) + $placeholders = ddTools::unfoldArray($placeholders); }else{ $placeholders = []; } From 44e6e25ed3ffe89099d87c4db1ceb0cd80c741ab Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 15 Apr 2017 20:00:43 +0500 Subject: [PATCH 06/11] =?UTF-8?q?*=20Refactoring:=20=E2=80=9C$modx->getTpl?= =?UTF-8?q?=E2=80=9D=20is=20used=20for=20getting=20templates.=20*=20Attent?= =?UTF-8?q?ion!=20Snippet=20now=20requires=20MODXEvo=20>=3D=201.1.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddGetMultipleField.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index a61f1f9..e628fe8 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -7,7 +7,7 @@ * @note The fields formed by the mm_ddMultipleFields widget values ooutput gets more convinient with the snippet. * * @uses PHP >= 5.4. - * @uses MODX >= 1.0.13. + * @uses MODXEvo >= 1.1. * @uses MODXEvo.library.ddTools >= 0.18. * @uses MODXEvo.snippet.ddTypograph >= 1.4.3 (if typography is required). * @@ -264,7 +264,7 @@ //Получим содержимое шаблонов foreach ($colTpl as $colTpl_itemNumber => $colTpl_itemValue){ //Chunk content or inline template - $colTpl[$colTpl_itemNumber] = (substr($colTpl[$colTpl_itemNumber], 0, 6) == '@CODE:') ? substr($colTpl[$colTpl_itemNumber], 6) : $modx->getChunk($colTpl[$colTpl_itemNumber]); + $colTpl[$colTpl_itemNumber] = $modx->getTpl($colTpl[$colTpl_itemNumber]); } if (($temp = count($data[0]) - count($colTpl)) > 0){ @@ -278,7 +278,7 @@ //Если задан шаблон строки if (isset($rowTpl)){ //Chunk content or inline template - $rowTpl = (substr($rowTpl, 0, 6) == '@CODE:') ? substr($rowTpl, 6) : $modx->getChunk($rowTpl); + $rowTpl = $modx->getTpl($rowTpl); //Перебираем строки foreach ($data as $rowNumber => $row){ @@ -372,7 +372,7 @@ //Если оборачивающий шаблон задан (и вывод не в массив), парсим его if (isset($outerTpl)){ //Chunk content or inline template - $outerTpl = (substr($outerTpl, 0, 6) == '@CODE:') ? substr($outerTpl, 6) : $modx->getChunk($outerTpl); + $outerTpl = $modx->getTpl($outerTpl); $resTemp = []; From 58979deab51838e2c3ab8d8b103ff34b3324babc Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Sat, 15 Apr 2017 20:39:04 +0500 Subject: [PATCH 07/11] =?UTF-8?q?+=20Added=20JSON=20format=20support=20for?= =?UTF-8?q?=20the=20=E2=80=9CinputString=E2=80=9D=20parameter.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddGetMultipleField.php | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index e628fe8..eed8cd3 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -3,19 +3,19 @@ * ddGetMultipleField * @version 3.3 (2016-06-06) * - * @desc A snippet for separated by delimiters data output. - * @note The fields formed by the mm_ddMultipleFields widget values ooutput gets more convinient with the snippet. + * @desc A snippet for processing, manipulations and custom output structured data (JSON or separated by delimiters strings). + * @note The fields formed by the “mm_ddMultipleFields” widget values output gets more convinient with the snippet. * * @uses PHP >= 5.4. * @uses MODXEvo >= 1.1. * @uses MODXEvo.library.ddTools >= 0.18. * @uses MODXEvo.snippet.ddTypograph >= 1.4.3 (if typography is required). * - * @param $inputString {string_separated} — The input string containing separated values. @required + * @param $inputString {stirng_json|string_separated} — The input string containing values in JSON (https://en.wikipedia.org/wiki/JSON) or separated by “$rowDelimiter” and “$colDelimiter”. @required * @param $inputString_docField {string} — 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. Default: —. * @param $inputString_docId {integer} — ID of the document which field/TV value is required to get. “inputString_docId” equals the current document id since “inputString_docId” is unset. Default: —. - * @param $rowDelimiter {string|regexp} — The input string row delimiter. Default: '||'. - * @param $colDelimiter {string|regexp} — The input string column delimiter. Default: '::'. + * @param $rowDelimiter {string|regexp} — The input string row delimiter (if not JSON). Default: '||'. + * @param $colDelimiter {string|regexp} — The input string column delimiter (if not JSON). Default: '::'. * @param $startRow {integer} — The index of the initial row (indexes start at 0). Default: 0. * @param $totalRows {integer|'all'} — The maximum number of rows to return. All rows will be returned if “totalRows” == 'all'. Default: 'all'. * @param $columns {string_commaSeparated|'all'} — The indexes of columns to return (indexes start at 0). All columns will be returned if “columns” == 'all'. Default: 'all'. @@ -117,15 +117,29 @@ $urlencode = (isset($urlencode) && $urlencode == '1') ? true : false; $outputFormat = isset($outputFormat) ? strtolower($outputFormat) : 'html'; - //Разбиваем на строки - $data = $rowDelimiterIsRegexp ? preg_split($rowDelimiter, $inputString) : explode($rowDelimiter, $inputString); + //JSON + if (substr(ltrim($inputString), 0, 1) == '['){ + try { + $data = json_decode($inputString, true); + }catch (\Exception $e){ + //Flag + $data = []; + } + } + //Not JSON + if (empty($data)){ + //Разбиваем на строки + $data = $rowDelimiterIsRegexp ? preg_split($rowDelimiter, $inputString) : explode($rowDelimiter, $inputString); + } //Общее количество строк $total = count($data); //Перебираем строки, разбиваем на колонки foreach ($data as $rowNumber => $row){ - $data[$rowNumber] = $colDelimiterIsRegexp ? preg_split($colDelimiter, $row) : explode($colDelimiter, $row); + if (!is_array($row)){ + $data[$rowNumber] = $colDelimiterIsRegexp ? preg_split($colDelimiter, $row) : explode($colDelimiter, $row); + } //Если необходимо получить какие-то конкретные значения if ($filter !== false){ From 653baa974db1ab0a2567bfe1b9a103af09c2c24f Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Wed, 14 Nov 2018 08:09:39 +0300 Subject: [PATCH 08/11] * Minor changes. --- ddGetMultipleField.php | 311 ++++++++++++++++++++++++++++++++--------- 1 file changed, 248 insertions(+), 63 deletions(-) diff --git a/ddGetMultipleField.php b/ddGetMultipleField.php index eed8cd3..99c5d98 100644 --- a/ddGetMultipleField.php +++ b/ddGetMultipleField.php @@ -8,8 +8,8 @@ * * @uses PHP >= 5.4. * @uses MODXEvo >= 1.1. - * @uses MODXEvo.library.ddTools >= 0.18. - * @uses MODXEvo.snippet.ddTypograph >= 1.4.3 (if typography is required). + * @uses MODXEvo.libraries.ddTools >= 0.18. + * @uses MODXEvo.snippets.ddTypograph >= 1.4.3 (if typography is required). * * @param $inputString {stirng_json|string_separated} — The input string containing values in JSON (https://en.wikipedia.org/wiki/JSON) or separated by “$rowDelimiter” and “$colDelimiter”. @required * @param $inputString_docField {string} — 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. Default: —. @@ -44,23 +44,38 @@ $ddToolsPath = $modx->getConfig('base_path').'assets/libs/ddTools/modx.ddtools.class.php'; if (!file_exists($ddToolsPath)){ - $ddToolsPath = str_replace('assets/libs/', 'assets/snippets/', $ddToolsPath); - $modx->logEvent(1, 2, '

Please update the “modx.ddTools” library.

The snippet has been called in the document with id '.$modx->documentIdentifier.'.

', $modx->currentSnippet); + $ddToolsPath = str_replace( + 'assets/libs/', + 'assets/snippets/', + $ddToolsPath + ); + $modx->logEvent( + 1, + 2, + '

Please update the “modx.ddTools” library.

The snippet has been called in the document with id '.$modx->documentIdentifier.'.

', + $modx->currentSnippet + ); } //Подключаем modx.ddTools require_once $ddToolsPath; //Для обратной совместимости -extract(ddTools::verifyRenamedParams($params, [ - 'inputString' => 'string', - 'inputString_docField' => 'docField', - 'inputString_docId' => 'docId' -])); +extract(ddTools::verifyRenamedParams( + $params, + [ + 'inputString' => 'string', + 'inputString_docField' => 'docField', + 'inputString_docId' => 'docId' + ] +)); //Если задано имя поля, которое необходимо получить if (isset($inputString_docField)){ - $inputString = ddTools::getTemplateVarOutput([$inputString_docField], $inputString_docId); + $inputString = ddTools::getTemplateVarOutput( + [$inputString_docField], + $inputString_docId + ); $inputString = $inputString[$inputString_docField]; } @@ -75,19 +90,34 @@ if (!isset($colDelimiter)){$colDelimiter = '::';} //Являются ли разделители регулярками - $rowDelimiterIsRegexp = (filter_var($rowDelimiter, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']]) !== false) ? true : false; - $colDelimiterIsRegexp = (filter_var($colDelimiter, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']]) !== false) ? true : false; + $rowDelimiterIsRegexp = (filter_var( + $rowDelimiter, + FILTER_VALIDATE_REGEXP, + ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']] + ) !== false) ? true : false; + + $colDelimiterIsRegexp = (filter_var( + $colDelimiter, + FILTER_VALIDATE_REGEXP, + ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']] + ) !== false) ? true : false; //Если заданы условия фильтрации if (isset($filter)){ //Разбиваем по условиям - $temp = explode('||', $filter); + $temp = explode( + '||', + $filter + ); $filter = []; foreach ($temp as $value){ //Разбиваем по колонке/значению - $value = explode('::', $value); + $value = explode( + '::', + $value + ); //Если указали просто значение (значит, это нулевая колонка) TODO: Удалить через пару версий. if (count($value) < 2){ @@ -107,20 +137,44 @@ $filter = false; } - $columns = isset($columns) ? explode(',', $columns) : 'all'; + $columns = isset($columns) ? explode( + ',', + $columns + ) : 'all'; //Хитро-мудро для array_intersect_key - if (is_array($columns)){$columns = array_combine($columns, $columns);} + if (is_array($columns)){ + $columns = array_combine( + $columns, + $columns + ); + } if (!isset($rowGlue)){$rowGlue = '';} if (!isset($colGlue)){$colGlue = '';} - $removeEmptyRows = (isset($removeEmptyRows) && $removeEmptyRows == '0') ? false : true; - $removeEmptyCols = (isset($removeEmptyCols) && $removeEmptyCols == '0') ? false : true; - $urlencode = (isset($urlencode) && $urlencode == '1') ? true : false; + $removeEmptyRows = ( + isset($removeEmptyRows) && + $removeEmptyRows == '0' + ) ? false : true; + $removeEmptyCols = ( + isset($removeEmptyCols) && + $removeEmptyCols == '0' + ) ? false : true; + $urlencode = ( + isset($urlencode) && + $urlencode == '1' + ) ? true : false; $outputFormat = isset($outputFormat) ? strtolower($outputFormat) : 'html'; //JSON - if (substr(ltrim($inputString), 0, 1) == '['){ + if (substr( + ltrim($inputString), + 0, + 1 + ) == '['){ try { - $data = json_decode($inputString, true); + $data = json_decode( + $inputString, + true + ); }catch (\Exception $e){ //Flag $data = []; @@ -129,25 +183,47 @@ //Not JSON if (empty($data)){ //Разбиваем на строки - $data = $rowDelimiterIsRegexp ? preg_split($rowDelimiter, $inputString) : explode($rowDelimiter, $inputString); + $data = $rowDelimiterIsRegexp ? preg_split( + $rowDelimiter, + $inputString + ) : explode( + $rowDelimiter, + $inputString + ); } //Общее количество строк $total = count($data); //Перебираем строки, разбиваем на колонки - foreach ($data as $rowNumber => $row){ + foreach ( + $data as + $rowNumber => $row + ){ if (!is_array($row)){ - $data[$rowNumber] = $colDelimiterIsRegexp ? preg_split($colDelimiter, $row) : explode($colDelimiter, $row); + $data[$rowNumber] = $colDelimiterIsRegexp ? preg_split( + $colDelimiter, + $row + ) : explode( + $colDelimiter, + $row + ); } //Если необходимо получить какие-то конкретные значения if ($filter !== false){ //Перебираем колонки для фильтрации - foreach ($filter as $columnNumber => $value){ + foreach ( + $filter as + $columnNumber => $value + ){ //Если текущего значения в списке нет, сносим нафиг - if (!in_array($data[$rowNumber][$columnNumber], $value)){ + if (!in_array( + $data[$rowNumber][$columnNumber], + $value + )){ unset($data[$rowNumber]); + //Уходим (строку уже снесли, больше ничего не важно) break; } @@ -161,7 +237,10 @@ isset($data[$rowNumber]) ){ //Выбираем только необходимые колонки + Сбрасываем ключи массива - $data[$rowNumber] = array_values(array_intersect_key($data[$rowNumber], $columns)); + $data[$rowNumber] = array_values(array_intersect_key( + $data[$rowNumber], + $columns + )); } //Если нужно удалять пустые строки @@ -171,7 +250,12 @@ isset($data[$rowNumber]) ){ //Если строка пустая, удаляем - if (strlen(implode('', $data[$rowNumber])) == 0){unset($data[$rowNumber]);} + if (strlen(implode( + '', + $data[$rowNumber] + )) == 0){ + unset($data[$rowNumber]); + } } } @@ -194,7 +278,14 @@ $data = array_reverse($data); }else{ //Сортируем результаты - $data = ddTools::sort2dArray($data, explode(',', $sortBy), ($sortDir == 'ASC') ? 1 : -1); + $data = ddTools::sort2dArray( + $data, + explode( + ',', + $sortBy + ), + ($sortDir == 'ASC') ? 1 : -1 + ); } } @@ -218,9 +309,16 @@ //Если нужны все элементы if ($totalRows == 'all'){ - $data = array_slice($data, $startRow); + $data = array_slice( + $data, + $startRow + ); }else{ - $data = array_slice($data, $startRow, $totalRows); + $data = array_slice( + $data, + $startRow, + $totalRows + ); } //Общее количество возвращаемых строк @@ -228,20 +326,32 @@ //Плэйсхолдер с общим количеством if (isset($totalRowsToPlaceholder)){ - $modx->setPlaceholder($totalRowsToPlaceholder, $resultTotal); + $modx->setPlaceholder( + $totalRowsToPlaceholder, + $resultTotal + ); } //Если нужно типографировать if (isset($typography)){ - $typography = explode(',', $typography); + $typography = explode( + ',', + $typography + ); //Придётся ещё раз перебрать результат - foreach ($data as $rowNumber => $row){ + foreach ( + $data as + $rowNumber => $row + ){ //Перебираем колонки, заданные для типографирования foreach ($typography as $v){ //Если такая колонка существует, типографируем if (isset($data[$rowNumber][$v])){ - $data[$rowNumber][$v] = $modx->runSnippet('ddTypograph', ['text' => $data[$rowNumber][$v]]); + $data[$rowNumber][$v] = $modx->runSnippet( + 'ddTypograph', + ['text' => $data[$rowNumber][$v]] + ); } } } @@ -271,22 +381,39 @@ $outputFormat == 'htmlarray' ){ //Шаблоны колонок - $colTpl = isset($colTpl) ? explode(',', $colTpl) : false; + $colTpl = isset($colTpl) ? explode( + ',', + $colTpl + ) : false; //Если шаблоны колонок заданы, но их не хватает if ($colTpl !== false){ //Получим содержимое шаблонов - foreach ($colTpl as $colTpl_itemNumber => $colTpl_itemValue){ + foreach ( + $colTpl as + $colTpl_itemNumber => $colTpl_itemValue + ){ //Chunk content or inline template $colTpl[$colTpl_itemNumber] = $modx->getTpl($colTpl[$colTpl_itemNumber]); } if (($temp = count($data[0]) - count($colTpl)) > 0){ //Дозабьём недостающие последним - $colTpl = array_merge($colTpl, array_fill($temp - 1, $temp, $colTpl[count($colTpl) - 1])); + $colTpl = array_merge( + $colTpl, + array_fill( + $temp - 1, + $temp, + $colTpl[count($colTpl) - 1] + ) + ); } - $colTpl = str_replace('null', '', $colTpl); + $colTpl = str_replace( + 'null', + '', + $colTpl + ); } //Если задан шаблон строки @@ -295,7 +422,10 @@ $rowTpl = $modx->getTpl($rowTpl); //Перебираем строки - foreach ($data as $rowNumber => $row){ + foreach ( + $data as + $rowNumber => $row + ){ $resTemp[$rowNumber] = [ //Запишем номер строки 'rowNumber.zeroBased' => $rowNumber, @@ -306,7 +436,10 @@ ]; //Перебираем колонки - foreach ($row as $columnNumber => $column){ + foreach ( + $row as + $columnNumber => $column + ){ //Если нужно удалять пустые значения if ( $removeEmptyCols && @@ -319,44 +452,74 @@ $colTpl !== false && strlen($colTpl[$columnNumber]) > 0 ){ - $resTemp[$rowNumber]['col'.$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge([ - 'val' => $column, - 'rowNumber.zeroBased' => $resTemp[$rowNumber]['rowNumber.zeroBased'], - 'rowNumber' => $resTemp[$rowNumber]['rowNumber'] - ], $placeholders)); + $resTemp[$rowNumber]['col'.$columnNumber] = $modx->parseText( + $colTpl[$columnNumber], + array_merge( + [ + 'val' => $column, + 'rowNumber.zeroBased' => $resTemp[$rowNumber]['rowNumber.zeroBased'], + 'rowNumber' => $resTemp[$rowNumber]['rowNumber'] + ], + $placeholders + ) + ); }else{ $resTemp[$rowNumber]['col'.$columnNumber] = $column; } } } - $resTemp[$rowNumber] = $modx->parseText($rowTpl, array_merge($resTemp[$rowNumber], $placeholders)); + $resTemp[$rowNumber] = $modx->parseText( + $rowTpl, + array_merge( + $resTemp[$rowNumber], + $placeholders + ) + ); } }else{ - foreach ($data as $rowNumber => $row){ + foreach ( + $data as + $rowNumber => $row + ){ //Если есть шаблоны значений колонок if ($colTpl !== false){ - foreach ($row as $columnNumber => $column){ + foreach ( + $row as + $columnNumber => $column + ){ if ( $removeEmptyCols && !strlen($column) ){ unset($row[$columnNumber]); }else if (strlen($colTpl[$columnNumber]) > 0){ - $row[$columnNumber] = $modx->parseText($colTpl[$columnNumber], array_merge([ - 'val' => $column, - 'rowNumber.zeroBased' => $rowNumber, - 'rowNumber' => $rowNumber + 1 - ], $placeholders)); + $row[$columnNumber] = $modx->parseText( + $colTpl[$columnNumber], + array_merge( + [ + 'val' => $column, + 'rowNumber.zeroBased' => $rowNumber, + 'rowNumber' => $rowNumber + 1 + ], + $placeholders + ) + ); } } } - $resTemp[$rowNumber] = implode($colGlue, $row); + $resTemp[$rowNumber] = implode( + $colGlue, + $row + ); } } if ($outputFormat == 'html'){ - $result = implode($rowGlue, $resTemp); + $result = implode( + $rowGlue, + $resTemp + ); }else{ $result = $resTemp; } @@ -369,7 +532,10 @@ $columns != 'all' && count($columns) == 1 ){ - $resTemp = array_map('implode', $resTemp); + $resTemp = array_map( + 'implode', + $resTemp + ); } //Если нужно получить какой-то конкретный элемент, а не все @@ -379,8 +545,14 @@ $result = json_encode($resTemp); } - //Это чтобы модекс не воспринимал как вызов сниппета - $result = strtr($result, ['[[' => '[ [', ']]' => '] ]']); + //Это чтобы MODX не воспринимал как вызов сниппета + $result = strtr( + $result, + [ + '[[' => '[ [', + ']]' => '] ]' + ] + ); } //Если оборачивающий шаблон задан (и вывод не в массив), парсим его @@ -398,15 +570,25 @@ //Добавляем 'row' и 'val' к ключам foreach ($data as $rowNumber => $row){ - $resTemp[preg_replace('/(\d)\.(\d)/', 'row$1.col$2', $rowNumber)] = $row; + $resTemp[preg_replace( + '/(\d)\.(\d)/', + 'row$1.col$2', + $rowNumber + )] = $row; } - $resTemp = array_merge($resTemp, $placeholders); + $resTemp = array_merge( + $resTemp, + $placeholders + ); $resTemp['total'] = $total; $resTemp['resultTotal'] = $resultTotal; - $result = $modx->parseText($outerTpl, $resTemp); + $result = $modx->parseText( + $outerTpl, + $resTemp + ); } //Если нужно URL-кодировать строку @@ -419,7 +601,10 @@ //Если надо, выводим в плэйсхолдер if (isset($resultToPlaceholder)){ - $modx->setPlaceholder($resultToPlaceholder, $result); + $modx->setPlaceholder( + $resultToPlaceholder, + $result + ); $result = ''; } From 67764d9a4393095dfca5370419fcab162b54a07c Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Wed, 14 Nov 2018 08:56:02 +0300 Subject: [PATCH 09/11] * Minor changes. --- README.md | 4 ++-- ddGetMultipleField.php => ddGetMultipleField_snippet.php | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename ddGetMultipleField.php => ddGetMultipleField_snippet.php (100%) diff --git a/README.md b/README.md index 2b02d70..23a4514 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# ddGetMultipleField +# (MODX)EvolutionCMS.snippets.ddGetMultipleField -A snippet for separated by delimiters data output. +A snippet for processing, manipulations and custom output structured data (JSON or separated by delimiters strings). ___ Visit the following [link](http://code.divandesign.biz/modx/ddgetmultiplefield) to read the documentation, instructions & changelog. \ No newline at end of file diff --git a/ddGetMultipleField.php b/ddGetMultipleField_snippet.php similarity index 100% rename from ddGetMultipleField.php rename to ddGetMultipleField_snippet.php From 9845154590ad14af65c17e8b388617e2b996142d Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Wed, 14 Nov 2018 09:01:33 +0300 Subject: [PATCH 10/11] =?UTF-8?q?*=20The=20following=20parameters=20were?= =?UTF-8?q?=20renamed=20(with=20backward=20compatibility):=20=09*=20?= =?UTF-8?q?=E2=80=9CrowDelimiter=E2=80=9D=20=E2=86=92=20=E2=80=9CinputStri?= =?UTF-8?q?ng=5FrowDelimiter=E2=80=9D.=20=09*=20=E2=80=9CcolDelimiter?= =?UTF-8?q?=E2=80=9D=20=E2=86=92=C2=A0=E2=80=9CinputString=5FcolDelimiter?= =?UTF-8?q?=E2=80=9D.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ddGetMultipleField_snippet.php | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/ddGetMultipleField_snippet.php b/ddGetMultipleField_snippet.php index 99c5d98..219b4c9 100644 --- a/ddGetMultipleField_snippet.php +++ b/ddGetMultipleField_snippet.php @@ -11,11 +11,11 @@ * @uses MODXEvo.libraries.ddTools >= 0.18. * @uses MODXEvo.snippets.ddTypograph >= 1.4.3 (if typography is required). * - * @param $inputString {stirng_json|string_separated} — The input string containing values in JSON (https://en.wikipedia.org/wiki/JSON) or separated by “$rowDelimiter” and “$colDelimiter”. @required + * @param $inputString {stirng_json|string_separated} — The input string containing values in JSON (https://en.wikipedia.org/wiki/JSON) or separated by “$inputString_rowDelimiter” and “$inputString_colDelimiter”. @required * @param $inputString_docField {string} — 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. Default: —. * @param $inputString_docId {integer} — ID of the document which field/TV value is required to get. “inputString_docId” equals the current document id since “inputString_docId” is unset. Default: —. - * @param $rowDelimiter {string|regexp} — The input string row delimiter (if not JSON). Default: '||'. - * @param $colDelimiter {string|regexp} — The input string column delimiter (if not JSON). Default: '::'. + * @param $inputString_rowDelimiter {string|regexp} — The input string row delimiter (if not JSON). Default: '||'. + * @param $inputString_colDelimiter {string|regexp} — The input string column delimiter (if not JSON). Default: '::'. * @param $startRow {integer} — The index of the initial row (indexes start at 0). Default: 0. * @param $totalRows {integer|'all'} — The maximum number of rows to return. All rows will be returned if “totalRows” == 'all'. Default: 'all'. * @param $columns {string_commaSeparated|'all'} — The indexes of columns to return (indexes start at 0). All columns will be returned if “columns” == 'all'. Default: 'all'. @@ -66,7 +66,9 @@ [ 'inputString' => 'string', 'inputString_docField' => 'docField', - 'inputString_docId' => 'docId' + 'inputString_docId' => 'docId', + 'inputString_rowDelimiter' => 'rowDelimiter', + 'inputString_colDelimiter' => 'colDelimiter' ] )); @@ -86,18 +88,18 @@ isset($inputString) && strlen($inputString) > 0 ){ - if (!isset($rowDelimiter)){$rowDelimiter = '||';} - if (!isset($colDelimiter)){$colDelimiter = '::';} + if (!isset($inputString_rowDelimiter)){$inputString_rowDelimiter = '||';} + if (!isset($inputString_colDelimiter)){$inputString_colDelimiter = '::';} //Являются ли разделители регулярками - $rowDelimiterIsRegexp = (filter_var( - $rowDelimiter, + $inputString_rowDelimiterIsRegexp = (filter_var( + $inputString_rowDelimiter, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']] ) !== false) ? true : false; - $colDelimiterIsRegexp = (filter_var( - $colDelimiter, + $inputString_colDelimiterIsRegexp = (filter_var( + $inputString_colDelimiter, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^\/.*\/[a-z]*$/']] ) !== false) ? true : false; @@ -183,11 +185,11 @@ //Not JSON if (empty($data)){ //Разбиваем на строки - $data = $rowDelimiterIsRegexp ? preg_split( - $rowDelimiter, + $data = $inputString_rowDelimiterIsRegexp ? preg_split( + $inputString_rowDelimiter, $inputString ) : explode( - $rowDelimiter, + $inputString_rowDelimiter, $inputString ); } @@ -201,11 +203,11 @@ $rowNumber => $row ){ if (!is_array($row)){ - $data[$rowNumber] = $colDelimiterIsRegexp ? preg_split( - $colDelimiter, + $data[$rowNumber] = $inputString_colDelimiterIsRegexp ? preg_split( + $inputString_colDelimiter, $row ) : explode( - $colDelimiter, + $inputString_colDelimiter, $row ); } From 9e90c2087b1571cf1a60331fd361553674371292 Mon Sep 17 00:00:00 2001 From: Ilyas Ronef Date: Wed, 14 Nov 2018 09:06:11 +0300 Subject: [PATCH 11/11] Prerelease 3.4 --- ddGetMultipleField_snippet.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ddGetMultipleField_snippet.php b/ddGetMultipleField_snippet.php index 219b4c9..caf7b68 100644 --- a/ddGetMultipleField_snippet.php +++ b/ddGetMultipleField_snippet.php @@ -1,7 +1,7 @@ getConfig('base_path').'assets/libs/ddTools/modx.ddtools.class.php';