1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

Не работают оповещения (alert) в самописном дополнении

Тема в разделе "Модификации шаблонов", создана пользователем jhn, 05.05.2015.

Загрузка
  1. jhn

    jhn Новичок

    Регистрация:
    05.05.15
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.2.4
    Написал дополнение, добавил свои оповещения, но они как-то некорректно работают - счётчик оповещений показывает количество новых, но при открытии вкладки "оповещения" не отображает. Один раз заработало - стали отображаться, но только у одного пользователя, у другого всё также только счётчик. Подскажите где можно покопаться :)
    Делал по буржуйской инструкции: https://xenforo.com/community/threads/documentation-for-alerts.72923/ и https://xenforo.com/community/threads/custom-alerts.91382/

    Что я делал:
    Создал инсталлер
    PHP:
    class UsersBeer_Installer
    {
      public static function 
    uninstall()
       {
        foreach (
    self::getInsertData() AS $dataSql) { $db->query($dataSql); }
        
    XenForo_Model::create('XenForo_Model_ContentType')->rebuildContentTypeCache();
       }

      public static function 
    getInsertData()
       {
        
    $data = array();
        
    $data['xf_content_type'] = "INSERT IGNORE INTO xf_content_type (content_type, addon_id, fields) VALUES ('ubchange', 'UsersBeer', '')";
        
    $data['xf_content_type_field'] = "INSERT IGNORE INTO xf_content_type_field (content_type, field_name, field_value) VALUES ('ubchange', 'alert_handler_class', 'UsersBeer_AlertHandler_ubchange')";
        return 
    $data;
       }
    }
    Хендл для алерта:
    PHP:
    class UsersBeer_AlertHandler_ubchange extends XenForo_AlertHandler_Abstract
    {

      public function 
    getContentByIds(array $contentIds$model$userId, array $viewingUser)
       {
        foreach (
    $contentIds as $key => $contentId)
         {
          
    $main[$key] = $model->getModelFromCache('UsersBeer_Model_UBChange')->getUBC_main_4alert($contentId);
         }
          return 
    $main;
       }

    }
    Алерт вызываю корректно:
    Код:
        $alertModel = XenForo_Model::create('XenForo_Model_Alert');
        $alertModel->alert($beer['id_user'],$visitor['user_id'],$visitor['username'], 'ubchange', $beer['id_main'], 'status1');
    
    Ну и шаблон для каждого типа алерта:
    Код:
        <template title="alert_ubchange_status1" version_id="2" version_string="beta"><![CDATA[{xen:phrase ubchange_title}. {xen:helper username, $user, 'subject'}
    <xen:if is="{$user.gender} == 'male'"> сделал
    <xen:elseif is="{$user.gender} == 'female'"/> сделала
    <xen:else /> сделал(-а)
    </xen:if>
    заказ Вашего пива: <a href="{xen:link UBChange/Index, '', 'm={$content.id_main}'}" class="PopupItemLink">{$content.name}</a>]]></template>
    
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    А Вы установили свой аддон или нет? Если не устанавливали, то записи в нужные таблицы не добавятся, да и "rebuildContentTypeCache" не отработает, а потому поле fileds в таблице xf_content_type не обновится. Можно, конечно, его и вручную заполнить, но геморройно это. Поэтому для разработчиков полезен аддон Content Type Management. С помощью него можно быстро редактировать и перестраивать типы контента.
     
  3. jhn

    jhn Новичок

    Регистрация:
    05.05.15
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.2.4
    Конечно установил, причём как советовали буржуи, обновил пару раз.
    Поля в таблице xf_content_type прописываются, через phpmyadmin проверял...
    Причём проверял на двух разных ресурсах, один 1.2.4, второй 1.3.3.

    Уже всю голову сломал что может быть не так. В один момент (после чистки кеша пользователей) оповещения заработали (правда только после второго по счёту оповещения)! Но при переносе дополнения с тестового на рабочий ресурс - работать перестали :( И чистка кеша не помогает.
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Чистка кеша тут вообще не причем. Тут, наоборот, кеш перестраивается.
    Могу посоветовать только через отладку выяснять причины неработоспособности.
    --- добавлено : 5 май 2015 в 14:41 ---
    Регистр в названиях классов и именованиях файлов важен. У Вас точно все буквы совпадают?
     
    Последнее редактирование модератором: 13.05.2015
  5. jhn

    jhn Новичок

    Регистрация:
    05.05.15
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.2.4
    Проверял выполнение в AlertHandler - приходит массив $contentIds - формируется и отправляется массив с данными корректно. То есть до шаблона alert_* точно всё приходит и работает.

    регистры раза три уже перепроверял - всё совпадает :)

    может действительно не перестраивается кеш?
     
    Последнее редактирование модератором: 13.05.2015
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если хэндлер работает, значит ничего перестраивать точно не надо. То есть алерт сам по себе работает. Не отображается по какой-то причине само оповещение. Остается проверить только сам шаблон. Попробуйте самый простой шаблон типа "Привет". Если он отобразится, значит, просто где-то ошибка в шаблоне. Хотя Ваш шаблон вроде тоже не содержит никакого криминала. Ну в крайнем случае попробуйте добавить в хэндлер еще один метод:
    Код:
    protected function _getDefaultTemplateTitle($contentType, $action) {
      return parent::_getDefaultTemplateTitle($contentType, $action);
    }
    
    Соответственно, при отладке можно убедиться, что имя шаблона правильно формируется. Также это укажет на то, что происходит обращение к Вашему шаблону.

    Ну и пошаговую отладку никто не отменял. Хотя бы будет понятно, в какую сторону копать нужно.
     
    jhn нравится это.
  7. jhn

    jhn Новичок

    Регистрация:
    05.05.15
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.2.4
    Накопал что ошибка возникает в XenForo\Model\Alert.php, в функции _getContentForAlerts(array $data, $userId, array $viewingUser), на строчке if (!isset($fetchData[$item['content_type']][$item['content_id']])). Ошибка "Undefined offset: 9".
    Как я понимаю ругается на несуществующий contentid=9. Id, на который он ссылается в БД точно есть.

    ААА!!! разобрался!
    в AlertHandler в качестве ключа массива необходимо не alert_id передавать, а contentId. Заменил $main[$key] на $main[$contentId] и всё заработало.
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Только один нюанс. Если оповещений для одного пользователя будет слишком много, то будет сгенерирована куча запросов в базу данных. По идее лучше вытаскивать все одним запросом, а не через цикл дергать по одному запросу. Но, как говорится, на любителя, да и от степени нагруженности приложения зависит.
     

Поделиться этой страницей