function tplUseTvs($tpl_id, $tvs = '', $types = '') { // If it's a blank template, it can't have TVs if ($tpl_id == 0) { return false; } global $modx; // Make the TVs and field types into an array $fields = makeArray($tvs); $types = makeArray($types); // Get the DB table names $tv_table = $modx->getFullTableName('site_tmplvars'); $rel_table = $modx->getFullTableName('site_tmplvar_templates'); // Are we looking at specific TVs, or all? $tvs_sql = !empty($fields) ? ' AND tvs.name IN ' . makeSqlList($fields) : ''; // Are we looking at specific TV types, or all? $types_sql = !empty($types) ? ' AND type IN ' . makeSqlList($types) : ''; // Make the SQL for this template $cur_tpl = !empty($tpl_id) ? ' AND rel.templateid = ' . $tpl_id : ''; // Do the SQL query $result = $modx->db->query("SELECT id FROM {$tv_table} tvs LEFT JOIN {$rel_table} rel ON rel.tmplvarid = tvs.id WHERE 1=1 {$cur_tpl} {$tvs_sql} {$types_sql}"); // If we have results, return them, otherwise return false if ($modx->db->getRecordCount($result) == 0) { return false; } else { return $modx->db->makeArray($result); } }
/** * tplUseTvs * @version 1.2 (2013-09-16) * * @desc Does the specified template use the specified TVs? * * @param $tpl_id {integer} - Template ID. * @param $tvs {comma separated string; array} - TV names. Default: ''. * @param $types {comma separated string; array} - TV types, e.g. image. Default: ''. * @param $dbFields {somma separated string} - DB fields which get from 'site_tmplvars' table. Default: 'id'. * @param $resultKey {string; false} - DB field, which values are keys of result array. Keys of result array will be numbered if the parameter equals false. Default: false. * * @return {array; false} */ function tplUseTvs($tpl_id, $tvs = '', $types = '', $dbFields = 'id', $resultKey = false) { // If it's a blank template, it can't have TVs if ($tpl_id == 0) { return false; } global $modx; //Make the TVs, field types and DB fields into an array $fields = makeArray($tvs); $types = makeArray($types); $dbFields = makeArray($dbFields); //Add the result key in DB fields if return of an associative array is required & result key is absent there if ($resultKey !== false && !in_array($resultKey, $dbFields)) { $dbFields[] = $resultKey; } //Get the DB table names $tv_table = $modx->getFullTableName('site_tmplvars'); $rel_table = $modx->getFullTableName('site_tmplvar_templates'); //Are we looking at specific TVs, or all? $tvs_sql = !empty($fields) ? ' AND tvs.name IN ' . makeSqlList($fields) : ''; //Are we looking at specific TV types, or all? $types_sql = !empty($types) ? ' AND type IN ' . makeSqlList($types) : ''; //Make the SQL for this template $cur_tpl = !empty($tpl_id) ? ' AND rel.templateid = ' . $tpl_id : ''; //Execute the SQL query $query = "SELECT " . implode(',', $dbFields) . " FROM {$tv_table} tvs LEFT JOIN {$rel_table} rel ON rel.tmplvarid = tvs.id WHERE 1=1 {$cur_tpl} {$tvs_sql} {$types_sql}"; // echo $query; $result = $modx->db->query($query); $recordCount = $modx->db->getRecordCount($result); // If we have results, return them, otherwise return false if ($recordCount == 0) { return false; } else { //If return of an associative array is required if ($resultKey !== false) { $rsArray = array(); for ($i = 0; $i < $recordCount; $i++) { $row = $modx->db->getRow($result); //If result contains the result key if (array_key_exists($resultKey, $row)) { $rsArray[$row[$resultKey]] = $row; } else { $rsArray[] = $row; } } return $rsArray; } else { return $modx->db->makeArray($result); } } }
/** * mm_ddReadonly * @version 1.0.1 (2013-07-13) * * @desc Makes fields only readable. * * @uses ManagerManager plugin 0.5.1. * * @param $fields {comma separated string} - The name(s) of the document fields (or TVs) for which the widget is applying. @required * @param $roles {comma separated string} - The 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: ''. * * @link http://code.divandesign.biz/modx/mm_ddreadonly/1.0.1 * * @copyright 2013, DivanDesign * http://www.DivanDesign.biz */ function mm_ddReadonly($fields = '', $roles = '', $templates = '') { global $modx, $mm_fields, $mm_current_page; $e =& $modx->Event; if (!useThisRule($roles, $templates)) { return; } //Перед сохранением документа if ($e->name == 'OnBeforeDocFormSave') { //Если создаётся новый документ, у него нет никакого id ещё, да и нам пофиг, т.к. никто ничего с ним всё равно не мог сделать до сохранения if ($e->params['mode'] == 'new') { return; } //ID документа $docId = $e->params['id']; //Если нужная переменная в сессии не определена, определим if (!is_array($_SESSION['mm_ddReadonly'])) { $_SESSION['mm_ddReadonly'] = array(); } //Разбиваем переданные поля в массивчик $fields = makeArray($fields); //Получаем id TV. TODO: Оптимизировать, чтобы всё было в один запрос $tvs = tplUseTvs($mm_current_page['template'], $fields, '', 'id,name'); //Результат $resultFields = array(); //Если что-то оплучили if (is_array($tvs) && count($tvs) > 0) { $tvsNames = array(); //Пробежимся, переделаем под удобный нам формат foreach ($tvs as $val) { $tvsNames[$val['id']] = $val['name']; } //Получаем значения TV $tvs = $modx->db->makeArray($modx->db->select('value,tmplvarid AS id', ddTools::$tables['site_tmplvar_contentvalues'], 'contentid=' . $docId . ' AND tmplvarid IN ' . makeSqlList(array_keys($tvsNames)))); //Если что-то нашлось if (count($tvs) > 0) { //Пробежимся foreach ($tvs as $val) { //Если значение не пустое if ($val['value'] != '') { //Запишем значения $resultFields[$tvsNames[$val['id']]] = $val['value']; } } } } //Перебираем поля foreach ($fields as $key => $val) { //Если такого поля нет или это TV if (!isset($mm_fields[$val]) || $mm_fields[$val]['tv'] == 1) { //Снесём unset($fields[$key]); } } if (count($fields) > 0) { //Получаем значения необходимых полей $fields = $modx->db->getRow($modx->db->select(implode(',', $fields), ddTools::$tables['site_content'], 'id=' . $docId)); //Переберём foreach ($fields as $key => $val) { if ($val != '') { $resultFields[$key] = $val; } } } //Если хоть что-то осталось if (count($resultFields) > 0) { //Сохраним значения в сессию, они нам ещё понадобятся $_SESSION['mm_ddReadonly'][$docId] = $resultFields; } //После сохранения документа } else { if ($e->name == 'OnDocFormSave') { //Если создаётся новый документ, у него нет никакого id ещё, да и нам пофиг, т.к. никто ничего с ним всё равно не мог сделать до сохранения if ($e->params['mode'] == 'new') { return; } //ID документа $docId = $e->params['id']; //Если данные о текущем документе есть if (is_array($_SESSION['mm_ddReadonly']) && is_array($_SESSION['mm_ddReadonly'][$docId]) && count($_SESSION['mm_ddReadonly'][$docId]) > 0) { //Обновляем данные документа в соответствии с тем, что было раньше ddTools::updateDocument($docId, $_SESSION['mm_ddReadonly'][$docId]); //Сносим за ненадобностью unset($_SESSION['mm_ddReadonly'][$docId]); } //При копировании документа } else { if ($e->name == 'OnDocDuplicate') { //Получаем id TV $tvs = tplUseTvs($mm_current_page['template'], $fields); //Если что-то оплучили if (is_array($tvs) && count($tvs) > 0) { $tvIds = array(); foreach ($tvs as $val) { $tvIds[] = $val['id']; } //Удаляем значение TV для данного документа $modx->db->delete(ddTools::$tables['site_tmplvar_contentvalues'], '`contentid` = ' . $e->params['new_id'] . ' AND `tmplvarid` IN(' . implode(',', $tvIds) . ')'); } //При рендере документа } else { if ($e->name == 'OnDocFormRender') { //Разбиваем переданные поля в массивчик $fields = makeArray($fields); //Если есть что-то if (count($fields) > 0) { $output = "// ---------------- mm_ddReadonly :: Begin ------------- \n"; $output .= 'var $mm_ddReadonly;'; //Получаем id TV $tvs = tplUseTvs($mm_current_page['template'], $fields); //Если что-то есть if (is_array($tvs) && count($tvs) > 0) { //Перебираем TV foreach ($tvs as $val) { //Вставляем значение перед оригиналом и сносим оригинал нафиг $output .= ' $mm_ddReadonly = $j("#tv' . $val['id'] . '"); $mm_ddReadonly.before($mm_ddReadonly.val()).hide(); '; } } if (count($fields) != count($tvs)) { //Перебираем поля foreach ($fields as $val) { //Если такое поле есть и это не TV if (isset($mm_fields[$val]) && $mm_fields[$val]['tv'] != 1) { $output .= ' $mm_ddReadonly = $j("' . $mm_fields[$val]['fieldtype'] . '[name=\\"' . $mm_fields[$val]['fieldname'] . '\\"]"); $mm_ddReadonly.before($mm_ddReadonly.val()).hide(); '; } } } $output .= "\n// ---------------- mm_ddReadonly :: End -------------"; $e->output($output . "\n"); } } } } } }
/** * tplUseTvs * @version 1.2.1 (2014-03-29) * * @desc Does the specified template use the specified TVs? * * @param $tpl_id {integer} - Template ID. * @param $tvs {comma separated string; array} - TV names. Default: ''. * @param $types {comma separated string; array} - TV types, e.g. image. Default: ''. * @param $dbFields {somma separated string} - DB fields which get from 'site_tmplvars' table. Default: 'id'. * @param $resultKey {string; false} - DB field, which values are keys of result array. Keys of result array will be numbered if the parameter equals false. Default: false. * * @return {array; false} */ function tplUseTvs($tpl_id, $tvs = '', $types = '', $dbFields = 'id', $resultKey = false) { // If it's a blank template, it can't have TVs if ($tpl_id == 0) { return false; } global $modx; //Make the TVs, field types and DB fields into an array $fields = makeArray($tvs); $types = makeArray($types); $dbFields = makeArray($dbFields); //Add the result key in DB fields if return of an associative array is required & result key is absent there if ($resultKey !== false && !in_array($resultKey, $dbFields)) { $dbFields[] = $resultKey; } //Get the DB table names $tv_table = $modx->getFullTableName('site_tmplvars'); $rel_table = $modx->getFullTableName('site_tmplvar_templates'); $where = array(); //Are we looking at specific TVs, or all? if (!empty($fields)) { $where[] = 'tvs.name IN ' . makeSqlList($fields); } //Are we looking at specific TV types, or all? if (!empty($types)) { $where[] = 'type IN ' . makeSqlList($types); } //Make the SQL for this template if (!empty($tpl_id)) { $where[] = 'rel.templateid = ' . $tpl_id; } //Execute the SQL query $result = $modx->db->select(implode(',', $dbFields), $tv_table . ' AS tvs LEFT JOIN ' . $rel_table . ' AS rel ON rel.tmplvarid = tvs.id', implode(' AND ', $where)); $recordCount = $modx->db->getRecordCount($result); // If we have results, return them, otherwise return false if ($recordCount == 0) { return false; } else { //If return of an associative array is required if ($resultKey !== false) { $rsArray = array(); while ($row = $modx->db->getRow($result)) { //If result contains the result key if (array_key_exists($resultKey, $row)) { $rsArray[$row[$resultKey]] = $row; } else { $rsArray[] = $row; } } return $rsArray; } else { return $modx->db->makeArray($result); } } }