Я создал страницу ошибки (404 страницы) для пропущенных URL. Это делается стандартным способом или файлом error.php в шаблоне.
Страница ошибок работает нормально, она правильно перенаправляет на статью Joomla. Моя проблема в том, что я хочу получить ссылку, по которой пользователь щелкнул по этой ссылке, а затем создал страницу 404. Моя идея заключалась в том, чтобы поместить некоторый код вверху страницы error.php, которая отправила мне по электронной почте пропущенную страницу:
<?php
defined('_JEXEC') or die;
$app = JFactory::getApplication();
$menu = $app->getMenu();
$menuItem = $menu->getItems( 'link', 'index.php?option=com_example&view=reporting', true );
$ref = JRoute::_('index.php?Itemid='.$menuItem->id);
$mailer = JFactory::getMailer();
$config = JFactory::getConfig();
$sender = array(
$config->getValue( 'config.mailfrom' ),
$config->getValue( 'config.fromname' ) );
$mailer->setSender($sender);
$recipient = array( '[email protected]' );
$mailer->addRecipient($recipient);
$body = "Missing page is ".$ref;
$mailer->setSubject('404 Error Generated by your site');
$mailer->setBody($body);
$send = $mailer->Send();
if ( $send !== true ) {
echo 'Error sending email: ' . $send->__toString();
} else {
echo 'Mail sent';
}
header("Location: http://www.domain.com/404-page.html"); /* Redirect browser */
exit();?>
Но я не могу получить идентификатор предмета. Я могу получить ссылающуюся страницу $ _SESSION [«origURL»] = $ _SERVER [«HTTP_REFERER»]; но это бесполезно, так как я ищу пропущенную страницу.
Есть идеи? Я задавался вопросом, нужно ли мне создавать переменную сеанса, которая обновляется каждый раз, когда нажимается какой-либо элемент меню, и получить к нему доступ, но это кажется немного чрезмерным.
Спасибо
Алан
Благодаря Дэвиду Т он указал мне правильное направление. Я перекодировал, и это сработало! Я добавил несколько комментариев к коду, так что, надеюсь, он поможет кому-то другому создавать страницы ошибок для Joomla 2.5 (еще не пробовал в 3.0)
Еще раз спасибо Дэвиду Т
Алан
<?php
defined('_JEXEC') or die;
//Get reffering Id
$referer = JURI::getInstance($_SERVER['HTTP_REFERER']);
$ref = $referer->hasVar('Itemid')?$referer->getVar('Itemid'):JSite::getMenu()->getActive()->id;
//Get the title and other menu details as needed form db
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query = "SELECT * FROM `#__menu` WHERE id = ".$ref."";
$db->setQuery( $query );
$results = $db->loadObjectList();
$holdingArray = array();
if(count($results)) {
foreach($results as $r) {
array_push ($holdingArray,$r->title,$r->menutype) ;
}
}
// Set up mailer and get site name and other details
$mailer = JFactory::getMailer();
$config = JFactory::getConfig();
$sender = array(
$config->getValue( 'config.mailfrom' ),
$config->getValue( 'config.fromname' ) );
$siteName = $config->getValue( 'config.sitename' );
$mailer->setSender($sender);
$recipient = array( '[email protected]' );
$mailer->addRecipient($recipient);
$body = "The menu item clicked was: ".$holdingArray[0]." which has id: ".$ref." which is in the the menu titled: ".$holdingArray[1];
$body .= "\n\rPlease note that sometimes the site isn't able to tell us accurately which menu item was clicked so this may prove to be wrong!";
$mailer->setSubject('404 Error Generated by '.$siteName.' website');
$mailer->setBody($body);
//send mail
$send = $mailer->Send();
//Finally redirect to error page
header("Location: http://www.yourdomain.com/404-page.html"); /* Redirect browser */
exit();?>
Других решений пока нет …