DANFA

Ошибки разработчиков (баги движка phpFOX)

После установки Load Comments via AJAX в true (настройки комментов: admincp/setting/edit/module-id_comment/), можем наблюдать такую ошибку - после перехода на страницу фотографии, которую вы лайкнули, кнопка Like будет отображаться, будто вы ее ещё не нажимали, а нажав на нее, получим сообщение:
You have already "liked" this feed.

При этом не будет отображаться ссылка пожаловаться на фотографию.

После установки Group Duplicate Feeds на 0 (настройки стены: admincp/setting/edit/module-id_feed/), под всеми каналами (постами) на стене исчезает кнопка Report (Жалоба).

Ошибки разработчиков (баги движка phpFOX)

Для исправления бага, открыть: module/feed/include/service/feed.class.php, найти:
                $aReturn['feed_month_year'] = date('m_Y', $aRow['feed_time_stamp']);

Выше вставить:
                if (isset($aRow['type_id']))
                {
                    $aModule = explode('_', $aRow['type_id']);
                    if (isset($aModule[0]) && Phpfox::isModule($aModule[0]) && Phpfox::hasCallback($aModule[0] . (isset($aModule[1]) ? '_' . $aModule[1] : ''), 'getReportRedirect'))
                    {
                        $aReturn['report_module'] = $aRows[$sKey]['report_module'] = $aModule[0] . (isset($aModule[1]) ? '_' . $aModule[1] : '');
                        $aReturn['report_phrase'] = $aRows[$sKey]['report_phrase'] = Phpfox::getPhrase('feed.report_this_entry');
                        $aReturn['force_report']  = $aRows[$sKey]['force_report']  = true;
                    }
                }

С этим решением помогли на другом форуме.

Читайте еще: Недоработки движка phpFOX 3 по удалению заметок.
В мобильной версии сайта можно получить 502 ошибку. Как её получить: создаём страницу (сайт/pages/add/), изменяем её URL, то есть в место сайт/pages/ID/ будет, например: сайт/namepage/. Дальше переходим в мобильный стиль сайта, заходим на страницу, и переходим на форум страницы: (сайт/mobile/namepage/forum/). Вместо списка тем, вылетит 502 ошибка.

Покопавшись, решил проблему так:
Открываю: module/forum/include/component/controller/forum.class.php, нахожу:
        if (Phpfox::isMobile() && Phpfox::getLib('module')->getFullControllerName() == 'forum.forum' && !$this->request()->getInt('req2') && !in_array($this->request()->get('view'), array('subscribed','new','my-thread')))
        {
            return Phpfox::getLib('module')->setController('forum.index');
        }

И удаляю эти строки. Готово.
При отключенном HTML - /admincp/setting/edit/setting-id_20/, вставив текст между тегами BBcode [code][/code], например, такой:
<!-- Форма, куда будут вставлены ники -->

На экране можно получить такую картинку:
<!-- Форма, куда будут вставлен ;ы ники -->

Тут, слово вставлены выведено с точкой запятой, после буквы н: вставлен ;ы

Я решил эту проблему так: открываю: include/library/phpfox/parse/output.class.php, нахожу:
				$newstr .= preg_replace('#([^\n\r(?!PHPFOX_) ]{' . $count . '})#iu', '\\1 ' . ($break ? '<br />' : ''), $char[0]);

Заменяю на:
				$newstr .= preg_replace('#([^\n\r(?!PHPFOX_) ]{' . $count . '})#iu', '\\1' . ($break ? '<br />' : ''), $char[0]);

То есть просто удалил пробел тут: '\\1 '.

Обратите внимание, что у меня название переменных может отличаться от ваших переменных.
Заметил: если между BBcode поставить ноль (0), то он не отобразится, где этот ноль вырезан.

Данный баг я решил так:
Открываю: include/library/phpfox/parse/output.class.php, нахожу:
       		if (!empty($aChar[0]))

Меняю на:
       		if ($aChar[0] == 0 | !empty($aChar[0]))

Готово. Теперь ноль отображается. Пример: 0.
При удалении комментария статуса пользователя, не обновляется количество комментариев, то есть, например, было десять комментов, удалили три, комментов стало семь, а в поле "total_comment" осталось значение 10. Чтобы обновлялось значение, я открываю: "module/feed/include/service/callback.class.php", нахожу:
	public function deleteComment($iId)
	{

	}

Меняю:
	public function deleteComment($id)
	{
		$this->database()
			->update(Phpfox::getT('feed_comment'), array(
				'total_comment' => array('= total_comment -', 1)
			), 'feed_comment_id = ' . (int) $id
		);
	}

Готово.
Очередной баг с форумом и вложениями. Если в первом сообщении темы есть вложения, например, картинки, то эти вложения можно отредактировать только при редактировании первого поста темы, а не темы (Не путать!). По сути мы редактируем один и тот же пост (Самый первый в теме), но в одном случае вложения видно, в другом их нет. Я считаю, что это не правильно. Баг исправил, сейчас вложения есть во всех случаях редактирования. Но, что менял, не помню. По этому я выкладу код своего файла: "module/forum/include/component/controller/post.class.php" целиком, именно в нем я правил код:
<?php
class forum_component_controller_post extends phpfox_component
{
	public function process()
	{
		phpfox::isUser(true);
		$bCanEditPersonalData = true;
		$aCallback = false;
		if ($this->request()->get('module'))
		{
		    $this->template()->assign(array('bIsGroup' => '1'));
		}

		if (($sModule = $this->request()->get('module')) 
			&& phpfox::isModule($sModule) 
			&& ($iItemId = $this->request()->getInt('item'))
			&& phpfox::hasCallback($sModule, 'addForum'))
		{
			$aCallback = phpfox::callback($sModule . '.addForum', $iItemId);	

			$this->template()->setBreadcrumb(phpfox::getPhrase('forum.pages'), $this->url()->makeUrl('pages'));
			$this->template()->setBreadcrumb($aCallback['title'], $aCallback['url_home']);
			$this->template()->setBreadcrumb(phpfox::getPhrase('forum.discussions'), $aCallback['url_home'] . 'forum/');
			if ($sModule == 'pages' && !phpfox::getService('pages')->hasPerm($iItemId, 'forum.share_forum'))
			{
				return phpfox_error::display(phpfox::getPhrase('forum.unable_to_view_this_item_due_to_privacy_settings'));
			}
		}
		else
		{
			$this->template()->setBreadcrumb(phpfox::getPhrase('forum.forum'), $this->url()->makeUrl('forum'));
		}

		$id = $this->request()->getInt('id');

		if (phpfox::isModule('poll'))
		{
			$this->template()->setHeader('cache', [
					'poll.js' => 'module_poll',
					'<script type="text/javascript">$Behavior.loadSortableAnswers = function() {$(".sortable").sortable({placeholder: "placeholder", axis: "y"});}</script>'
				]
			);
		}

		if (phpfox::isModule('video'))
		{
			$this->template()->setHeader('cache', [
					'player/flowplayer/flowplayer.js' => 'static_script',
					'player/' . phpfox::getParam('core.default_music_player') . '/core.js' => 'static_script'	
				]
			);
		}

		$this->template()
		    ->setEditor()
			->setTitle(phpfox::getPhrase('forum.forum'))
			->setHeader('cache', [
				'switch_legend.js' => 'static_script',
				'switch_menu.js'   => 'static_script',
				'pager.css'        => 'style_css',
				'forum.css'        => 'module_forum'
			]
		);			

		$bIsEdit = false;
		if ($this->request()->get('req3') == 'thread')
		{			
			if ($iEditId = $this->request()->getInt('edit'))
			{
				$thread = phpfox::getService('forum.thread')->getForEdit($iEditId);
				if (empty($thread['thread_id']))
				{
					return phpfox_error::display(phpfox::getPhrase('forum.not_a_valid_thread'));
				}

				if (phpfox::isAdmin() | !empty($thread['group_id']) && phpfox::getService('pages')->isAdmin($thread['group_id']))
				{							
					$bIsEdit = true;
					if (phpfox::getUserParam('forum.can_edit_other_posts') && phpfox::getUserId() != $thread['user_id'])
					{
						$bCanEditPersonalData = false;
					}					

					$id = $thread['forum_id'];

					$post = phpfox::getService('forum.post')->getForEdit($thread['start_id']);
					$thread['total_attachment'] = $post['total_attachment'];

					$this->template()->assign([
							'aForms'  => $thread,
							'iEditId' => $thread['thread_id']
						]
					);
				}
				else 
				{
					return phpfox_error::display(phpfox::getPhrase('forum.insufficient_permission_to_edit_this_thread'));					
				}
			}

			if ($aCallback === false)
			{
				$aForum = phpfox::getService('forum')
					->id($id)
					->getForum();

				if (empty($aForum['forum_id']))
				{
					return phpfox_error::display(phpfox::getPhrase('forum.not_a_valid_forum'));
				}			

				if ($aForum['is_closed'])
				{
					return phpfox_error::display(phpfox::getPhrase('forum.forum_is_closed'));
				}				
			}

			if (!$bIsEdit)
			{
				$bPass = false;		
				if (phpfox::getUserParam('forum.can_add_new_thread') | phpfox::getService('forum.moderate')->hasAccess($aForum['forum_id'], 'add_thread'))
				{
					$bPass = true;	
				}		

				if ($bPass === false)
				{
					return phpfox_error::display(phpfox::getPhrase('forum.insufficient_permission_to_reply_to_this_thread'));
				}
			}			

			$aValidation = [
				'title' => phpfox::getPhrase('forum.provide_a_title_for_your_thread'),
				'text'  => phpfox::getPhrase('forum.provide_some_text')
			];

			$oValid = phpfox::getLib('validator')->set([
					'formName' => 'js_form', 
					'aParams'   => $aValidation
				]
			);				

			$bPosted = false;
			if ($aVals = $this->request()->getArray('val'))
			{
				if ($oValid->isValid($aVals))
				{				
					if ($bIsEdit)
					{
						$aVals['post_id']  = $thread['start_id'];
						$aVals['forum_id'] = $thread['forum_id'];
						if (phpfox::getService('forum.thread.process')->update($thread['thread_id'], $thread['user_id'], $aVals))
						{
							$this->url()->permalink('forum.thread', $thread['thread_id'], null, true, phpfox::getPhrase('forum.thread_successfully_updated'));
						}						
					}
					else 
					{
						if (($iFlood = phpfox::getUserParam('forum.forum_thread_flood_control')) !== 0)
						{
							$aFlood = array(
								'action' => 'last_post',                                # The SPAM action
				 				'params' => array(
				 					'field' => 'time_stamp',                            # The time stamp field
				 					'table' => phpfox::getT('forum_thread'),            # Database table we plan to check
				 					'condition'  => 'user_id = ' . phpfox::getUserId(), # Database WHERE query
				 					'time_stamp' => $iFlood * 60	
				 				)
				 			);

				 			# actually check if flooding
				 			if (phpfox::getLib('spam')->check($aFlood))
				 			{		
				 				phpfox_error::set(phpfox::getPhrase('forum.posting_a_new_thread_a_little_too_soon') . ' ' . phpfox::getLib('spam')->getWaitTime());
				 			}											
						}

						if (phpfox_error::isPassed() && ($id = phpfox::getService('forum.thread.process')->add($aVals, $aCallback)))
						{
							$this->url()->permalink('forum.thread', $id, null, true);							
						}
					}
				}
			}

			if ($aCallback === false)
			{	
				$this->template()
				    ->setBreadcrumb($aForum['breadcrumb'])
					->setBreadcrumb($aForum['name'], $this->url()->permalink('forum', $aForum['forum_id']))
					->setBreadcrumb(($bIsEdit ? phpfox::getPhrase('forum.editing_thread') . ': ' . $thread['title'] : phpfox::getPhrase('forum.post_new_thread')), $this->url()->makeUrl('forum.post.thread'), true);
			}
			else 
			{
				$this->template()					
					->setBreadcrumb(($bIsEdit ? phpfox::getPhrase('forum.editing_thread') . ': ' . $thread['title'] : phpfox::getPhrase('forum.post_new_thread')), $this->url()->makeUrl('forum.post.thread'), true);	
			}

			$this->template()->assign([
					'iForumId'       => $id,
					'sFormLink'      => ($aCallback == false ? $this->url()->makeUrl('forum.post.thread', array('id' => $id)) : $this->url()->makeUrl('forum.post.thread', array('module' => $sModule, 'item' => $iItemId))),
					'sCreateJs'      => $oValid->createJS(),
					'sGetJsForm'     => $oValid->getJsForm(),
					'bPosted'        => $bPosted,
					'sReturnLink'    => ($bIsEdit ? ($aCallback === false ? $this->url()->makeUrl('forum', array($aForum['name_url'] . '-' . $aForum['forum_id'])) : $this->url()->makeUrl($aCallback['url_home'] . '.forum')) : ''),						
					'bIsEdit'        => $bIsEdit,
					'aCallback'      => $aCallback,
					'canPoll'        => (!empty($id) && $id > 0 | !empty($sModule)) ? true : false
				]
			);

			if (phpfox::getUserParam('forum.can_add_forum_attachments'))
			{
				$this->setParam('attachment_share', [
						'type'    => 'forum',
						'id'      => 'js_forum_form',
						'edit_id' => $thread['start_id']
					]
				);	
			}
		}
		else
		{
			if ($iEditId = $this->request()->getInt('edit'))
			{
				$post = phpfox::getService('forum.post')->getForEdit($iEditId);
				
				if (empty($post['post_id']))
				{
					return phpfox_error::display(phpfox::getPhrase('forum.not_a_valid_post'));
				}

				$canEditPost = phpfox::isAdmin() | !empty($post['group_id']) && phpfox::getService('pages')->isAdmin($post['group_id']) | $post['user_id'] == phpfox::getUserId() && phpfox::getLib('common')->inspectionTime($post['time_stamp']);
				if ($canEditPost)
				{					
					$bIsEdit = true;
					if (phpfox::getUserParam('forum.can_edit_other_posts') && phpfox::getUserId() != $post['user_id'])
					{
						$bCanEditPersonalData = false;
					}					

					$id = $post['thread_id'];					
					
					$this->template()->assign([
							'aForms'  => $post,
							'iEditId' => $post['post_id']
						]
					);

					if (PHPFOX_IS_AJAX)
					{
						phpfox::getLib('ajax')->setTitle(phpfox::getPhrase('forum.editing_post') . ': ' . (empty($post['title']) ? '#' . $post['post_id'] : phpfox::getLib('parse.output')->shorten($post['title'], 80, '...')));
					}
				}
				else 
				{
					return phpfox_error::display(phpfox::getPhrase('forum.insufficient_permission_to_edit_this_thread'));	
				}
			}			

			$thread = phpfox::getService('forum.thread')->getActualThread($id, $aCallback);
			if (empty($thread['thread_id']))
			{
				return phpfox_error::display(phpfox::getPhrase('forum.not_a_valid_thread'));
			}

			if ($thread['is_closed'] && ((isset($canEditPost) && !$canEditPost) | empty($canEditPost)))
			{
				return phpfox_error::display(phpfox::getPhrase('forum.thread_is_closed'));
			}			

			if ($aCallback === false && $thread['forum_is_closed'])
			{
				return phpfox_error::display(phpfox::getPhrase('forum.forum_is_closed'));
			}			

			if (!$bIsEdit)
			{
				$bPass = false;		
				if ((phpfox::getUserParam('forum.can_reply_to_own_thread') && $thread['user_id'] == phpfox::getUserId()) | phpfox::getUserParam('forum.can_reply_on_other_threads') | phpfox::getService('forum.moderate')->hasAccess($thread['forum_id'], 'can_reply'))
				{
					$bPass = true;	
				}

				if ($bPass === false)
				{
					return phpfox_error::display(phpfox::getPhrase('forum.insufficient_permission_to_reply_to_this_thread'));
				}
			}			

			$sExtraText = '';
			if ($sSavedText = $this->request()->get('save_text'))
			{
				$sExtraText .= phpfox::getLib('parse.output')->clean($sSavedText);
			}

			if (phpfox::getUserParam('forum.can_multi_quote_forum') && (($iQuote = $this->request()->getInt('quote')) | (($sCookie = phpfox::getCookie('forum_quote')) && !empty($sCookie))))
			{				
				$sCookie = phpfox::getCookie('forum_quote');
				if (!empty($sCookie))
				{
					$iQuote = $sCookie . $iQuote;				
				}

				$sExtraText .= phpfox::getService('forum.post')->getQuotes($thread['thread_id'], $iQuote);		
			}			

			if (($iQuoteId = $this->request()->getInt('quote')) && ($aQuotePost = phpfox::getService('forum.post')->getForEdit($iQuoteId)))
			{
				phpfox::getLib('ajax')->setTitle(phpfox::getPhrase('forum.replying_to_a_post_by_full_name', array('full_name' => phpfox::getLib('parse.output')->shorten($aQuotePost['full_name'], 80, '...'))));				
			}

			$aSubForms = array();
			if (isset($thread['is_subscribed']))
			{
				$aSubForms['is_subscribed'] = $thread['is_subscribed'];
			}			

			if (!empty($sExtraText))
			{
				$aSubForms['text'] = $sExtraText;
			}

			if (isset($canEditPost) && $canEditPost)
			{
				$aSubForms = array_merge($aSubForms, $post);
			}

			$this->template()->assign('aForms', $aSubForms);

			$aValidation = array(
				'text' => phpfox::getPhrase('forum.provide_some_text')
			);

			if (phpfox::isModule('captcha') && phpfox::getUserParam('forum.enable_captcha_on_posting'))
			{
				$aValidation['image_verification'] = phpfox::getPhrase('captcha.complete_captcha_challenge');
			}				

			$oValid = phpfox::getLib('validator')->set([
					'formName' => 'js_form', 
					'aParams'  => $aValidation
				]
			);				

			$aForum = phpfox::getService('forum')
				->id($thread['forum_id'])
				->getForum();			

			if ($aVals = $this->request()->getArray('val'))
			{
				$aVals['forum_id'] = $thread['forum_id'];
				if ($oValid->isValid($aVals))
				{
					phpfox::setCookie('forum_quote', '', -1);

					if ($bIsEdit)
					{
						if (phpfox::getService('forum.post.process')->update($post['post_id'], $post['user_id'], $aVals))
						{
							$this->url()->permalink('forum', $thread['thread_id'], null, true, null, array('post' => $post['post_id']));						
						}						
					}
					else
					{
						if (($iFlood = phpfox::getUserParam('forum.forum_post_flood_control')) !== 0)
						{
							$aFlood = array(
								'action' => 'last_post',                                # The SPAM action
				 				'params' => array(
				 					'field'      => 'time_stamp',                       # The time stamp field
				 					'table'      => phpfox::getT('forum_post'),         # Database table we plan to check
				 					'condition'  => 'user_id = ' . phpfox::getUserId(), # Database WHERE query
				 					'time_stamp' => $iFlood * 60	
				 				)
				 			);

				 			# actually check if flooding
				 			if (phpfox::getLib('spam')->check($aFlood))
				 			{		
				 				phpfox_error::set(phpfox::getPhrase('forum.posting_a_reply_a_little_too_soon') . ' ' . phpfox::getLib('spam')->getWaitTime());
				 			}											
						}				

						if (phpfox_error::isPassed())
						{
							if (($id = phpfox::getService('forum.post.process')->add($aVals, $aCallback)))
							{
								$this->url()->permalink('forum', $thread['thread_id'], null, true, null, array('post' => $id));
							}
							else 
							{
								if (phpfox::getUserParam('forum.approve_forum_post'))
								{
									$this->url()->permalink('forum', $thread['thread_id'], null, true, phpfox::getPhrase('forum.your_post_has_successfully_been_added_however_it_is_pending_an_admins_approval_before_it_can_be_displayed_publicly'), array('post' => $id));
								}								
							}
						}			
					}
				}
			}	

			if ($aCallback === false)
			{
				$this->template()
				    ->setBreadcrumb($aForum['breadcrumb'])
					->setBreadcrumb($aForum['name'], $this->url()->makeUrl('forum', $aForum['name_url'] . '-' . $aForum['forum_id']));
			}

			$this->template()
				->setBreadcrumb($thread['title'], ($aCallback === false ? $this->url()->makeUrl('forum', array($aForum['name_url'] . '-' . $aForum['forum_id'])) : $this->url()->makeUrl($aCallback['url_home'] . '.forum')))
				->setBreadcrumb(($bIsEdit ? phpfox::getPhrase('forum.editing_post') . ': ' . (empty($post['title']) ? '#' . $post['post_id'] : $post['title']) : phpfox::getPhrase('forum.post_new_reply')), ($bIsEdit ? ($aCallback === false ? $this->url()->makeUrl('forum', array($thread['forum_url'] . '-' . $thread['forum_id'], null, 'post_' . $post['post_id'])) : $this->url()->makeUrl($aCallback['url_home'] . '.forum', array('post' => $post['post_id']))) : null), true)
				->assign(array(
					'iThreadId'         => $id,
					'sFormLink'         => ($aCallback === false ? $this->url()->makeUrl('forum.post.reply', array('id' => $id)) : $this->url()->makeUrl('forum.post.reply', array('id' => $id, 'module' => $sModule, 'item' => $iItemId))),
					'sCreateJs'         => $oValid->createJS(),
					'sGetJsForm'        => $oValid->getJsForm((PHPFOX_IS_AJAX ? false : true)),
					'sReturnLink'       => ($bIsEdit ? ($aCallback === false ? $this->url()->makeUrl('forum', array($thread['forum_url'] . '-' . $thread['forum_id'], null, 'post_' . $post['post_id'])) : $this->url()->makeUrl($aCallback['url_home'] . '.forum')) : ''),
					'sThreadReturnLink' => ($aCallback === false ? $this->url()->makeUrl('forum', array($thread['forum_url'] . '-' . $thread['forum_id'])) : $this->url()->makeUrl($aCallback['url_home'], array('forum'))),
					'aPreviews'         => phpfox::getService('forum.post')->getPreview($thread['thread_id']),
					'iTotalPosts'       => $thread['total_post'],
					'bIsEdit'           => $bIsEdit,
					'aCallback'         => $aCallback,
					'iTotalPostPreview' => phpfox::getParam('forum.total_forum_post_preview')
				)
			);

			if (phpfox::getUserParam('forum.can_add_forum_attachments'))
			{
				$this->setParam('attachment_share', [
						'type'    => 'forum',
						'inline'  => (PHPFOX_IS_AJAX ? true : false),
						'id'      => 'js_forum_form',
						'edit_id' => ($bIsEdit ? $post['post_id'] : '')
					]
				);			
			}
		}
	}
}