База данных
Информация о контактах хранится в нескольких таблицах.
wa_contact
— таблица с основной информацией о контакте
id
— ID контакта в базе (auto_increment)
name
— полное имя контакта, формируется при сохранении данных о контакте
firstname
— имя
middlename
— отчество
lastname
— фамилия
title
— обращение (например, гражданин, гражданка)
company
— название компании
is_user
— является ли пользователем бекенда Вебасиста, по умолчанию 0
login
— логин пользователя бекенда
password
— пароль для входа в бекенд
birthday
— DATE, дата рождения
about
— TEXT, произвольное текстовое описание контакта
photo
— имя файла фотографии контакта
locale
— локаль контакта, определяет язык, на котором будет показан интерфейс для этого контакта, например, ru_RU, en_US
timezone
— часовой пояс контакта, например, Europe/Moscow
Служебные поля хранятся в этой же таблице:
create_datetime
— дата и время создания контакта
create_app_id
— APP_ID приложения, создавшего контакт
create_method
— метод создания контакта (например, add - ручное добавление, import - импорт, form - через форму подписки и т.д.),
create_contact_id
— ID контакта, создавшего контакт при ручном создании контакта
wa_contact_emails
— таблица для хранения email-адресов контактов, у которых добавлено более одного адреса
id
— сквозной ID email-адреса (auto_increment)
contact_id
— ID контакта
email
— адрес
ext
— дополнительная информация, home - личный/домашний, work - рабочий и т.д.
sort
— порядок отображения адресов контакта; email, у которого значение sort равно 0, считается основным (используется для рассылок уведомлений, авторизации и т.д.), остальные email-адреса считаются дополнительными
status
— enum('unknown', 'confirmed', 'unconfirmed', 'unavailable') — статус адреса: неизвестно (например, добавили контакт вручную), подтвержден, не подтвержден, недоступен (при попытке отправить email, письмо вернулось)
wa_contact_data
— таблица для хранения произвольных дополнительных данных (телефон, адрес и т.д.)
id
— сквозной ID записи
contact_id
— ID контакта
field
— строковый идентификатор поля, например phone, url и т.д.
ext
— дополнительная информация (home - домашний, work - рабочий и т.д.)
value
— VARCHAR(255) — значение поля
sort
— порядок отображения поля в форме с информацией о контакте
В этой же таблице хранятся композитные поля (поля состоящие из нескольких подполей). Например, адрес (подполя указываются через двоеточие):
address:country
address:city
address:state
address:street
address:zip
Описание полей контакта
Все поля, которые могут быть заданы для контакта, описываются в файле wa-system/contact/data/field.php
.
Например, так выглядит описание поля «телефон» (фрагмент файла field.php
):
new waContactPhoneField('phone', 'Phone', [ 'multi' => true, // у одного контакта может быть несколько телефонов 'ext' => [ // набор возможных дополнений «суффиксов» 'work' => 'Work', 'mobile' => 'Mobile', 'home' => 'Home', ] ]),
Чтобы добавить новое поле для контакта, достаточно выполнить следующее:
- добавить его описание в файл
wa-config/apps/contacts/custom_fields.php
, например, поле «автомобиль»:<?php return [ new waContactStringField( 'car', [ 'en_US' => 'Car', 'ru_RU' => 'Автомобиль', [] ] ), ];
- включить это поле, добавив в конец файла
wa-config/apps/contacts/person_fields_order.php
строку'car' => []
Если этот файл отсутствует, создайте его, полностью скопировав в него содержимое файла
wa-system/contact/data/person_fields_default.php
.<?php return [ // ... - тут все остальные поля 'car' => [] ];
Создание и редактирование контакта
Для работы с контактом необходимо использовать класс waContact
. В этом классе реализованы все необходимые методы.
Изменять и читать данные контакта напрямую из БД категорически не рекомендуется. Класс waContact
используется очень просто:
// создание экземпляра контакта // новый контакт $contact = new waContact(); // существующий контакт $contact = new waContact($id); // изменение данных контакта $contact[$field] = $value; //Например, задать email можно так: $contact['email'] = 'test@domain.com'; //или так $contact['email'] = [ 'value' => 'test@webasyst.com', 'ext' => 'work', 'status' => 'confirmed' ];
Несколько email-адресов можно задать аналогично.
$contact['email'] = [ 'email1@domain.com', 'email2@domain.com' ];
Имейте ввиду, что при таком задании адресов все существующие адреса контакта будут удалены.
Если нужно добавить новый адрес к уже существующим, то это можно сделать с помощью метода add
:
$contact->add('email', 'newemail@domain.com');
Чтобы сохранить все изменения в БД, необходимо вызвать метод save()
:
$contact->save();
Метод возвращает 0, если все успешно, иначе возвращает массив ошибок:
if ($errors = $contact->save()) { // массив ошибок, которые произошли при сохранении контакта }
В метод save()
можно также передать массив данных, которые необходимо сохранить, например:
$contact->save([ 'phone' => [ 'value' => '4354235', 'ext' => 'work' ], 'email' => 'test@domain.com' ]);
Удаление значения
unset($contact['email']); $contact->save(); // все email-адреса контакта удалены
Получение данных контакта
$contact = new waContact($id); $emails = $contact['email']; $emails = $contact->get('email');
Поскольку у контакта может быть несколько email-адресов, то $emails
будет содержать массив значений в таком виде:
[ 0 => [ [value] =>email1@domain.com, [ext] => home, [status] => unknown ], 1 => [ [value] => email2@domain.com, [ext] => work, [status] => confirmed ], ];
Это касается всех множественных полей, в которых возможны несколько значений.
В ситуациях, в которых требуется получить только одно значение поля (например, получить email для отправки уведомления), следует поступить так:
// первый из email-адресов контакта $email = $contact->get('email', 'default');
Имя контакта:
$name = $contact['name']; //или так $name = $contact->getName();
ID контакта:
$id = $contact['id']; //или так $id = $contact->getId();
Композитные поля
Композитными полями называются поля, которые состоят из нескольких подполей. Например, адрес состоит из индекса, страны, области, города, улицы.
$contact->get('address'); [ [0] => [ [data] => [ [city] => Москва [country] => rus [street] => Крымский Вал, д. 3, стр. 2 ] [ext] => work [value] => Крымский Вал, д. 3, стр. 2, Москва, Российская Федерация ] ]
В value
передается значение, готовое к отображению (вывод запрограммирован в классе, который описывает тип поля). В data
— массив значений подполей.
Изменять такие поля нужно с осторожностью. Например, изменить город в первом из адресов контакта правильно так:
$address = $contact->get('address'); $address[0]['data']['city'] = 'Москва'; $contact->save(['address' => $address]);
Добавить еще один адрес:
$contact->add( 'address', [ 'city' => 'Москва', 'country' => 'rus' ] ); $contact->save();
Объект текущего пользователя (wa()->getUser()
, или $this->getUser()
— внутри экшенов и контроллеров) является также экземпляром класса waContact
. Поэтому все описанное выше применимо и к нему.
Примеры:
//получить имя текущего пользователя $this->getUser()->getName(); //получить основной email-адрес $this->getUser()->get('email', 'default');