/**
 * mm_ddSelectDocuments
 * @version 1.2.2 (2014-02-14)
 * 
 * @desc A widget for ManagerManager that makes selection of documents ids easier.
 * 
 * @uses ManagerManager 0.6.
 * @uses ddTools 0.10.
 * 
 * @param $tvs {comma separated string} - TVs names that the widget is applied to. @required
 * @param $roles {comma separated string} - Roles that the widget is applied to (when this parameter is empty then widget is applied to the all roles). Default: ''.
 * @param $templates {comma separated string} - Templates IDs for which the widget is applying (empty value means the widget is applying to all templates). Default: ''.
 * @param $parentIds {comma separated string} - Parent documents IDs. @required
 * @param $depth {integer} - Depth of search. Default: 1.
 * @param $filter {separated string} - Filter clauses, separated by '&' between pairs and by '=' between keys and values. For example, 'template=15&published=1' means to choose the published documents with template id=15. Default: ''.
 * @param $max {integer} - The largest number of elements that can be selected by user (“0” means selection without a limit). Default: 0.
 * @param $labelMask {string} - Template to be used while rendering elements of the document selection list. It is set as a string containing placeholders for document fields and TVs. Also, there is the additional placeholder “[+title+]” that is substituted with either “menutitle” (if defined) or “pagetitle”. Default: '[+title+] ([+id+])'.
 * 
 * @event OnDocFormPrerender
 * @event OnDocFormRender
 * 
 * @link http://code.divandesign.biz/modx/mm_ddselectdocuments/1.2.2
 * 
 * @copyright 2014, DivanDesign
 * http://www.DivanDesign.biz
 */
function mm_ddSelectDocuments($tvs = '', $roles = '', $templates = '', $parentIds, $depth = 1, $filter = '', $max = 0, $labelMask = '[+title+] ([+id+])')
{
    if (empty($parentIds) || !useThisRule($roles, $templates)) {
        return;
    }
    global $modx;
    $e =& $modx->Event;
    $output = '';
    if ($e->name == 'OnDocFormPrerender') {
        $pluginDir = $modx->config['site_url'] . 'assets/plugins/managermanager/';
        $widgetDir = $pluginDir . 'widgets/ddselectdocuments/';
        $output .= includeJsCss($widgetDir . 'ddselectdocuments.css', 'html');
        $output .= includeJsCss($pluginDir . 'js/jquery-ui-1.10.3.min.js', 'html', 'jquery-ui', '1.10.3');
        $output .= includeJsCss($widgetDir . 'jquery.ddMultipleInput-1.2.1.min.js', 'html', 'jquery.ddMultipleInput', '1.2.1');
        $e->output($output);
    } else {
        if ($e->name == 'OnDocFormRender') {
            global $mm_current_page;
            $tvs = tplUseTvs($mm_current_page['template'], $tvs);
            if ($tvs == false) {
                return;
            }
            $filter = ddTools::explodeAssoc($filter, '&', '=');
            //Необходимые поля
            preg_match_all('~\\[\\+([^\\+\\]]*?)\\+\\]~', $labelMask, $matchField);
            $fields = array_unique(array_merge(array_keys($filter), array('pagetitle', 'id'), $matchField[1]));
            if (($title_pos = array_search('title', $fields)) !== false) {
                unset($fields[$title_pos]);
                $fields = array_unique(array_merge($fields, array('menutitle')));
            }
            //Рекурсивно получает все необходимые документы
            if (!function_exists('ddGetDocs')) {
                function ddGetDocs($parentIds = array(0), $filter = array(), $depth = 1, $labelMask = '[+pagetitle+] ([+id+])', $fields = array('pagetitle', 'id'))
                {
                    //Получаем дочерние документы текущего уровня
                    $docs = array();
                    //Перебираем всех родителей
                    foreach ($parentIds as $parent) {
                        //Получаем документы текущего родителя
                        $tekDocs = ddTools::getDocumentChildrenTVarOutput($parent, $fields, false);
                        //Если что-то получили
                        if (is_array($tekDocs)) {
                            //Запомним
                            $docs = array_merge($docs, $tekDocs);
                        }
                    }
                    $result = array();
                    //Если что-то есть
                    if (count($docs) > 0) {
                        //Перебираем полученные документы
                        foreach ($docs as $val) {
                            //Если фильтр пустой, либо не пустой и документ удовлетворяет всем условиям
                            if (empty($filter) || count(array_intersect_assoc($filter, $val)) == count($filter)) {
                                $val['title'] = empty($val['menutitle']) ? $val['pagetitle'] : $val['menutitle'];
                                //Записываем результат
                                $tmp = ddTools::parseText($labelMask, $val, '[+', '+]', false);
                                if (strlen(trim($tmp)) == 0) {
                                    $tmp = ddTools::parseText('[+pagetitle+] ([+id+])', $val, '[+', '+]', false);
                                }
                                $result[] = array('label' => $tmp, 'value' => $val['id']);
                            }
                            //Если ещё надо двигаться глубже
                            if ($depth > 1) {
                                //Сливаем результат с дочерними документами
                                $result = array_merge($result, ddGetDocs(array($val['id']), $filter, $depth - 1, $labelMask, $fields));
                            }
                        }
                    }
                    return $result;
                }
            }
            //Получаем все дочерние документы
            $docs = ddGetDocs(explode(',', $parentIds), $filter, $depth, $labelMask, $fields);
            if (count($docs) == 0) {
                return;
            }
            if (version_compare(PHP_VERSION, '5.4.0') >= 0) {
                $jsonDocs = json_encode($docs, JSON_UNESCAPED_UNICODE);
            } else {
                $jsonDocs = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', create_function('$matches', '$sym = mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16"); return $sym;'), json_encode($docs));
            }
            $output .= "//---------- mm_ddSelectDocuments :: Begin -----\n";
            foreach ($tvs as $tv) {
                $output .= '
$j("#tv' . $tv['id'] . '").ddMultipleInput({source: ' . $jsonDocs . ', max: ' . $max . '});
';
            }
            $output .= "//---------- mm_ddSelectDocuments :: End -----\n";
            $e->output($output);
        }
    }
}
示例#2
0
             }
         }
         //Если оборачивающий шаблон задан (и вывод не в массив), парсим его
         if (isset($outerTpl)) {
             $resTemp = array();
             //Элемент массива 'result' должен находиться самым первым, иначе дополнительные переданные плэйсхолдеры в тексте не найдутся!
             $resTemp['result'] = $result;
             //Преобразуем результат в одномерный массив
             $data = ddTools::unfoldArray($data);
             //Добавляем 'row' и 'val' к ключам
             foreach ($data as $rowNumber => $row) {
                 $resTemp[preg_replace('/(\\d)\\.(\\d)/', 'row$1.col$2', $rowNumber)] = $row;
             }
             //Если есть дополнительные данные
             if (isset($placeholders)) {
                 $resTemp = array_merge($resTemp, ddTools::explodeAssoc($placeholders));
             }
             $resTemp['total'] = $total;
             $resTemp['resultTotal'] = $resultTotal;
             $result = $modx->parseChunk($outerTpl, $resTemp, '[+', '+]');
         }
         //Если нужно URL-кодировать строку
         if ($urlencode) {
             $result = rawurlencode($result);
         }
     }
 }
 //Если надо, выводим в плэйсхолдер
 if (isset($resultToPlaceholder)) {
     $modx->setPlaceholder($resultToPlaceholder, $result);
 } else {