Добавить поле телефон при регистрации Simpla

Добавить поле телефон при регистрации Simpla

Достаточно часто при реализации интернет-магазина на cms Simpla появляется необходимость добавить в карточку товара поле "Телефон" покупателя. Реализовав это, мы получаем сразу несколько плюсов: при оформлении заказа на странице корзины данные имени, почты и телефонного номера уже автоматически будут загружены и пользователю не придется повторно их вводить, телефонные номера пользователей попадают в профиль и в админку, а значит могут быть выгружены - а это уже ценная база данных, ну и крутость этой доработки просто зашкаливает:)

По аналогии с предложенным методом можно добавить в профиль пользователя (и/или при регистрации) любое дополнительное поле. Внимание! Все изменения я делаю на Simpla 2.3.7 с множеством доработок, поэтому номера строк могут отличаться. Давайте приступим...

Создаем поле в базе данных

Первое, что нужно сделать - добавить в нашу базу данных поле, где будут храниться наши телефонные номера. Оптимальная длина поля - 20 символов, поэтому запрос будет выглядеть так:

ALTER TABLE s_users ADD phone varchar(20) AFTER name

Добавим чтение поля телефона из базы данных

Идем на фтп по пути: /api/Users.php и ищем следующий запрос (строка 56-57 с комментарием - // Выбираем пользователей):

$query = $this->db->placehold("SELECT u.id, u.email, u.password, u.name, u.group_id, u.enabled, u.last_ip, u.created, g.discount, g.name as group_name FROM __users u
		                                LEFT JOIN __groups g ON u.group_id=g.id 
						WHERE 1 $group_id_filter $keyword_filter ORDER BY $order $sql_limit");

После u.name добавляем u.phone чтобы получилось так:

$query = $this->db->placehold("SELECT u.id, u.email, u.password, u.name, u.phone, u.group_id, u.enabled, u.last_ip, u.created, g.discount, g.name as group_name FROM __users u
		                                LEFT JOIN __groups g ON u.group_id=g.id 
						WHERE 1 $group_id_filter $keyword_filter ORDER BY $order $sql_limit");

Ниже, на строках 94-95 с комментарием // Выбираем пользователя в запросе:

$query = $this->db->placehold("SELECT u.id, u.email, u.password, u.name, u.group_id, u.enabled, u.last_ip, u.created, g.discount, g.name as group_name FROM __users u LEFT JOIN __groups g ON u.group_id=g.id $where LIMIT 1", $id);

После u.name добавляем u.phone чтобы получилось так:

$query = $this->db->placehold("SELECT u.id, u.email, u.password, u.name, u.phone, u.group_id, u.enabled, u.last_ip, u.created, g.discount, g.name as group_name FROM __users u LEFT JOIN __groups g ON u.group_id=g.id $where LIMIT 1", $id);

Добавим обработку телефона при регистрации

Для этого нам понадобится файл: /view/RegisterView.php, ищем примерно 36 строку следующего содержания:

elseif($user_id = $this->users->add_user(array('name'=>$name, 'email'=>$email, 'password'=>$password, 'enabled'=>$default_status, 'group_id'=> $id !=1, 'last_ip'=>$_SERVER['REMOTE_ADDR'])))

И добавляем в нее: 'phone'=>$this->request->post('phone') после 'enabled'=>$default_status чтобы получилось так:

elseif($user_id = $this->users->add_user(array('name'=>$name, 'email'=>$email, 'password'=>$password, 'enabled'=>$default_status, 'phone'=>$this->request->post('phone'), 'group_id'=> $id !=1, 'last_ip'=>$_SERVER['REMOTE_ADDR'])))

Добавим обработку телефона в профиле пользователя

Для этого идем в файл: /view/UserView.php и ищем на 45 строчке:

elseif($user_id = $this->users->update_user($this->user->id, array('name'=>$name, 'email'=>$email)))

Добавляем после 'email'=>$email следующий код: 'phone'=>$this->request->post('phone') чтобы получилось так:

elseif($user_id = $this->users->update_user($this->user->id, array('name'=>$name, 'email'=>$email, 'phone'=>$this->request->post('phone'))))

В этом же файле ниже (на 50 строке) после:

$this->design->assign('email', $this->user->email);

Добавляем:

$this->design->assign('phone', $this->user->phone);

Еще ниже (на 66 строке) после:

$this->design->assign('email', $this->user->email);

Добавляем:

$this->design->assign('phone', $this->user->phone);

С этим файлом закончили.

Добавим обработку телефона пользователя в админке

Идем в файл /simpla/UserAdmin.php, ищем на 14 строке:

$user->email = $this->request->post('email');

После нее добавляем:

$user->phone = $this->request->post('phone');

Сделаем автозаполнение поля телефон в корзине при оформлении заказа

Для этого нам понадобится файл /view/CartView.php, на строке 274 после:

$this->design->assign('email', $this->user->email);

Вставляем:

$this->design->assign('phone', $this->user->phone);

Теперь займемся выводом информации в шаблоны.

Добавим вывод телефона в профиль пользователя в админке

Идем в файл /simpla/design/html/user.tpl и на строке 68 после:

<li><label class=property>Email</label><input name="email" class="simpla_inp" type="text" value="{$user->email|escape}" /></li>

Добавляем:

<li><label class=property>Телефон</label><input name="phone" class="simpla_inp" type="text" value="{$user->phone|escape}" /></li>

Сделаем вывод телефона на странице списка пользователей в админке

Для этого в файле /simpla/design/html/users.tpl (примерно 69 строка) после:

<div class="user_email cell">
	<a href="mailto:{$user->name|escape}<{$user->email|escape}>">{$user->email|escape}</a>	
</div>

Добавляем:

<div class="user_phone cell">
	{$user->phone|escape}
</div>

Чуть поправим стили

Открываем файл стилей /simpla/design/css и на строке 684 ищем #list .user_name и меняем ширину на 140px, чтобы получилось:

#list .user_name {
	width:145px;
}

Теперь пора сделать вывод телефона в нашем шаблоне.

Выведем телефон на странице регистрации пользователя

Открываем в админке register.tpl (или на фтп /design/ваша тема/html/register.tpl и после строки:

<input type="text" name="email" data-format="email" data-notice="Введите email" value="{$email|escape}" maxlength="255" />

Вставляем:

<label>Телефон</label>
<input type="text" name="phone" data-format=".+" data-notice="Введите телефон" value="{$phone|escape}" maxlength="20" />

Выведем телефон в профиле пользователя

Для этого в админке открываем user.tpl (или на фтп /design/ваша тема/html/user.tpl и после:

<input data-format="email" data-notice="Введите email" value="{$email|escape}" name="email" maxlength="255" type="text"/>

Вставляем:

<label>Телефон</label>
<input data-format=".+" data-notice="Введите телефон" value="{$phone|escape}" name="phone" maxlength="20" type="text"/>

Супер! Основное мы сделали.

Включим поиск по телефону в админке

На странице покупателей в админке можно включить поиск покупателя по номеру телефона. Для этого в файле /api/Users.php ищем на 39 строке следующий код:

$keyword_filter .= $this->db->placehold('AND (u.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR u.email LIKE "%'.$this->db->escape(trim($keyword)).'%"  OR u.last_ip LIKE "%'.$this->db->escape(trim($keyword)).'%")');

И перед u.name LIKE вставляем u.phone LIKE "%'.$this->db->escape(trim($keyword)).'%" OR чтобы получилось так:

$keyword_filter .= $this->db->placehold('AND (u.phone LIKE "%'.$this->db->escape(trim($keyword)).'%" OR u.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR u.email LIKE "%'.$this->db->escape(trim($keyword)).'%"  OR u.last_ip LIKE "%'.$this->db->escape(trim($keyword)).'%")');

Чуть ниже на 76 строке ищем код:

$keyword_filter .= $this->db->placehold('AND u.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR u.email LIKE "%'.$this->db->escape(trim($keyword)).'%"');

По аналогии добавляем перед u.name LIKE следующее выражение u.phone LIKE "%'.$this->db->escape(trim($keyword)).'%" OR чтобы получилось так:

$keyword_filter .= $this->db->placehold('AND u.phone LIKE "%'.$this->db->escape(trim($keyword)).'%" OR u.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR u.email LIKE "%'.$this->db->escape(trim($keyword)).'%"');

Вот и все, теперь поиск будет работать.

Добавим поле телефон в файл экспорта покупателей

Идем в файл /simpla/ajax/export_users.php и на строке 9 после:

'email'=>            'Email',

Добавляем:

'phone'=>          'Телефон',

На этом все. Если ничего не упустил, то будет работать! Всем успехов!

26.03.17
Для просмотра сайта обновите браузер.