We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 20894
    • 2 Posts
    Добрый день, нашел багу в 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;
    	}
    
      • 1611
      • 591 Posts
      Согласен, интерфейс DocManager с его «перечислите то что не надо трогать» очень неудобен. Т.к. TV-параметров бывает очень много, а изменить надо один-два. Было бы хорошо, сделать так, как предлагает najoory, и продвинуть это в официальный релиз.