Добавить поле телефон при регистрации 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'=> 'Телефон',
На этом все. Если ничего не упустил, то будет работать! Всем успехов!