I've added Router Features today to my Custom Component - all works finde beside the fact that the $pk variable inside the model holds a curios value (202n) where 'n' is different for each element...
Router:
public function __construct(SiteApplication $app, AbstractMenu $menu, CategoryFactoryInterface $categoryFactory, DatabaseInterface $db)
{
$this->categoryFactory = $categoryFactory;
$this->db = $db;
$params = ComponentHelper::getParams('com_marathonmanager');
$this->noIDs = (bool) $params->get('sef_ids');
$categories = new RouterViewConfiguration('categories');
$categories->setKey('id');
$this->registerView($categories);
$category = new RouterViewConfiguration('category');
$category->setKey('id')->setParent($categories, 'catid')->setNestable();
$this->registerView($category);
$events = new RouterViewConfiguration('events');
$events->setKey('id');
$this->registerView($events);
$event = new RouterViewConfiguration('event');
$event->setKey('id');
$this->registerView($event);
// $this->registerView(new RouterViewConfiguration('featured'));
$form = new RouterViewConfiguration('form');
$form->setKey('id');
$this->registerView($form);
parent::__construct($app, $menu);
$this->attachRule(new MenuRules($this));
$this->attachRule(new StandardRules($this));
$this->attachRule(new NomenuRules($this));
}
EventsNomenuRules:
*
* @var RouterView
* @since 3.4
*/
protected $router;
/**
* Class constructor.
*
* @param RouterView $router Router this rule belongs to
*
* @since 3.4
*/
public function __construct(RouterView $router)
{
$this->router = $router;
}
/**
* Dummymethod to fullfill the interface requirements
*
* @param array &$query The query array to process
*
* @return void
*
* @since 3.4
* @codeCoverageIgnore
*/
public function preprocess(&$query)
{
$test = 'Test';
}
/**
* Parse a menu-less URL
*
* @param array &$segments The URL segments to parse
* @param array &$vars The vars that result from the segments
*
* @return void
*
* @since 3.4
*/
public function parse(&$segments, &$vars)
{
// with this url: http://localhost/events/event-n/event-title.html
// segments: [[0] => event-n, [1] => event-title]
// vars: [[option] => com_marathonmanager, [view] => events, [id] => 0]
$vars['view'] = 'event';
$vars['id'] = substr($segments[0], strpos($segments[0], '-') + 1);
array_shift($segments);
array_shift($segments);
return;
}
/**
* Build a menu-less URL
*
* @param array &$query The vars that should be converted
* @param array &$segments The URL segments to create
*
* @return void
*
* @since 3.4
*/
public function build(&$query, &$segments)
{
// content of $query ($segments is empty or [[0] => mywalk-3])
// when called by the menu: [[option] => com_mywalks, [Itemid] => 126]
// when called by the component: [[option] => com_mywalks, [view] => mywalk, [id] => 1, [Itemid] => 126]
// when called from a module: [[option] => com_mywalks, [view] => mywalks, [format] => html, [Itemid] => 126]
// when called from breadcrumbs: [[option] => com_mywalks, [view] => mywalks, [Itemid] => 126]
// the url should look like this: /site-root/mywalks/walk-n/walk-title.html
// if the view is not mywalk - the single walk view
if (!isset($query['view']) || (isset($query['view']) && $query['view'] !== 'event') || isset($query['format']))
{
return;
}
$alias = $this->getAliasForEvent($query['id']);
error_log('alias: ' . var_export($alias, true));
if($alias){
$segments[] = $alias;
}else {
$segments[] = $query['view'] . '-' . $query['id'];
}
// the last part of the url may be missing
if (isset($query['slug'])) {
$segments[] = $query['slug'];
unset($query['slug']);
}
unset($query['view']);
unset($query['id']);
}
private function getAliasForEvent($id){
if(!is_numeric($id)){
return false;
}
$app = Factory::getApplication();
$db = Factory::getContainer()->get(DatabaseInterface::class);
$query = $db->getQuery(true);
try
{
$query->select($db->quoteName('alias'))
->from($db->quoteName('#__com_marathonmanager_events'))
->where($db->quoteName('id') . ' = :id')
->bind(':id', $id, ParameterType::INTEGER);
$db->setQuery($query);
$app->enqueueMessage('NICE', 'default');
return $db->loadResult();
}
catch (RuntimeException $e)
{
$app->enqueueMessage($e->getMessage(), 'error');
return false;
}
}
}
In Fact when turning off SEF the event item url looks so: https://joomla4.local:8890/index.php?option=com_marathonmanager&view=event&id=5&Itemid=1282 And if turned on: https://joomla4.local:8890/marathon-manager-items/simm-2020-st-antoenien
But in the Model:
...
public function getItem($pk = null): object|bool
{
$app = Factory::getApplication();
$pk = $app->input->getInt('id');
error_log('EventModel::getItem() called with id: ' . $pk);
if($this->_item === null)
{
$this->_item = array();
}
if(!isset($this->_item[$pk]))
{
...
When checking the $pk var in the model it brings up a 202x number -which i cannot identify because its NOT the item ID