Проблемы при выборе "разрешить повторяющиеся псевдонимы"

Обнаружил одну неприятную особенность при формировании дружественных url. Если выбрать «разрешить повторяющиеся псевдонимы», то они могут дублироваться даже в пределах одного родителя — т.е. получим два абсолютно одинаковых url. Конечно, это решается путем запрета такого повтора — но хотелось бы иметь в итоге url вида tv/samsung/product.html и photo/samsung/product.html, а не tv/samsung/product.html и photo/samsung1/product1.html.

Для этого не так уж много нужно. Проблема в файле save_content.processor.php. Итак

Находим кусок кода (примерно строка 77-89)
if ($friendly_urls) {
	// auto assign alias
	if (!$alias && $automatic_alias) {
		$alias = strtolower($modx->stripAlias(trim($pagetitle)));
		if(!$allow_duplicate_alias) {....}

и сразу после него добавляем нашу проверку для автоматически созданных алиасов:
else{
			if ($modx->db->getValue("SELECT COUNT(id) FROM " . $tbl_site_content . " WHERE id<>'$id' AND parent=$parent AND alias='$alias'") != 0) {
				$cnt = 1;
				$tempAlias = $alias;
				while ($modx->db->getValue("SELECT COUNT(id) FROM " . $tbl_site_content . " WHERE id<>'$id' AND parent=$parent AND alias='$tempAlias'") != 0) {
					$tempAlias = $alias;
					$tempAlias .= $cnt;
					$cnt++;
				}
				$alias = $tempAlias;
			}			
		}


2. находим кусок кода (примерно 135-136 строка кода)
elseif ($alias) {
		$alias = $modx->stripAlias($alias);
и добавляем после данной строки кусок проверки алиасов, которые задаются вручную
$docid = $modx->db->getValue("SELECT id FROM " . $tbl_site_content . " WHERE id<>'$id' AND alias='$alias' AND parent=$parent LIMIT 1");
		if ($docid > 0) {
			if ($actionToTake == 'edit') {
				$modx->manager->saveFormValues(27);
				$url = "index.php?a=27&id=" . $id;
				include_once "header.inc.php";
				$modx->webAlert(sprintf($_lang["duplicate_alias_found"], $docid, $alias), $url);
				include_once "footer.inc.php";
				exit;
			} else {
				$modx->manager->saveFormValues(4);
				$url = "index.php?a=4";
				include_once "header.inc.php";
				$modx->webAlert(sprintf($_lang["duplicate_alias_found"], $docid, $alias), $url);
				include_once "footer.inc.php";
				exit;
			}
		}


ну вот собственно и все, теперь получаем возможность нормально работать с повторяющимися алиасами, которые не будут повторяться в пределах одного родителя.

Наслаждаемся результатом, находим баги, ждем внедрения в оф.версию :)

1 комментарий

avatar
или я чего-то перемудрил? Хотя на боевом варианте срабатывает.
Комментарий отредактирован 2013-05-04 15:43:18 пользователем webber
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.