Перейти к содержанию
Опубликовано
  • Администраторы

Недавно на форуме возникла ошибка следующего вида:

/* Текст ошибкиs */
TypeError: iterator_to_array(): Argument #1 ($iterator) must be of type Traversable|array, int given (0)

#0 /applications/core/modules/front/members/profile.php(375): iterator_to_array(0)

#1 /system/Dispatcher/Controller.php(139): IPS\core\modules\front\members\profile->manage()

#2 /applications/core/modules/front/members/profile.php(130): IPS\Dispatcher\Controller->execute()

#3 /system/Dispatcher/Dispatcher.php(169): IPS\core\modules\front\members\profile->execute()

#4 /index.php(16): IPS\Dispatcher->run()

#5 {main}

Обратная трассировка

#0 /init.php(827): IPS\Log::log('TypeError: iter...', 'uncaught_except...')

#1 [internal function]: IPS\IPS::exceptionHandler(Object(TypeError))

#2 {main}

Ошибка появляется в коде на строке 375 файла profile.php, в частности, в следующем фрагменте:

/* Get followers */
		$followers = iterator_to_array(
			$this->member->followers( ( Member::loggedIn()->isAdmin() OR Member::loggedIn()->member_id === $this->member->member_id ) ? \IPS\Content::FOLLOW_PUBLIC + \IPS\Content::FOLLOW_ANONYMOUS : \IPS\Content::FOLLOW_PUBLIC, array( 'immediate', 'daily', 'weekly', 'none' ), NULL, array( 0, 12 ) )
		);

Причина возникновения ошибки

Ошибка возникает из-за того, что метод followers() возвращает целое число (0), вместо ожидаемого итератора или массива. Это может происходить, если у пользователя запрещены подписки, и метод не находит подписчиков. При попытке передать это число в функцию iterator_to_array(), которая ожидает итератор, возникает ошибка.

Если быть более конкретным, то ошибка возникает на страницах тех пользователей, которые запретили на себя подписываться.

image.png

Шаги по исправлению

Для решения данной проблемы можно добавить проверку результата метода followers() перед вызовом iterator_to_array(). Вот как можно переписать этот фрагмент кода:

/* Get followers */
		$followersResult = $this->member->followers(
			(Member::loggedIn()->isAdmin() OR Member::loggedIn()->member_id === $this->member->member_id)
			? \IPS\Content::FOLLOW_PUBLIC + \IPS\Content::FOLLOW_ANONYMOUS
			: \IPS\Content::FOLLOW_PUBLIC, 
			array('immediate', 'daily', 'weekly', 'none'), 
			NULL, 
			array(0, 12)
		);
		
		if (is_iterable($followersResult)) {
			$followers = iterator_to_array($followersResult);
		} else {
			$followers = [];
		}

Объяснение исправлений

  1. Проверка на итерабельность: Перед передачей результата в iterator_to_array(), добавлена проверка is_iterable($followersResult). Это предотвращает возникновение ошибки, если метод followers() возвращает что-то, что не является итератором или массивом.

  2. Инициализация переменной $followers: Если результат не является итерабельным, переменная $followers инициализируется как пустой массив. Это гарантирует, что код не приведет к ошибкам в дальнейшем, если подписчиков нет.

Заключение

Данное изменение позволяет избежать ошибки TypeError при отсутствии подписчиков и улучшает стабильность работы вашего сайта на платформе Invision Community. Если после внесения изменений ошибка продолжает возникать, рекомендуется проверить логи сервера и другие возможные конфликты с кодом или настройками.

Если у вас есть вопросы или требуется дополнительная помощь, не стесняйтесь обращаться на форум!

Изменено пользователем Ryancoolround
Добавил пример. (смотреть историю редактирования)

Рекомендуемые сообщения

Для публикации сообщений создайте учётную запись или авторизуйтесь

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу