Find a member по новому критерию Location

Проблемы с установкой или работой phpBB 3.0.x? Получите помощь здесь!
С 1 января 2017 года phpBB Group прекращает поддержку phpBB версии 3.0.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.0 до 1 июля 2017 года.
Подробнее: Окончание поддержки phpBB 3.0.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
moto
phpBB 1.2.0
Сообщения: 18
Стаж: 16 лет 1 месяц
Благодарил (а): 5 раз

Find a member по новому критерию Location

Сообщение moto »

Здравствуйте. Подскажите малой кровью такое возможно? Использую phpBB 3.0.7 - PL1 eng. Добавил поле Location в memberlist_search.html:

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

	<dl>
		<dt><label for="location">{L_LOCATION}:</label></dt>
		<dd><input type="text" name="location" id="location" value="{LOCATION}" class="inputbox" /></dd>
	</dl>
где изменить в движке поиска, чтоб он это поле тоже обрабатывал?

Добавлено спустя 1 час 27 минут 56 секунд:
сейчас ковыряю memberlist.php, я так понял это там...

Добавлено спустя 45 минут 21 секунду:
заработало, чуть позже напишу что сделал...

Добавлено спустя 2 часа 32 минуты 12 секунд:
Итак, вот что получилсоь, работает конечно, но как-то не до конца. В общем вот что сделал:

файл memberlist.php:

добавляем 'location' в

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

		// Search URL parameters, if any of these are in the URL we do a search
		$search_params = array('username', 'email', 'location', 'icq', 'aim',....

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

		// We validate form and field here, only id/class allowed
		$form = (!preg_match('/^[a-z0-9_-]+$/i', $form)) ? '' : $form;
		$field = (!preg_match('/^[a-z0-9_-]+$/i', $field)) ? '' : $field;
		if (($mode == 'searchuser' || sizeof(array_intersect(array_keys($_GET), $search_params)) > 0) && ($config['load_search'] || $auth->acl_get('a_')))
		{
			$username	= request_var('username', '', true);
			$email		= strtolower(request_var('email', ''));
//add		                
			$location = request_var('location', '', true);
//add
			$icq		= request_var('icq', '');
...........................................................

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

			$sql_where .= ($username) ? ' AND u.username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($username))) : '';
			$sql_where .= ($auth->acl_get('a_user') && $email) ? ' AND u.user_email ' . $db->sql_like_expression(str_replace('*', $db->any_char, $email)) . ' ' : '';
//add	
			$sql_where .= ($location) ? ' AND u.user_from ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($location))) . ' ' : '';		
//add
			$sql_where .= ($icq) ? ' AND u.user..............................
....................................................................

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

		// We do not use request_var() here directly to save some calls (not all variables are set)
		$check_params = array(
			'g'				=> array('g', 0),
			'sk'			=> array('sk', $default_key),
			'sd'			=> array('sd', 'a'),
			'form'			=> array('form', ''),
			'field'			=> array('field', ''),
			'select_single'	=> array('select_single', $select_single),
			'username'		=> array('username', '', true),
			'email'			=> array('email', ''),
//add
			'location'			=> array('location', '', true),
//add
			'icq'			=> array('icq', ''),..........
.........................................................

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

			if ($group_selected !== 0 && !in_array($group_selected, $group_ids))
			{
				trigger_error('NO_GROUP');
			}

			$template->assign_vars(array(
				'USERNAME'	=> $username,
				'EMAIL'		=> $email,
//add
				'LOCATION'		=> $location,
//add				
				'ICQ'		=> $icq,
Добавлено спустя 12 минут 33 секунды:
с этими изменениями поиск работает, но такое ощущени, что какой-то обработки поля не хватает... например:
  1. Работаем с критерием "Имя пользователя":
    - вводим поисковый параметр "о*" (о - буква [о] русская)
    - нажимаем поиск и видим пользователей: "orehov", "Orehov", "орехов"

    все вроде бы устраивает....
  2. Работаем с критерием "Откуда":
    вводим поисковый параметр "о*" (о - буква [о] русская)
    - ничего не выводится

    вводим поисковый параметр "*о*" (о - буква [о] русская)
    - выводится пользователь, у которого "Откуда" - "Ozersk"

    вводим поисковый параметр "*O*" (о - буква [о] русская)
    - ничего не выводится

    вводим поисковый параметр "*з*" (з - буква [зэ] русская)
    - выводится пользователь, у которого "Откуда" - "Озерск"
вот и создается впечатление, что username как-то обрабатывается перед вставкой в поисковй запрос, a location - нет. Никак не могу найти в чем трабла, помогайте плиз советом???

Добавлено спустя 25 минут 11 секунд:
в таблице phpbb_users хранятся данные в поле username:
"orehov", "орехов"

а в поле usre_from:
"Ozersk" и вместо нормального "Озерск" хранится "d09ed0b7d0b5d180d0bed0b220d090d0bbd0b5d0bad181d0b5d0b9"

Т.е. при регистрации если пользователь ввел русское username оно как-то правильно в базу сохраняется...
....вот такая фигнотень :( как победить?

Добавлено спустя 12 минут 56 секунд:
разговор с самим собой

подскажите пожалуйста где происходит обработка нажатия кнопки "Submit" при регистрации нового пользователя? Мне кажется там проичходит обработка имени пользователя и оно нормально в БД сохраняется если русскими буквами названо...

Добавлено спустя 1 час 38 минут 30 секунд:
монолог продолжается...

вот что удалось выяснить utf_normalizer начинает что-то мудрить при вводе буквы "й" при вводе этой буквы все слово сохраняется в виде:

"d09ed0b7d0b5d180d0bed0b220d090d0bbd0b5d0bad"

без этой буквы сохраняется в нормальном виде..
я так понимаю нет смысла спрашивать: "как победить?" :)

Добавлено спустя 10 минут 48 секунд:
проверил все русские буквы, метамарфозы начинают при: "й" - d0b9, "ш" - d188, "Й" - d099
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 19 лет 7 месяцев
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2756 раз

Re: Find a member по новому критерию Location

Сообщение Sheer »

Посмотри тут Поиск пользователей по городу , авось поможет.
Аватара пользователя
moto
phpBB 1.2.0
Сообщения: 18
Стаж: 16 лет 1 месяц
Благодарил (а): 5 раз

Re: Find a member по новому критерию Location

Сообщение moto »

Спасибо, там есть замечательный ответ на вопрос как сделать поиск регистронезависимым :)

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

' COLLATE utf8_general_ci '
очень помогло :)

ну а проблемы с поиском разрешились следующим образом, поскольку при попадании в слое букв "й", "Й", "ш" слово в БД сохранялось в виде NFC, то чтоб поиск корректно работал, надо написать:

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

	$sql_where .= ($location) ? ' AND u.user_from ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_normalize_nfc($location))) . ' COLLATE utf8_general_ci ' : '';		
УУУРРРААА!!! Можно спать спокойно, но не долго ;)

Вернуться в «Поддержка phpBB 3.0.х»