Обробка даних перед викликом

    Часто виникає необхідність додаткової обробки даних перед виведенням. Для цього доступні prepare і prepareWrap - як настройки в файлі конфігурації або як параметри сніпета.

    Як значення можна вказати ім'я сніпета, ім'я функції (в файлі конфігурації також доступна можливість вказати функцію-замикання), або їх список, розділений комами, або їх масив.

    Параметри функції / сніпета наступні:

    ПараметрОпис
    $dataПоточні значення
    $modxЕкземпляр класу DocumentParser
    $_multiTVЕкземпляр класу multiTV, для роботи з методами сховища

    Функція / сніпет завжди повинні повертати значення, навіть якщо вони не змінювалися.

    Приклади:

    // в файлі конфигурації:
    function prepareRowsFunction($data, $modx, $_multiTV) {
       return $data;
    }
    
    $settings['prepare'] = 'prepareRowsSnippet';
    // або
    $settings['prepare'] = function($data, $modx, $_multiTV) {
       return $data;
    };
    // або
    $settings['prepare'] = 'prepareRowsSnippet,prepareRowsFunction'; 
    // або
    $settings['prepare'] = ['prepareRowsSnippet', 'prepareRowsFunction']; 
    // або
    $settings['prepare'] = ['prepareRowsSnippet', function($data, $modx, $_multiTV) {
       return $data;
    }]; 
    // в шаблоні
    [[multiTV? &tvName=`test` &prepare=`prepareRowsSnippet,prepareRowsFunction`]]

    Значення параметра $data функції prepare, крім значень полів, зазначених в конігураціі змінної, будуть наступними:

    КлючОпис
    docidІдентифікатор поточного документа
    iterationНомер поточної ітерації (починається з 1)
    rowrow.number: Номер поточної ітерації (починається з 1) row.total: Загальна кількість елементів

    Значення параметра $data для prepareWrap:

    КлючОпис
    docidІдентифікатор поточного документа
    wrapperМасив виведених елементів
    rowsrows.offset: Кількість пропущених елементів rows.total: Загальна кількість елементів

    Приклади:

    $settings['prepare'] = function($data, $modx, $_multiTV) {
       $store = $_multiTV->getStore('storekey');
    
       if (is_null($store)) {
          $store = $modx->runSnippet('HeavySnippet');
          $_multiTV->setStore('storekey', $store);
       }
    
       return $data;
    };
    $settings['prepare'] = function($data, $modx, $_multiTV) {
       if (!empty($data['file'])) {
          $extension = pathinfo($data['file'], PATHINFO_EXTENSION);
          $data['icon'] = 'icon-document-' . $extension;
       }
    
       return $data;
    };