I'm trying to develop a Joomla 4 component and I almost completed it, but I have issues to save an item when the Alias is not Unique.
In the database, I've set up this:
CREATE UNIQUE INDEX aliasindex
ON rwl35_rwlevents
(alias
);
In the Model (administrator/components/com_rwlevents/src/Model), I have this:
protected function prepareTable($table)
{
$date = Factory::getDate()->toSql();
$table->name = htmlspecialchars_decode($table->name, ENT_QUOTES);
$table->check();
$table->generateAlias();
}
Then, in the EventTable.php file, (/administrator/components/com_rwlevents/src/Table)
I have this code:
public function check()
{
try
{
parent::check();
}
catch (\Exception $e)
{
$this->setError($e->getMessage());
return false;
}
// Check the publish down date is not earlier than publish up.
if ($this->publish_down > $this->_db->getNullDate() && $this->publish_down < $this->publish_up) {
$this->setError(Text::_('JGLOBAL_START_PUBLISH_AFTER_FINISH'));
return false;
}
// Set publish_up, publish_down to null if not set
if (!$this->publish_up) {
$this->publish_up = null;
}
if (!$this->publish_down) {
$this->publish_down = null;
}
$this->alias = trim($this->alias);
if (empty($this->alias))
{
$this->alias = $this->name;
}
$this->alias = JFilterOutput::stringURLSafe($this->alias);
return true;
}
Then, In the same file, I have a function to generate the Alias:
public function generateAlias()
{
if (empty($this->alias))
{
$this->alias = $this->name;
}
$this->alias = ApplicationHelper::stringURLSafe($this->alias, $this->language);
if (trim(str_replace('-', '', $this->alias)) == '')
{
$this->alias = Factory::getDate()->format('Y-m-d-H-i-s');
}
return $this->alias;
}
But in the Admin, when I try to save an item with an Alias that already exists in the Database, I have:
Duplicate entry 'concert-au-3-arena' for key 'aliasindex'
How can I code this to say: "if this Alias already exists, then, do this..."?