Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Создание уведомлений в расширениях

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Создание уведомлений в расширениях

Сообщение rxu »

Внимание: процесс миграции расширений, использующих уведомления, на phpBB 3.2 описан в теме: [3.2] Миграция уведомлений
  • Внести изменения в services.yml, добавив сервис нового типа уведомления. Наименование сервиса должно иметь формат (начиная с phpBB 3.1.0-RC4, в более ранних версиях часть <vendor>.<extension>. не разрешалась)

    Код: Выделить всё

    <vendor>.<extension>.notification.type.something
    а его определение должно включать в себя обязательный тег

    Код: Выделить всё

            tags:
                - { name: notification.type }
    
    Например:

    Код: Выделить всё

        gfksx.ThanksForPosts.notification.type.thanks:
            class: gfksx\ThanksForPosts\notification\thanks
            scope: prototype # scope MUST be prototype for this to work!
            arguments:
                - @user_loader
                - @dbal.conn
                - @cache.driver
                - @user
                - @auth
                - @config
                - %core.root_path%
                - %core.php_ext%
                - %tables.notification_types%
                - %tables.notifications%
                - %tables.user_notifications%
            tags:
                - { name: notification.type }
    
  • Создать файл нового типа уведомления. Файлы должны располагаться в папке ext/<vendor>/<ext_name>/notification.
    В данном случае, файл называется thanks.php. Объявленный в файле уведомления класс расширяет базовый класс уведомлений \phpbb\notification\type\base. Пример:

    Код: Выделить всё

    /**
    * Thanks for posts notifications class
    * This class handles notifying users when they have been thanked for a post
    */
    
    class thanks extends \phpbb\notification\type\base
    {
    
    Файл содержит ряд свойств и функций, необходимых для создания уведомления:
    1. Функция, возвращающая тип уведомления, в данном случае это 'thanks' - по имени файла и класса уведомления.

      Код: Выделить всё

      	public function get_type()
      	{
      		return 'thanks';
      	}
      
      
    2. Свойство, определяющее языковую переменную для создания уведомления - protected $language_key.

      Код: Выделить всё

      protected $language_key = 'NOTIFICATION_THANKS';
      и сама переменная

      Код: Выделить всё

      'NOTIFICATION_THANKS'		=> '<strong>Благодарность</strong> от пользователя %1$s за сообщение:',
    3. Свойство, определяющее место настройки нового уведомления на странице настроек уведомлений в личном разделе - public static $notification_option. Используются ключи 'id', 'lang', и 'group'.
      Удобство представляет использование двух последних ключей, которые имеют следующий смысл:
      'group' - группа настроек, в которой будет расположена настройка нового расширения, представляет из себя ключ соответствующей имени этой группы языковой переменной. Например:

      Код: Выделить всё

      'group'	=> 'NOTIFICATION_GROUP_MISCELLANEOUS',
      значение которой

      Код: Выделить всё

      'NOTIFICATION_GROUP_MISCELLANEOUS'					=> 'Прочие уведомления',
      'lang' - непосредственно заголовок (имя) новой настройки. Например:

      Код: Выделить всё

      'lang'	=> 'NOTIFICATION_TYPE_THANKS',
      значение которой будет

      Код: Выделить всё

      'NOTIFICATION_TYPE_THANKS'	=> 'Вас поблагодарили за сообщение',
      Конечный результат:

      Код: Выделить всё

      	public static $notification_option = array(
      		'lang'	=> 'NOTIFICATION_TYPE_THANKS',
      		'group'	=> 'NOTIFICATION_GROUP_MISCELLANEOUS',
      	);
      
    4. Функция, определяющая условия, при которых данное уведомление доступно. В случае, если оно доступно всегда:

      Код: Выделить всё

      	public function is_available()
      	{
      		return true;
      	}
      
    5. Функция, возвращающая идентификатор основного элемента item_id. Оно будет записано в поле item_id таблицы уведомлений в БД. Обратите внимание, что если уведомление с данным item_id уже имеется, другие уведомления с тем же Item_id добавлены не будут. Пример:

      Код: Выделить всё

      	/**
      	* Get the id of the item
      	*
      	* @param array $thanks_data The data from the thank
      	*/
      	public static function get_item_id($thanks_data)
      	{
      		return (int) $thanks_data['post_id'];
      	}
      
      
      В данном случае, за основной идентификатор выбран id сообщения, за которое выдана благодарность. В общем случае, может быть выбрано любое целое значение (идентификатор любого имеющего для контекста смысл элемента, задействованного в коде, где будет обрабатываться создание уведомления).
    6. Функция, возвращающая идентификатор родительского элемента, по отношению к item_id - item_parent_id. Например, идентификатор темы по отношению к идентификатору сообщения в данной теме, и т.п. Пример:

      Код: Выделить всё

      	/**
      	* Get the id of the parent
      	*
      	* @param array $thanks_data The data from the thank
      	*/
      	public static function get_item_parent_id($thanks_data)
      	{
      		return (int) $thanks_data['topic_id'];
      	}
      
      
    7. Функция, отбирающая массив с идентификаторами пользователей, которым должно поступить уведомление. Массив должен быть передан функции check_user_notification_options() для формирования данных о видах уведомлений, которые должны быть направлены пользователям из данного списка. Пример:

      Код: Выделить всё

      	/**
      	* Find the users who want to receive notifications
      	*
      	* @param array $thanks_data The data from the thank
      	* @param array $options Options for finding users for notification
      	*
      	* @return array
      	*/
      	public function find_users_for_notification($thanks_data, $options = array())
      	{
      		$options = array_merge(array(
      			'ignore_users'		=> array(),
      		), $options);
      
      		$users = array((int) $thanks_data['poster_id']);
      
      		return $this->check_user_notification_options($users, $options);
      	}
      
      В общем случае, не имеет значение, каким образом получен массив идентификаторов пользователей - всё зависит от конкретных обстоятельств, учитываемых в работе расширения. Например, идентификаторы могут быть отобраны по определенным условиям из базы данных.
    8. Функция, возвращающая аватар пользователя. Пример:

      Код: Выделить всё

      	/**
      	* Get the user's avatar
      	*/
      	public function get_avatar()
      	{
      		return $this->user_loader->get_avatar($this->get_data('user_id'));
      	}
      
      В данном случае для получения идентификатора пользователя использован метод get_data(). Обратите внимание, что данный метод предназначен для получения данных, предварительно записанных в БД через метод create_insert_array() (см. ниже). Т.е. определенный необходимый для уведомления набор данных должен быть сохранен в БД (в сериализованном виде).
    9. Функция, создающая заголовок уведомления - например, "Получена благодарность от пользователя rxu за сообщение:", после которого может следовать заголовок сообщения, за которое получена благодарность (создание последнего будет пояснено ниже). Пример:

      Код: Выделить всё

      	/**
      	* Get the HTML formatted title of this notification
      	*
      	* @return string
      	*/
      	public function get_title()
      	{
      		$username = $this->user_loader->get_username($this->get_data('user_id'), 'no_profile');
      
      		return $this->user->lang($this->language_key . '_' . $this->get_data('lang_act'), $username);
      	}
      
      Обратите внимание, что здесь использовано описанное выше свойство $language_key - языковая переменная класса.
    10. Функция, возвращающая список идентификаторов пользователей (user_id) для последующей загрузки в класс данных указанных пользователей, необходимых для работы уведомления. Загрузка происходит при помощи класса user_loader(). Пример:

      Код: Выделить всё

      	/**
      	* Users needed to query before this notification can be displayed
      	*
      	* @return array Array of user_ids
      	*/
      	public function users_to_query()
      	{
      		$thankers = $this->get_data('thankers');
      		$users = array(
      			$this->get_data('user_id'),
      		);
      
      		if (is_array($thankers))
      		{
      			foreach ($thankers as $thanker)
      			{
      				$users[] = $thanker['user_id'];
      			}
      		}
      
      		return $users;
      	}
    11. Функция, формирующая ссылку для перехода при клике на уведомлении. Пример:

      Код: Выделить всё

      	/**
      	* Get the url to this item
      	*
      	* @return string URL
      	*/
      	public function get_url()
      	{
      		return append_sid($this->phpbb_root_path . 'viewtopic.' . $this->php_ext, "p={$this->item_id}#p{$this->item_id}");
      	}
      
    12. Функция, возвращающая ссылку для использования при клике на уведомление. Использует выше описанный метод get_url(). Пример:

      Код: Выделить всё

      	public function get_redirect_url()
      	{
      		return $this->get_url();
      	}
      
    13. Функция, определяющая шаблон email для отправки уведомления. Пример:

      Код: Выделить всё

      	/**
      	* Get email template
      	*
      	* @return string|bool
      	*/
      	public function get_email_template()
      	{
      		return '@gfksx_ThanksForPosts/user_thanks';
      	}
      
    14. Функция, возвращающая строку, расположенную под заголовком уведомления (например, после "Получена благодарность от пользователя rxu за сообщение:"), например, заголовок темы или сообщения. В результате получается конструкция вида Получена благодарность от пользователя rxu за сообщение: "Re: Test TFP notifications".
      В данном случае "Re: Test TFP notifications" - результат работы этой функции. Пример:

      Код: Выделить всё

      	/**
      	* Get the HTML formatted reference of the notification
      	*
      	* @return string
      	*/
      	public function get_reference()
      	{
      		return $this->user->lang(
      			'NOTIFICATION_REFERENCE',
      			censor_text($this->get_data('post_subject'))
      		);
      	}
      
    15. Функция, возвращающая массив для присвоения значений переменным шаблона email. Пример:

      Код: Выделить всё

      	/**
      	* Get email template variables
      	*
      	* @return array
      	*/
      	public function get_email_template_variables()
      	{
      		$user_data = $this->user_loader->get_user($this->get_data('poster_id'));
      
      		return array(
      				'THANKS_SUBG'	=> htmlspecialchars_decode($this->user->lang['GRATITUDES']),
      				'USERNAME'		=> htmlspecialchars_decode($this->user->data['username']),
      				'POST_THANKS'	=> htmlspecialchars_decode($this->user->lang['THANKS_PM_MES_'. $this->get_data('lang_act')]),
      				'U_POST_THANKS'	=> generate_board_url() . '/viewtopic.' . $this->php_ext . "?p={$this->item_id}#p{$this->item_id}",
      		);
      	}
      
      Об использовании шаблонов email в расширениях см. тему http://anderson.phpbbguru.net/viewtopic.php?f=5&t=73
    16. Функция, предназначенная для записи в БД в (в сериализованном виде) регулярно необходимых для вывода уведомления данных. перечень таких данных определяется исходя из конкретных обстоятельств, но обязательно должны записываться значения, получаемые методом get_data()/ Пример:

      Код: Выделить всё

      	/**
      	* Function for preparing the data for insertion in an SQL query
      	* (The service handles insertion)
      	*
      	* @param array $thanks_data Data from insert_thanks
      	* @param array $pre_create_data Data from pre_create_insert_array()
      	*
      	* @return array Array of data ready to be inserted into the database
      	*/
      	public function create_insert_array($thanks_data, $pre_create_data = array())
      	{
      		$this->set_data('user_id', $thanks_data['user_id']);
      		$this->set_data('post_id', $thanks_data['post_id']);
      		$this->set_data('lang_act', $thanks_data['lang_act']);
      		$this->set_data('post_subject', $thanks_data['post_subject']);
      
      		return parent::create_insert_array($thanks_data, $pre_create_data);
      	}
      
    17. Свойство в виде массива, содержащее необходимые данные для создания уведомления, в т.ч. и те, которые должны быть записаны в БД, передается во внешнем скрипте как параметр функции add_notifications(). В ланном конкретном примере - это массив $thanks_data. Пример:

      Код: Выделить всё

      					$thanks_data = array(
      						'user_id'	=> (int) $this->user->data['user_id'],
      						'post_id'	=> $post_id,
      						'poster_id'	=> $to_id,
      						'topic_id'	=> (int) $row['topic_id'],
      						'forum_id'	=> (int) $row['forum_id'],
      						'thanks_time'	=> time(),
      						'username'	=> $this->user->data['username'],
      						'lang_act'	=> $lang_act,
      						'post_subject'	=> $row['post_subject'],
      					);
      
  • Обработать создание уведомления во внешнем скрипте. Пример:

    Код: Выделить всё

    					$thanks_data = array(
    						'user_id'	=> (int) $this->user->data['user_id'],
    						'post_id'	=> $post_id,
    						'poster_id'	=> $to_id,
    						'topic_id'	=> (int) $row['topic_id'],
    						'forum_id'	=> (int) $row['forum_id'],
    						'thanks_time'	=> time(),
    						'username'	=> $this->user->data['username'],
    						'lang_act'	=> $lang_act,
    						'post_subject'	=> $row['post_subject'],
    					);
    
    					$this->notification_manager->add_notifications(array(
    						'thanks',
    					), $thanks_data);
    
    Очевидно, что для этого сначала необходимо сделать инжекцию зависимости класса менеджера уведомлений.
    В services.yml:

    Код: Выделить всё

                - @notification_manager
    В конструкторе класса слушателя:

    Код: Выделить всё

    \phpbb\notification\manager $notification_manager
    с последующим присвоением (имя переменной может быть произвольным)

    Код: Выделить всё

    $this->notification_manager = $notification_manager;
  • ВАЖНО! В файл ext.php необходимо добавить инструкции по включению, выключению, удалению уведомлений вместе с расширением, во избежание возникновения неисправимых обычными средствами админраздела ошибок, связанных с отсутствием соответствующих сервисов для работы добавленных уведомлений. Пример можно увидеть в файле ext.php расширения Board rules.
Пример расширения с уведомлениями: Thanks for posts.
Патч, которым в данное расширение добавлены уведомления: #1b61df0f8.
Изображение
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Sheer »

rxu писал(а):Функция, определяющая условия, при которых данное уведомление доступно.
Я бы добавил, что доступно не для отправки уведомления, а в списке доступных для пользователя уведомлений в Личном разделе -->Личные настройки-->Изменить настройки уведомлений
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 7 месяцев
Откуда: Израиль
Благодарил (а): 85 раз
Поблагодарили: 305 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Алг »

Я начала осваивать уведомления, достаточно много времени на это убила, чтобы понять, что мало что понимаю. Хотя уведомления создаются. Но!
1. Когда пользователь открывает уведомление, оно должно становиться прочитанным? Если не должно по дефолту, то как это сделать?

2. Языковые переменные: Задаю стандартно

Код: Выделить всё

	public static $notification_option = array(
		'lang'	=> 'NOTIFICATION_TYPE_COMMANDGAME',
		'group'	=> 'NOTIFICATION_GROUP_MISCELLANEOUS',
	);
В языковом файле определяю переменную

Код: Выделить всё

	'NOTIFICATION_TYPE_COMMANDGAME' => 'Информация о турнире',
Захожу в личный кабинет, настройки уведомлений - переменная не подхватилась
picUcp.png
3. Проблема заголовка (Title) уведомления, тут ещё интереснее

Есть игровой форум и юзер - капитан команды. Когда он делает какое-то действие, он должен оповестить всех членов команды, себя в том числе
В языковом файле определена переменная

Код: Выделить всё

    'NOTIFICATION_COMMANDGAME'					=> 'Команда <b>%s</b>! ',
В классе уведомлений определено

Код: Выделить всё

	protected $language_key = 'NOTIFICATION_COMMANDGAME';
и функция:

Код: Выделить всё

       $txt = $this->user->lang($this->language_key, $this->get_data('team_forum_name') );
       $action_id =  $this->get_data('action_id') ;
       if ($action_id == commandgame::TEAMCHANGESTARTTIME)
       {
            $team_start_time_new = $this->get_data('team_start_time_new');
            $txt .= $this->user->format_date($team_start_time_new , "d/m/Y H:i");
       }
        return $txt;
    }
