Hi folks
My scenario: I create an article, and using afterstore I create a single article menu item to point to it (good for nice urls).
I have this working nicely, but I wanted to alter the menu item's title, alias, and meta description if I ever changed the articles title.
// Get article Title.
$artTitle = $fields['art_title']->value; // value could be 'Hey There'
// Create an Alias,
$artAlias = JFilterOutput::stringURLSafe($artTitle); // value would become 'hey-there'
$artId = $fields['art_id']->value;
// Find correct menu item based on menu link
$artMenuLink = 'index.php?option=com_content&view=article&id=' . $artId;
// get Menu Info
$dbMenu = JFactory::getDbo();
$queryMenu = $dbMenu->getQuery(true);
$queryMenu
->select(array('id', 'title', 'params'))
->from($dbMenu->quoteName('#__menu'))
->where($dbMenu->quoteName('link') . ' LIKE '. $dbMenu->quote($artMenuLink));
$dbMenu->setQuery($queryMenu);
$menuResult = $dbMenu->loadObject();
$menuId = $menuResult->id;
$menuTitle = $menuResult->title;
$menuParams = $menuResult->params;
// turn the $menuParams in to an array
$menuParamsArray = json_decode($menuParams, true); // true makes it an array, rather than an object
// if menu title is different to article title
if ($menuTitle != $artTitle) {
// update with the new title
$menuTitle = $artTitle;
$menuAlias = $artAlias;
$menuMetaDesc = 'Fretroom Lesson File: '.$artTitle;
// update relevant part of array
$menuParamsArray['menu-meta_description'] = $menuMetaDesc;
$menuParamsString = '';
$menuParamsArrayLength = count($menuParamsArray);
// create the string to be stored in params
foreach($menuParamsArray as $menuk => $menuv) {
for($i=1;$i<$menuParamsArrayLength;$i++) {
$menuParamsString .= '"'.$menuk.'":"'.$menuv.'",';
}
// The last entry must NOT have a trailing ','
for($i=1;$i==$menuParamsArrayLength;$i++) {
$menuParamsString .= '"'.$menuk.'":"'.$menuv.'"';
}
}
$menuParams = '{'.$menuParamsString.'}';
$queryMenu2 = $dbMenu->getQuery(true);
// Fields to update.
$menuFields = array(
$dbMenu->quoteName('title') . ' = ' . $dbMenu->quote($artTitle),
$dbMenu->quoteName('alias') . ' = ' . $dbMenu->quote($artTitle),
$dbMenu->quoteName('params') . ' = ' . $dbMenu->quote($menuParams)
);
// Conditions for which records should be updated.
$menuConditions = array(
$dbMenu->quoteName('id') . ' = ' . $dbMenu->quote($menuId)
);
$queryMenu2->update($dbMenu->quoteName('#__menu'))->set($menuFields)->where($menuConditions);
$dbMenu->setQuery($queryMenu2);
$menuComplete = $dbMenu->execute();
}