14 июля 2012 г.

Ещё несколько поправок к AdsManager 2.6.5

   В ходе работы с компонентом AdsManager версии 2.6.5 нахожу и устраняю маленькие недостатки. Сегодня хочу рассказать о трёх таких недостатках, подробнее в них разобраться и привести примеры решения. Итак, поехали.

   Для меня осталось загадкой, почему разработчики AdsManager решили отправлять извещения о новых объявлениях и о продлении старых объявлений на E-mail, указанный в настройках Joomla! в поле "От кого". Для меня это несло определённые трудности, а ведь эти уведомления - штука нужная. Не копаясь в общих переменных Joomla!, нашёл более подходящий мне выход из этой ситуации.

   Идём в папку с компонентом, открываем для редактирования файл controller.php и ищем этот участок кода:
if ((($conf->send_email_on_new == 1)&&($isUpdateMode == 0))||
    (($conf->send_email_on_update == 1)&&($isUpdateMode == 1)))
{
    $config    = &JFactory::getConfig();
    $from        = $config->getValue('mailfrom');
    $fromname    = $config->getValue('fromname');

    $body = JRequest::getVar("ad_text", "" );
    $body = str_replace(array("\r\n", "\n", "\r"), "<br />", $body);

    $subject = JRequest::getVar("ad_headline", "" );
    if( $isUpdateMode == 1)
        $subject = JText::_('ADSMANAGER_EMAIL_UPDATE')." ".$subject;
    else
        $subject = JText::_('ADSMANAGER_EMAIL_NEW')." ".$subject;

    // Send the e-mail to Administrator
    if (!JUtility::sendMail($from, $fromname, $from, $subject, $body))
    {
        $this->setError(JText::_('ADSMANAGER_ERROR_SENDING_MAIL'));
        return false;
    }
}
   Создаём переменную $tonotice (можно выбрать и другое имя) и присваиваем ей значение, в котором укажем нужный нам адрес или несколько адресов (через запятую и пробел) электронной почты, а также даём знать скрипту, что нужно использовать значение этой переменной. В результате у нас должен получиться такой участок кода:
if ((($conf->send_email_on_new == 1)&&($isUpdateMode == 0))||
    (($conf->send_email_on_update == 1)&&($isUpdateMode == 1)))
{
    $config    = &JFactory::getConfig();
    $from        = $config->getValue('mailfrom');
    $fromname    = $config->getValue('fromname');
    $tonotice        = 'notice@site.ru';

    $body = JText::_('ADSMANAGER_EMAIL_NEWBODY');

    $subject = JRequest::getVar("ad_headline", "" );
    if( $isUpdateMode == 1)
        $subject = JText::_('ADSMANAGER_EMAIL_UPDATE')." ".$subject;
    else
        $subject = JText::_('ADSMANAGER_EMAIL_NEWHEAD')." ".$subject;

    // Send the e-mail to Administrator
    if (!JUtility::sendMail($from, $fromname, $tonotice, $subject, $body))
    {
        $this->setError(JText::_('ADSMANAGER_ERROR_SENDING_MAIL'));
        return false;
    }
}
   Можно, в принципе, поиграться с переменными и настроить компонент таким образом, чтобы в поле "Кому" копировался тот E-mail, что указан в профиле администратора. У меня для извещений создан специальный E-mail, поэтому проще было сделать так. Во всяком случае, это абсолютно ни на что, кроме как на поле "Кому", не влияет, поэтому можете делать так же даже в том случае, если собираетесь отправлять извещения на E-mail администратора.


   В немодифицированной версии компонента AdsManager 2.6.5 пользователю необходимо быть авторизованным на сайте, чтобы продлить срок размещения своего объявления. Как следствие, если пользователь не зарегистрирован, то ему придётся это сделать, чтобы воспользоваться функцией продления. На мой взгляд, это очень глупо, ведь многие не регистрируются перед подачей объявления, поэтому лезем в недры компонента, чтобы исправить недоразумение.

   Открываем для редактирования файл site.ru/components/com_adsmanager/views/expiration/view.html.php и находим в нём строки
if ($user->id == 0) {
    $return = base64_encode(JRoute::_("index.php?option=com_adsmanager&view=expiration&id=$contentid&Itemid=".$this->get("Itemid")));
    $app->redirect( "index.php?option=com_user&view=login&return=$return","");   
}
необходимо удалить или закомментировать их. Например, так:
//if ($user->id == 0) {
    //$return = base64_encode(JRoute::_("index.php?option=com_adsmanager&view=expiration&id=$contentid&Itemid=".$this->get("Itemid")));
    //$app->redirect( "index.php?option=com_user&view=login&return=$return","");   
//}
   В результате незарегистрированный пользователь, который получил уведомление об окончании срока размещения объявления, сможет продлить его. Правда, продлить объявление смогут и те, кто коим-то образом попал на страницу продления.


   Также была обнаружена и другая проблема, которая, судя по форумам о Joomla!, не давала покоя не только мне: при продлении срока размещения объявления оно получает сегодняшнюю дату, но время устанавливается как 00:00. В связи с этим объявление оказывается в списке ниже всех тех, которые были добавлены сегодня. Хотелось сделать так, чтобы время (часы, минуты и секунды) тоже менялось.

   В файле /administrator/compontents/com_adsmanager/models/content.php ищем функцию renewContent($contentid,$ad_duration) и в ней следующую строчку
$this->_db->setQuery( "UPDATE #__adsmanager_ads SET expiration_date = '$newdate', date_created = CURDATE(),recall_mail_sent=0,published=1 WHERE id=".(int)$contentid." and recall_mail_sent = 1");
Корректируем запрос к базе данных. Нужно заменить "date_created = CURDATE()" на "date_created = NOW()". То есть, в итоге мы должны получить строчку вида
$this->_db->setQuery( "UPDATE #__adsmanager_ads SET expiration_date = '$newdate', date_created = NOW(),recall_mail_sent=0,published=1 WHERE id=".(int)$contentid." and recall_mail_sent = 1");
   Таким образом, при обновлении объявления или при продлении срока размещения дата создания будет выглядеть уже не как "2012-07-15 00:00", а как "2012-07-15 14:58:16". При этом объявление будет первым в списке даже в том случае, если в этот день уже подавались объявления. Так будет до тех пор, пока кто-то не разместит объявление позже момента обновления даты.


   На этом, пока что, всё. Если будут какие-либо замечания или предложения по оптимизации приведённых в примерах участков кодов, с радостью рассмотрю их и подредактирую сообщение :)

2 комментария:

  1. Здравствуйте !

    Этот вариант не работает в версии Adsmanager 3.0.4


    Если есть решение для Adsmanager 3.0.4, буду признателен

    ОтветитьУдалить
  2. Спасибо! Тоже напрягало, что время ставилось 00 00. Ваш вариант сработал

    ОтветитьУдалить