, т.е. беру эту переменную и присоединяю ещё некоторые данные. В результате капитан получил уведомление
picCapNoty.png
, а члены команды
picGamer.png
Как такое ппроизошло?
Заодно, на картинке видно, что в уведомлении спасибок не загружаются аватары

Важно отметить( хотя не знаю насколько важно), что уведомления создаются не на стандартных страницах, а на кастомных
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Sheer »

Попробуй вместо

Код: Выделить всё

$txt = $this->user->lang($this->language_key, $this->get_data('team_forum_name') );
так

Код: Выделить всё

$txt = $this->user->lang($this->user->lang('NOTIFICATION_TYPE_COMMANDGAME', $this->get_data('team_forum_name'));
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение rxu »

Алг писал(а):Захожу в личный кабинет, настройки уведомлений - переменная не подхватилась
Ну, значит в ucp этот языковой файл не подключен.
Изображение
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 7 месяцев
Откуда: Израиль
Благодарил (а): 85 раз
Поблагодарили: 305 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Алг »

да, с подключением языкового файла обе проблемы решились. Но почему автор уведомления получал переменную, а уведомитель нет, так и осталось загадкой

Добавлено спустя 14 минут 57 секунд:
остался вопрос 1. Уведомление становится прочитанным, когда юзер нажимает на ссылку в нём. А оно все является ссылкой Я бы хотела, чтобы уведомление стало прочитанным, когда юзер его открыл
есть переменная $this->notification_read, надо найти функцию, которая срабатывает при открытии уведомления и в ней вставить

Код: Выделить всё

$this->notification_read = true
Или не стоит этого делать?
и ещё вопрос: уведомления должны приходить, как лс, в режиме онлайн? я как-то не заметила, я их вижу только после обновления страницы. А чем больше частей страницы обновляются частично эджексом, там меньше шансов увидеть новое уведомление, так получается
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение rxu »

Алг писал(а):Но почему автор уведомления получал переменную, а уведомитель нет, так и осталось загадкой
Скорее всего, та же причина - для данных юзеров языковой файл с этой переменной не подключается почему-то.
Изображение
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 7 месяцев
Откуда: Израиль
Благодарил (а): 85 раз
Поблагодарили: 305 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Алг »

rxu писал(а):Ну, значит в ucp этот языковой файл не подключен.
помогло подключение языкового файла на событие

Код: Выделить всё

			'core.user_setup'					=>	'load_language_on_setup',

Код: Выделить всё

	public function load_language_on_setup($event)
	{
		$lang_set_ext = $event['lang_set_ext'];
		$lang_set_ext[] = array(
			'ext_name' => 'alg/suki',
			'lang_set' => 'suki',
		);
		$event['lang_set_ext'] = $lang_set_ext;
	}
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение rxu »

Алг писал(а):остался вопрос 1. Уведомление становится прочитанным, когда юзер нажимает на ссылку в нём. А оно все является ссылкой Я бы хотела, чтобы уведомление стало прочитанным, когда юзер его открыл
Можно посмотреть реализацию в спасибках. При переходе по ссылке с уведомления в тему, или просто в тему с сообщением из уведомления, используется событие 'core.viewtopic_modify_page_title' чтобы пометить уведомление прочитанным, см. https://github.com/rxu/thanks_for_posts ... #L242-L246
Изображение
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 7 месяцев
Откуда: Израиль
Благодарил (а): 85 раз
Поблагодарили: 305 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Алг »

Да, поняла, спасибо. И поняла почему при клике они становятся прочитанными( клик пока идёт на viewtopic) Но в спасибках проще, а по уведомлению из примера выше некуда особо переходить. Придётся думать
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение rxu »

Алг писал(а):уведомления должны приходить, как лс, в режиме онлайн?
Вообще-то да. Плюс на емайл могут.

Добавлено спустя 49 секунд:
Алг писал(а):по уведомлению из примера выше некуда особо переходить. Придётся думать
Ну оно станет прочитанным, если навести на него мышь и щелкнуть появившуюся справа галку.
Изображение
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 7 месяцев
Откуда: Израиль
Благодарил (а): 85 раз
Поблагодарили: 305 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Алг »

да, точно, галка есть, думать не надо
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение Sheer »

Намедни столкнулся с проблемой, которую считаю багом phpBB3.1.
Суть такова. Есть расширение, использующее уведомления, скажем есть три типа кастомных уведомлений.
Был установлен форум с нуля, сразу же установлено и включено расширение, после чего была проверена его работоспособность. Уведомления пришли, все как бы отработало нормально. Но при переходе в Личный раздел - Личные настройки - Изменить настройки уведомленийвывалилось сообщение об ошибке:

Код: Выделить всё

Duplicate entry 'notifications.type.disapprove_post' for key type (1062)
SQL
INSERT INTO phpbb_notifications_types (notification_type_name, notification_type_enabled) VALUES ('notifications.type.disapprove_post', 1)
Причиной явлилось то, что после установки таблица notifications_types не заполняется начальными данными, то есть она пуста и записи в нее осуществляются, так сказать, по мере поступления событий. Например, зашел в Личный раздел администратор, обладающий всеми правами - таблица заполнилась всеми стандартными типами (их 18). Отработало первый раз расширение - кастомные типы добавились в таблицу.
В описанном случае сначала в таблицу были занесены кастомные типы (их идентификаторы были 1, 2 и 3 соответственно), а уже потом было осуществлена попытка записать в таблицу "стандартный" тип с идентификатором 3.
После очистки таблицы и перехода в Личный раздел - Личные настройки - Изменить настройки уведомлений все встало на место, то есть таблица была заполнена "стандартными" типами со своими "родными" идентификаторами, после запуска скрипта от расширения были добавлены кастомные типы в конец таблицы.

Ну в общем с этим явлением надо бороться.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение rxu »

Т.к. на чистой установке проблемы нет, то давайте сначала посмотрим на код этого расширения.
Sheer писал(а):В описанном случае сначала в таблицу были занесены кастомные типы (их идентификаторы были 1, 2 и 3 соответственно), а уже потом было осуществлена попытка записать в таблицу "стандартный" тип с идентификатором 3.
Идентификатор не может повторяться, т.к. поле notification_type_id имеет свойство auto_increment.
Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Создание уведомлений в расширениях

Сообщение rxu »

Попробовал повторить: очистил таблицу типов уведомлений, установил ThanksForPosts, появились 2 типа уведомлений от него. Зашел в личный раздел в настройки уведомлений - нет ошибки.
Изображение
Ответить

Вернуться в «Для разработчиков»