1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-18 04:22:10 +02:00

Fix issue processwire/processwire-issues#322 where certain scenario could allow collision of language-specific page names

This commit is contained in:
Ryan Cramer
2018-03-16 10:24:46 -04:00
parent 6c4f4103d2
commit f52c3f54c9

View File

@@ -557,9 +557,17 @@ class LanguageSupportPageNames extends WireData implements Module, ConfigurableM
// set language page name
$name = $inputfield->attr('name') . $language;
$value = $sanitizer->pageNameUTF8($input->$name);
// if it matches the value for the default language, avoid double storing it
if($value === $page->name) $value = '';
// if it matches the value already on the page, then no need to go further
$key = "name$language";
if($value == $page->get($key)) continue;
// @todo uncomment in dev branch
// if(!$this->checkLanguagePageName($language, $page, $value, $inputfield)) continue;
if($page->id) {
$page->set($key, $value);
} else {
@@ -568,6 +576,58 @@ class LanguageSupportPageNames extends WireData implements Module, ConfigurableM
}
}
/**
* Check changed page name for given language
*
* @param Language $language
* @param Page $page
* @param string $value New page name
* @param Wire|null $errorTarget Object to send error to (Inputfield likely)
* @return bool True if all good, false if not
*
*/
public function checkLanguagePageName(Language $language, Page $page, $value, Wire $errorTarget = null) {
// verify that it does not conflict with another page inheriting name from default language
$isValid = true;
$nameKey = "name$language->id";
if(!strlen($value)) return true;
$sql =
"SELECT id, name, $nameKey FROM pages " .
"WHERE parent_id=:parent_id " .
"AND id!=:id " .
"AND (" .
"(name=:newName AND $nameKey IS NULL) " . // default name matches and lang name inherits it (is null)
"OR ($nameKey=:newName2)" . // or lang name is same as requested one
")";
$query = $this->wire('database')->prepare($sql);
$query->bindValue(':parent_id', $page->parent_id, \PDO::PARAM_INT);
$query->bindValue(':newName', $value);
$query->bindValue(':newName2', $value);
$query->bindValue(':id', $page->id, \PDO::PARAM_INT);
try {
$query->execute();
$row = $query->fetch(\PDO::FETCH_ASSOC);
if($row) {
$isValid = false;
if($errorTarget) $errorTarget->error(sprintf(
$this->_('A sibling page (id=%1$d) is already using name "%2$s" for language: %3$s'),
$row['id'], $value, $language->get('title|name')
));
}
} catch(\Exception $e) {
$this->error($e->getMessage());
$isValid = false;
}
$query->closeCursor();
return $isValid;
}
/**
* Hook into PageFinder::getQuery to add language status check
*