Добрый день, нашел багу в Docmanager 1.1 (который идет в комплекте с Modx 1.0)
В массовом изменении tv не работает поле "Не изменять параметры (TV) (имена через запятую):".
Логическая ошибка в файле \classes\dm_backend.class.php строка 505.
if (in_array($name,$ignoreList))
{
continue;
}
В $name лежит id TV в базе, а в $ignoreList - caption (во всяком случае предлагается ввести имена), следовательно пользователь так и не поймет что обнулило ему TV во всех документах. Чесно говоря, интерфейс оставляет желать лучшего, будто на коленке придумывался, не проще ли возле каждого TV выводить галочку "Править"?
В качестве фикса варианты:
1)вводить id-шники вместо имен tv(уведомить про это пользователя)
2)привести формат массивов к одному виду, до передачи в getTemplateVarIds()используется для проверок тот же массив только с айдишниками в ключах.
3)получать имя TV по айдишнику в самой функции, что чревато лишними запросами.
Вся функция в исходном виде:
function getTemplateVarIds($tvNames = array (), $documentId, $ignoreList=array()) {
$output = array ();
if (count($tvNames) > 0) {
foreach ($tvNames as $name => $value) {
if (in_array($name,$ignoreList)) {
continue;
}
$sql = $this->modx->db->select('id,default_text', $this->modx->getFullTableName('site_tmplvars'), 'id="' . $name . '"');
if ($this->modx->db->getRecordCount($sql) > 0) {
$row = $this->modx->db->getRow($sql);
if ($value !== $row['default_text'] || trim($value) == '') {
$output["$name"] = $row['id'];
} elseif ($value == $row["default_text"]) {
$newSql = $this->modx->db->select("value", $this->modx->getFullTableName("site_tmplvar_contentvalues"), "tmplvarid=" . $row["id"] . " AND contentid=" . $documentId);
if ($this->modx->db->getRecordCount($newSql) == 1) {
$this->modx->db->delete($this->modx->getFullTableName("site_tmplvar_contentvalues"), "tmplvarid=" . $row["id"] . " AND contentid=" . $documentId);
}
}
}
}
}
return $output;
}