php - SilverStripe unique URL (debug) -
in dataobject there user supplied field title has converted unique url slug.
desired result: duplicate url's should suffix value. saving 2 records title foo
should result in 1 record foo
value column url
, second record should have value foo-2
same column.
public function onbeforewrite() { parent::onbeforewrite(); // sanitize title field use url $filter = urlsegmentfilter::create(); $this->url = $filter->filter($this->title); // if url not unique, add suffix $i = 1; while($this->uniqueurl($this->url)) { $i++; $this->url = $this->url . "-" . $i; } }
method: uniqueurl (within same class)
public function uniqueurl($url) { // check if there record same url $existingurl = dataobject::get('newsarticle', "url = '$url'"); if ($existingurl) { // duplicate url return false; } else { // unique url return true; } }
saving foo
twice result in foo
, foo-2
.
when saving 2 records same title foo
results in 2 url fields foo
why have 2 foo
urls?
if check db before inserting records, means check not work on record batch.
don't use loop count unique urls
you don't need loop , check every time , increment count ($i
). performance wise youre far better off doing count()
in query , use value next insert.
// following same 1 query. no loop needed. $count = db::query("select count(*) table title '{$filteredtitle}'")->value(); if ($count > 1) { $filteredtitle .= "-" . $count; } $this->url = $filteredtitle
solutions
to onbeforewrite()
possibility query data , check records before saved.
or simpler solution same results can change url in onafterwrite()
, , check use amount of same titles number.
public function onafterwrite() { parent::onafterwrite(); // sanitize title field use url $filter = urlsegmentfilter::create(); $filteredtitle= $filter->filter($this->title); $count = db::query("select count(*) table title '{$filteredtitle}'")->value(); if ($count > 1) { $filteredtitle .= "-" . $count; } $this->url = $filteredtitle }
Comments
Post a Comment