Демостенд примера - https://demo.web-automation.ru/list/watch/podtverzhdenie-deystviya-polzovatelya-po-kodu-cherez-email--sms---1138
Для внедрения в форму возможности подтверждения по СМС или Email необходимо сделать следующее:
0. В базе должна быть таблица as_confirms:
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name= 'as_confirms' and xtype='U') BEGIN
CREATE TABLE [dbo].[as_confirms]
(
[id] [int] IDENTITY(1,1) NOT NULL
CONSTRAINT [PK_as_confirms] PRIMARY KEY CLUSTERED ( [id] ASC )
) ON [PRIMARY]
print 'Создана таблица as_confirms '
END
GO
IF COL_LENGTH( 'as_confirms', 'guid') IS NULL BEGIN
ALTER TABLE as_confirms
ADD [guid] uniqueidentifier NULL
END
IF COL_LENGTH( 'as_confirms', 'code') IS NULL BEGIN
ALTER TABLE as_confirms
ADD [code] nvarchar (32) NULL
END
IF COL_LENGTH( 'as_confirms', 'date') IS NULL BEGIN
ALTER TABLE as_confirms
ADD [date] datetime NULL
END
1. Добавить на форму кнопку
<a href="#" class="as-form-confirm">Confirm</a>
2. Скрыть основную кнопку сохранения (при этом кнопка обязательно должна быть на форме!)
.as-form[data-code=client] .as-form-submit{ display: none; }
3. Создать процедуру для метода request, где модуль - это код формы (в данном случае client).
create or alter PROCEDURE [dbo].[request_watch_confirmEmail_confirm]
@parameters DictionaryParameter READONLY,
@username nvarchar(32)
AS
BEGIN
declare @formItemID nvarchar(128) = (select Value from @parameters where [Key]='itemID')
declare @formCode nvarchar(128) = (select Value from @parameters where [Key]='code')
declare @contact nvarchar(128) = (select Value from @parameters where [Key]='contact')
if(isnull(@contact, '')='') begin
select 0 Result, 'Не указан контакт' Msg, 'warning' [Type]
return
end
if(CHARINDEX('@', @contact)<1) begin
select 0 Result, 'Неверно указан email' Msg, 'warning' [Type]
return
end
declare @guid uniqueidentifier = newid()
-- генерируем код
DECLARE @code nvarchar(128);
declare @count int = 4
SET @code = (SELECT c1 AS [text()]
FROM( SELECT TOP (@count) c1 FROM ( VALUES ('0'), ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')) AS T1(c1)
ORDER BY ABS(CHECKSUM(NEWID()))
) AS T2 FOR XML PATH(''));
-- SELECT 1
select '' Msg, 1 Result
-- SELECT 2 - отдаем guid для будущей проверки при сохранении.
select @guid [guid], 'Укажи код в поле' title, 'Отправили email с кодом вам на почту' text, 'Отправить заявку' btnText
-- сохраняем код и Guid для будущей проверки в SaveItem
insert into as_confirms ([guid], code, date) values (@guid, @code, getdate())
-- отправляем на почту (или SMS) сгенерированный код
select 'email' type, -- email, sms, notification, clearcache
@contact [to], 'Код подтверждения' subject, 'Код проверки - '+@code body
END
Примечание: все поля формы передаются в @parameters по коду своего поля. В parameters также передаются код формы code и itemID. Также телефон можно извлекать по username для авторизованных пользователей.
В SELECT 2 мы можем задать параметры модального окна ввода кода - заголовок, описание и метку кнопки.
4. в SaveItem делаем проверку кода (не забываем, что @itemID nvarchar(256))
CREATE PROCEDURE [dbo].[fm_watch_confirmEmail_saveItem]
@username nvarchar(256),
@itemID nvarchar(256),
@parameters ExtendedDictionaryParameter readonly
AS
BEGIN
-- на входе в @itemID = @itemID_guid_usercode
declare @guid nvarchar(256), @code nvarchar(128), @instanceID int
set @instanceID = try_cast( dbo.str_splitPart(@itemID, '_', 1) as int)
set @code = dbo.str_splitPart(@itemID, '_', 2)
set @guid = dbo.str_splitPart(@code, '_', 1)
set @code = dbo.str_splitPart(@code, '_', 2)
if( not exists (select id from as_confirms where guid = @guid and code = @code and date > dateadd(minute, -10, getdate()))) begin
select 0 Result, 'Неверный код' Msg
return
end
-- 1 SELECT
select 1 Result, 'Операция выполнена успешно...' Msg
END
Вы можете указать настройки в атрибутах кнопки as-form-confirm
Коллбек проверки перед отправкой кода в JS
as.formcallbacks[formCode + "_beforeConfirm"] = function(cont){
return true;
}
Если вернет false - то операция прервется.
Примечание
Если пользователю нужно просто подтвердить действие через дополнительное согласование - https://falconspace.ru/docs/kak-sdelat-okno-podtverzhdeniya-deystviya-formy