ساخت اپلیکیشن فلاتر ToDo با پایگاه داده لوکال SQLite — از صفر تا صد


import ‘dart:async’;

import ‘package:flutter/material.dart’;

import ‘package:todo_list/Models/todo.dart’;

import ‘package:todo_list/Utils/database_helper.dart’;

import ‘package:intl/intl.dart’;

 

class TodoDetail extends StatefulWidget

 

final String appBarTitle;

final Todo todo;

 

TodoDetail(this.todo, this.appBarTitle);

 

@override

  State<StatefulWidget> createState()

 

    return TodoDetailState(this.todo, this.appBarTitle);

  

 

class TodoDetailState extends State<TodoDetail>

 

DatabaseHelper helper = DatabaseHelper();

 

String appBarTitle;

Todo todo;

 

TextEditingController titleController = TextEditingController();

TextEditingController descriptionController = TextEditingController();

 

TodoDetailState(this.todo, this.appBarTitle);

 

@override

  Widget build(BuildContext context)

 

TextStyle textStyle = Theme.of(context).textTheme.title;

 

titleController.text = todo.title;

descriptionController.text = todo.description;

 

    return WillPopScope(

 

    onWillPop: ()

    moveToLastScreen();

    ,

 

    child: Scaffold(

    appBar: AppBar(

    title: Text(appBarTitle),

    leading: IconButton(icon: Icon(

    Icons.arrow_back),

    onPressed: ()

         moveToLastScreen();

    

    ),

    ),

 

    body: Padding(

    padding: EdgeInsets.only(top: 15.0, left: 10.0, right: 10.0),

    child: ListView(

    children: <Widget>[

 

    Padding(

    padding: EdgeInsets.only(top: 15.0, bottom: 15.0),

    child: TextField(

    controller: titleController,

    style: textStyle,

    onChanged: (value)

     debugPrint(‘Something changed in Title Text Field’);

     updateTitle();

    ,

    decoration: InputDecoration(

    labelText: ‘Title’,

    labelStyle: textStyle,

    border: OutlineInputBorder(

    borderRadius: BorderRadius.circular(5.0)

    )

    ),

    ),

    ),

 

    Padding(

    padding: EdgeInsets.only(top: 15.0, bottom: 15.0),

    child: TextField(

    controller: descriptionController,

    style: textStyle,

    onChanged: (value)

    debugPrint(‘Something changed in Description Text Field’);

    updateDescription();

    ,

    decoration: InputDecoration(

    labelText: ‘Description’,

    labelStyle: textStyle,

    border: OutlineInputBorder(

    borderRadius: BorderRadius.circular(5.0)

    )

    ),

    ),

    ),

 

    Padding(

    padding: EdgeInsets.only(top: 15.0, bottom: 15.0),

    child: Row(

    children: <Widget>[

     Expanded(

    child: RaisedButton(

    color: Theme.of(context).primaryColorDark,

    textColor: Theme.of(context).primaryColorLight,

    child: Text(

    ‘Save’,

    textScaleFactor: 1.5,

    ),

    onPressed: ()

     setState(()

       debugPrint(“Save button clicked”);

       _save();

     );

    ,

    ),

    ),

 

    Container(width: 5.0,),

 

    Expanded(

    child: RaisedButton(

    color: Theme.of(context).primaryColorDark,

    textColor: Theme.of(context).primaryColorLight,

    child: Text(

    ‘Delete’,

    textScaleFactor: 1.5,

    ),

    onPressed: ()

    setState(()

    debugPrint(“Delete button clicked”);

    _delete();

    );

    ,

    ),

    ),

 

    ],

    ),

    ),

 

 

    ],

    ),

    ),

 

    ));

  

 

  void moveToLastScreen()

Navigator.pop(context, true);

  

 

// Update the title of todo object

  void updateTitle()

    todo.title = titleController.text;

  

 

// Update the description of todo object

void updateDescription()

todo.description = descriptionController.text;

 

// Save data to database

void _save() async

 

moveToLastScreen();

 

todo.date = DateFormat.yMMMd().format(DateTime.now());

int result;

if (todo.id != null)   // Case 1: Update operation

result = await helper.updateTodo(todo);

else // Case 2: Insert Operation

result = await helper.insertTodo(todo);

 

if (result != 0)   // Success

_showAlertDialog(‘Status’, ‘Todo Saved Successfully’);

else   // Failure

_showAlertDialog(‘Status’, ‘Problem Saving Todo’);

 

 

 

void _delete() async

 

moveToLastScreen();

 

if (todo.id == null)

_showAlertDialog(‘Status’, ‘No Todo was deleted’);

return;

 

int result = await helper.deleteTodo(todo.id);

if (result != 0)

_showAlertDialog(‘Status’, ‘Todo Deleted Successfully’);

else

_showAlertDialog(‘Status’, ‘Error Occured while Deleting Todo’);

 

void _showAlertDialog(String title, String message)

 

AlertDialog alertDialog = AlertDialog(

title: Text(title),

content: Text(message),

);

showDialog(

context: context,

builder: (_) => alertDialog

);

 

دانلود آهنگ نوستالوژی از رضا یزدانی


مخاطبین عزیز هم اینک شنونده قطعه جذاب و شنیدنی از خواننده خوش صدا کشور 🎻 رضا یزدانی بنام نوستالوژی 🎧 از وب آهنگ باشید

ترانه: حسن علیشیری, موزیک: محمد خرمی نژاد, تنظیم: محمد خرمی نژاد

Download New Music By: 🎻 Reza Yazdani Called Nostalgia 🎧 With Text And Direct Links In The ► webahang.ir

دانلود آهنگ نوستالوژی از رضا یزدانی

برای دانلود بروی لینک زیر کلیک نمایید

دانلود آهنگ نوستالوژی از رضا یزدانی

دانلود آهنگ نوستالوژی از رضا یزدانی

🎸متن آهنگ رضا یزدانی نوستالوژی🎸

───|♫🎤🎻🎤♪|───

♔پشت خط قرمز ترانه ها

♔عابر یه شهر گمشده تو دود

♔راوی خاطره های زخمی ام

♔پر نوستالوژی روزای کبود

♔پر بغضم پر بهت و انتظار

♔انتظاری عبس و پوچ و محال

♔انتظار با تو همسفر شدن

♔دوباره میون جاده ی شمال

♔دلم پره بیا بازم با هم دیگه بریم سفر

♔جای ما اونجا خالیه منو ببر منو ببر

♔یه عمره جاده ی شمال منتظر عبور ماست

♔نمی دونه یکی از اون دوتا قناری بی صداست

♔من پر از خواب های نیمه کاره ام

♔پر یاد روزای رفته به باد

♔چشامو می بندمو وا میکنم

♔تا شاید عطرت به خاطرم بیاد

♔تا شاید دوباره همسفر بشیم

♔توی جاده ای به مقصد جهان

♔با همون پیکان قراضه که یه روز

♔یکی جاش گذاشت کنار اتوبان

♔یه پیکان قراضست ولی توی رویاش

♔هنوزم جوونه خیالش میتونه

♔بازم توی جاده یه کله برونه

♔خیالش هنوزم موتور مونده باقی

♔تو صندوق سینه یه پیکان قراضه

♔کنار اتوبان داره خواب میبینه

♔از کنار کودکی هام میگذرم

♔از رهاترین روزای زندگی

♔کاش می شد یه لحظه تکرار بشه

♔اون هوای سر به زیر سادگی

♔کاش میشد دوباره پا به پا بشیم

♔کاش می شد حتی شده واسه یه بار

♔کودکانه ها دوباره گل کنن

♔تو عبور از خیابون لاله زار

♔لاله زار کاش میتونستیم همیشه

♔بچه بمونیم عمو زنجیر باف و بازم

♔توی کوچت بخونیم

♔لیموناد شیشه ای دوزار لواشک

♔برگی یه شاهی

♔بابا نون نداد نوشتن توی دفترای کاهی

♔لاله زاری که هنوز تو کوچه هاش

♔خاطره های ما پرسه میزنه

♔سر کوچه ملیش مردی که

♔داره توی رویاهاش جون می کنه

♔سر کوچه ملی یه مرد یه مرد

♔که سی سال پیش ساعتش یخ زده

♔نمی دونه دنیا چه رنگی شده

♔نمی دونه کی رفته کی اومده

♔سر کوچه ملی یه مرد یه مرد

♔توی پالتوی کهنه ی عهد بوق

♔داره عابرا رو نگاه میکنه

♔که رد میشن از کوچه های شلوغ

♔حیف نمیشه به عقب برگردیم

♔به شبای پرسه و در به دری

♔کافه چی دکمه ی برگشت و بزن

♔به روزای خوب کافه نادری

♔چشمک ستاره هارو شمردیم یادته

♔واسه تنهایی شب غصه میخوردیم یادته

♔من مثه سایه ی تو تو واسه من مثه نفس

♔هر دومون برای همدیگه میمردیم

♔یادتــــــــه …

───|♫🎤🎻🎤♪|───

برای حمایت از صاحب این اثر لینک این پست را در صفحات اجتماعی خود به اشتراک بگذارید.

همچنین خواهشمندیم با نظرات و پیشنهادات خود ما را یاری بفرمایید.

کلام آخر در صورت مشاهده مشکل در متن آهنگ ، پست و یا غیر مجاز بودن پست از طریق فرم تماس به ما اطلاع بدهید.

دانلود آهنگ یادم نده از رضا شیری


مخاطبین عزیز میتوانید اینک شنونده قطعه غمگین از خواننده محبوب و پرطرفدار کشورمان 🎻 رضا شیری بنام یادم نده 🎧 از وب آهنگ باشید

ترانه: رضا شیری, موزیک: رضا شیری, تنظیم: سعید سام

Download New Music By: 🎻 Reza Shiri Called Yadam Nade 🎧 With Text And Direct Links In The ► webahang.ir

دانلود آهنگ یادم نده از رضا شیری

برای دانلود بروی لینک زیر کلیک نمایید

دانلود آهنگ یادم نده از رضا شیری

دانلود آهنگ یادم نده از رضا شیری

✍متن آهنگ رضا شیری یادم نده✍

───|♫🎤🎻🎤♪|───

میگی فقط منم مقصرم►▴

میگی خبر نداری از دلم►▴

میری با اینکه تو خوب میدونی►▴

کارات خیلی رو من موثرن►▴

رفتی با غریبه چطور من میتونم مابقی عمرمو بی تو سر کنم►▴

من نمیتونم که هیچ وقتی به تو بد کنم►▴

حالم بده تورو خدا عذابم نده►▴

واسم بده بد بودنو یادم نده►▴

حالم بده تورو خدا عذابم نده►▴

واسم بده بد بودنو یادم نده►▴

تو بدترین شرایط با تو بودم تو بودی تار و پودم►▴

فکر نمیکردم یه روز بخوای بازی کنی تو با غرورم►▴

همش تو فکر خودت میشینم یه گوشه►▴

دلم تو لاک خودش نگران آبروشه►▴

اینو خوب میدونم بدون تو میمیرم►▴

همین روزا خبرش میرسه به گوشت►▴

حالم بده تورو خدا عذابم نده►▴

واسم بده بد بودنو یادم نده►▴

حالم بده تورو خدا عذابم نده►▴

واسم بده بد بودنو یادم نده►▴

───|♫🎤🎻🎤♪|───

برای حمایت از صاحب این اثر لینک این پست را در صفحات اجتماعی خود به اشتراک بگذارید.

همچنین خواهشمندیم با نظرات و پیشنهادات خود ما را یاری بفرمایید.

کلام آخر در صورت مشاهده مشکل در متن آهنگ ، پست و یا غیر مجاز بودن پست از طریق فرم تماس به ما اطلاع بدهید.

دانلود آهنگ نفس از علی عباسی


مخاطبین گرامی امروز شنونده آهنگ عاشقانه و احساسی از خواننده پرطرفدار 🎻 علی عباسی بنام نفس 🎧 از وب آهنگ باشید

ترانه: مهرزاد امیرخانی, موزیک: علی عباسی, تنظیم: مصطفی مومنی و ناصر عباسی

Download New Music By: 🎻 Ali Abbasi Called Nafas 🎧 With Text And Direct Links In The ► webahang.ir

دانلود آهنگ نفس از علی عباسی

برای دانلود بروی لینک زیر کلیک نمایید

دانلود آهنگ نفس از علی عباسی

✍متن آهنگ علی عباسی نفس✍

───|♫🎤🎻🎤♪|───

کاری به کار تو ندارم نرو¶☊

من که روی چشمام میذارم تو رو¶☊

تو تکیه گاهی واسه من آخه هنوزم¶☊

مرگه برام این زندگی بی تو یه روزم¶☊

بمون تا نذاری بسوزم¶☊

مهره مار روزگارمی عشق موندگارمی نفس¶☊

واسه تو مردنم برای من یه اتفاق سادس¶☊

مهره مار روزگارمی عشق موندگارمی نفس¶☊

واسه تو مردنم برای من یه اتفاق سادس ¶☊

از عشق بدجوری مریضم بمون¶☊

جونم بهت بستس عزیزم بمون¶☊

وابستم اندازه نفس کشیدن¶☊

تکیه زدی به تاج و تخت این دل من¶☊

کی بیشتر دیوونه ست تو یا من¶☊

مهره مار روزگارمی عشق موندگارمی نفس¶☊

واسه تو مردنم برای من یه اتفاق سادس¶☊

مهره مار روزگارمی عشق موندگارمی نفس¶☊

واسه تو مردنم برای من یه اتفاق سادس¶☊

───|♫🎤🎻🎤♪|───

برای حمایت از صاحب این اثر لینک این پست را در صفحات اجتماعی خود به اشتراک بگذارید.

همچنین خواهشمندیم با نظرات و پیشنهادات خود ما را یاری بفرمایید.

کلام آخر در صورت مشاهده مشکل در متن آهنگ ، پست و یا غیر مجاز بودن پست از طریق فرم تماس به ما اطلاع بدهید.

دانلود آهنگ بدون تاریخ بدون امضا از روزبه بمانی


مخاطبین این رسانه امروز شنونده قطعه جذاب و شنیدنی از خواننده محبوب و ترانه سرا پرطرفدار 🎻 روزبه بمانی بنام بدون تاریخ بدون امضا 🎧 از وب آهنگ باشید

ترانه: روزبه بمانی, موزیک: احسان نی زن, تنظیم: معین راهبر

Download New Music By: 🎻 Roozbeh Bemani Called Bedoone Tarikh Bedoone Emza 🎧 With Text And Direct Links In The ► webahang.ir

دانلود آهنگ بدون تاریخ بدون امضا از روزبه بمانی

برای دانلود بروی لینک زیر کلیک نمایید

دانلود آهنگ بدون تاریخ بدون امضا از روزبه بمانی

🎶

🎶

🎶

🎙متن آهنگ روزبه بمانی بدون تاریخ بدون امضا🎙

───|♫🎙🎻🎙♪|───

این زندگیمونه یه سفره ی خالی کف خونه این زندگیمونه با ما کسی جز ما نمیمونه

هر روزمون اینه آیینمون حتی مارو نمیبینه هر روزمون اینه تشویش و بغض و حسرت و کینه

روزا هلاک نون شب نون زدن تو خون بیرون و تو زندون این زندگیمونه

چاقوی تو مشتم جا مونده تو پشتم من بچمو کشتم هرشب تو این خونه

تو حس زخمای مارو نمیفهمی تقدیر اگه اینه دنیا چه بی رحمی دنیا چه بی رحمی

با این همه بغضو تو این همه سختی هر جا بگی گشتم دنبال خوشبختی دنبال خوشبختی

دور گلوی ما از بس پر از نیشه جای نوازش هم خون مردگی میشه خون مردگی میشه

دست غرورم نیست اشکی که میریزه لعنت به اشکی که بی موقع میریزه بی موقع میریزه

روزا هلاک نون شب نون زدن تو خون بیرون و تو زندون این زندگیمونه

چاقوی تو مشتم جا مونده تو پشتم من بچمو کشتم هرشب تو این خونه

تو حس زخمای مارو نمیفهمی تقدیر اگه اینه دنیا چه بی رحمی دنیا چه بی رحمی

با این همه بغضو تو این همه سختی هر جا بگی گشتم دنبال خوشبختی دنبال خوشبختی

دور گلوی ما از بس پر از نیشه جای نوازش هم خون مردگی میشه خون مردگی میشه

دست غرورم نیست اشکی که میریزه لعنت به اشکی که بی موقع میریزه بی موقع میریزه

───|♫🎙🎻🎙♪|───

برای حمایت از صاحب این اثر لینک این پست را در صفحات اجتماعی خود به اشتراک بگذارید.

همچنین خواهشمندیم با نظرات و پیشنهادات خود ما را یاری بفرمایید.

کلام آخر در صورت مشاهده مشکل در متن آهنگ ، پست و یا غیر مجاز بودن پست از طریق فرم تماس به ما اطلاع بدهید.

افزودن Google reCAPTCHA نسخه ۳ به فرم PHP — به زبان ساده



تعداد بازدید ها:
0

در این مقاله با شیوه افزودن Google reCAPTCHA نسخه 3 به فرم PHP در یک وب‌سایت آشنا می‌شویم. آخرین نسخه reCAPTCHA نسبت به نسخه‌های قبلی متفاوت است، چون اصولاً نیازمند تعامل کاربر نیست در این راهنما با طرز کار آن آشنا می‌شویم و یک مثال عملی از آن می‌سازیم تا به طور کامل پیاده‌سازی آن را بشناسیم.

شما به عنوان مالک یک وب‌سایت باید همواره به دنبال راه‌حل‌های ضد اسپم قوی برای جلوگیری از اسپم شدن وب‌سایت خود باشید و بدین ترتیب تنها به نظرات معتبر امکان ورود به وب‌سایت بدهید. دیگر آن روزها که با استفاده از یک راه‌حل ساده CAPTCHA مبتنی بر متن می‌شد جلوی ربات‌های خرابکار را گرفت، سپری شده است.

از سوی دیگر، اگر از راه‌حل‌های ضد اسپم شخص ثالث برای وب‌سایت خود استفاده کرده باشید، این احتمال وجود دارد که از وجود راه‌حل reCAPTCHA که از سوی گوگل ارائه شده است، مطلع باشید. گوگل با عرضه نسخه‌های متعدد از reCAPTCHA آن را به تدریج قوی‌تر ساخته است تا بتواند اسپم‌ها را شناسایی و فیلتر کند. به طور خاص reCAPTCHA نسخه 2 یکی از بهترین نسخه‌های ضد اسپم شخص ثالث محسوب می‌شد.

امکان ادغام reCAPTCHA نسخه 2 در وب‌سایت به چند روش وجود دارد. نخستین روش چک‌باکس مشهور I’m not a robot است. یک روش دیگر نیز متد ناپیدایی است که در طی آن تعامل کاربر تنها در موارد مشکوک لازم است. در این راهنما به بررسی reCAPTCHA نسخه 3 می‌پردازیم که کلاً پنهان است و نیازی به تعامل کاربر ندارد. در بخش بعدی با طرز کار reCAPTCHA نسخه 3 آشنا می‌شویم و سپس یک مثال عملی از آن می‌سازیم تا بهتر با آن آشنا شویم.

طرز کار Google reCAPTCHA نسخه 3 چگونه است؟

مشهور است که یک تصویر به اندازه هزار کلمه گویا است. بنابراین در ادامه یک تصویر را می‌بینید که نشان می‌دهد وقتی Google reCAPTCHA نسخه 3 را در وب‌سایت قرار می‌دهید، در پس‌زمینه چه اتفاقاتی رخ می‌دهد.

Google reCAPTCHA

در ادامه این فرایند را به تفصیل توضیح می‌دهیم:

  1. کاربر نهایی یک صفحه وب را درخواست می‌کند.
  2. وب اپلیکیشن یا سرور، صفحه درخواستی را بازگشت می‌دهد که شامل کد reCAPTCHA v3 است.
  3. سپس کاربر فرم را پر کرده و روی دکمه تحویل کلیک می‌کند.
  4. پیش از تحویل داده‌های فرم به سرور، کد reCAPTCHA v3 در سمت کلاینت یک فراخوانی AJAX به سرور گوگل ارائه می‌کند و توکنی به دست می‌آورد. نکته مهم در این جا آن است که ما باید خصوصیت اکشن را با مقدار مناسبی در طی فراخوانی ای‌جکس ارسال کنیم. شما باید مقداری را ارسال کنید که فرم را شناسایی کند. این همان مقداری است که کاربر برای تأیید در سمت سرور همراه با پارامترهای دیگر ارائه می‌کند.
  5. توکن به دست آمده در گام قبلی همراه با داده‌های دیگر فرم تحویل می‌شود. در اغلب موارد دو متغیر پنهان را پیش از ارسال به فرم الحاق می‌کنیم که شامل توکن و اکشن است.
  6. زمانی که فرم تحویل شد، باید گام اعتبارسنجی را اجرا کنیم تا مطمئن شویم که فرم از سوی یک انسان ارسال شده است. در گام نخست، یک درخواست POST ارسال می‌کنیم تا توکن پاسخ را تأیید کنیم. درخواست POST توکن را همراه با رمز گوگل به سرور گوگل ارسال می‌کند.
  7. پاسخ یک شیء JSON است و از آن استفاده می‌کنیم تا بفهمیم آیا فرم از سوی انسان تحویل شده است یا ربات. قالب شیء JSON در قطعه کد زیر نمایش یافته است:



سه بررسی وجود دارد که باید اجرا کنیم تا مطمئن شویم داده‌ها امن هستند و به پردازش فرم بپردازیم. نمره پاسخ باید بالاتر از 0.5 باشد و مشخصه success باید به صورت TRUE باشد. علاوه بر آن باید مقدار اکشن پاسخ را با مقدار اکشن متغیر پنهان که همراه با فرم تحویل شده است، مقایسه کنیم.

API مربوط به reCAPTCHA v3 بدون درگیر کردن کاربر، یک نمره مشخص برای هر درخواست بازگشت می‌دهد. نمره پاسخی که دریافت می‌کنید، بر اساس تعامل کاربر با وب‌سایت است که مواردی از قبیل فشرده شدن کلیدها و حرکت‌های ماوس را شامل می‌شود. reCAPTCHA v3 این موارد را بر اساس ترافیک واقعی روی وب‌سایت می‌فهمد. بنابراین ممکن است نمره‌ها در شرایط متفاوت، شرایط مختلفی داشته باشد. برای شروع می‌توانید از آستانه 0.5 استفاده کنید و در ادامه بسته به نیازهای خاص خود آن را تنظیم کنید. بدین ترتیب به طور کلی با فرایند طرز کار reCAPTCHA v3 آشنا شدیم. در بخش بعدی با شیوه ثبت یک وب‌سایت در گوگل و گرفتن کلید سایت و رمز سایت آشنا خواهیم شد.

ثبت کلید و رمز reCAPTCHA v3

کتابخانه Google reCAPTCHA از شما می‌خواهد که پیش از استفاده عملی آز آن، کلیدهایی برای دامنه‌تان ثبت کنید. در این بخش با شیوه ثبت آن آشنا می‌شویم. ابتدا به پنل ادمین reCAPTCHA (+) بروید تا لینکی به دست آورید که فرمی در اختیار شما قرار می‌دهد تا چند مورد را به صورتی که در تصویر زیر می‌بینید وارد نمایید:

Google reCAPTCHA

در فیلد reCAPTCHA Type گزینه reCAPTCHA v3 را انتخاب کنید. در فیلد Domains و Owners اطلاعات لازم را وارد کنید سپس شرایط استفاده را خوانده و موافقت کنید. در نهایت روی دکمه Submit کلیک کنید تا تنظیمات ذخیره شوند.

به محض تحویل فرم، گوگل کلید سایت و رمز سایت را برای دامنه شما تولید می‌کند که در تصویر زیر دیده می‌شوند:

Google reCAPTCHA

این موارد را کپی کرده در جایی یادداشت یا ذخیره کنید، زیرا در ادامه برای ساخت مثال عملی خود به آن‌ها نیاز خواهیم داشت.

ساخت مثال واقعی

در بخش قبلی اطلاعات احراز هویت مورد نیاز را که در زمان راه‌اندازی reCAPTCHA v3 لازم هستند به دست آوردیم. در این بخش یک مثال عملی می‌سازیم تا با شیوه یکپارچه‌سازی آن در یک صفحه وب PHP آشنا شویم.

ما دو فایل PHP به نام‌های subscribe_newsletter_form.php و subscribe_newsletter_submit.php می‌سازیم.

  • فایل subscribe_newsletter_form.php برای نمایش فرم اشتراک خبرنامه استفاده می‌شود و به کاربر امکان می‌دهد که نشانی ایمیل را وارد کرد و در خبرنامه وب‌سایت مشترک شود.
  • فایل subscribe_newsletter_submit.php فرایند تحویل فرم را مدیریت کرده و اعتبارسنجی ضروری را اجرا می‌کند.

ساخت فرم اشتراک خبرنامه

در این مرحله فایل subscribe_newsletter_form.php را با محتوای زیر ایجاد می‌کنیم:


در ادامه بخش‌های مهم کد فوق را توضیح می‌دهیم. ابتدا کتابخانه جاوا اسکریپت reCAPTCHA را در بخش <head> بارگذاری می‌کنیم. لازم است اشاره کنیم که باید site key را به صورت یک پارامتر رشته‌ای کوئری render=YOUR_SITE_KEY ارسال کنید. ضمناً باید کتابخانه jQuery را نیز بارگذاری کنید به طوری که بتوانید از متدهای کاربردی مرتبط با فرم استفاده کنید. البته استفاده از جی کوئری ضرورتی ندارد و شما می‌توانید از هر کتابخانه دیگر بسته به انتخاب خود استفاده کنید و یا حتی از جاوا اسکریپت خالص بهره بگیرید.

سپس یک فرم ساده ایجاد می‌کنیم که شامل کادر متنی برای وارد کردن نشانی ایمیل و دکمه تحویل است. در نهایت قطعه کد جاوا اسکریپت دیگری در انتهای فایل وجود دارد که بخش کلیدی پیاده‌سازی reCAPTCHA محسوب می‌شود. در این بخش دستگیره تحویل جی کوئری را برای فرم ایجاد کرده‌ایم، به طوری که وقتی کاربر فرم را تحویل داد، آن رویداد را دریافت کرده و پردازش‌های لازم را پیش از تحویل واقعی فرم انجام دهیم. ما از تابع ()event.preventDefault برای توقف تحویل فرم از محل معمول آن استفاده کرده‌ایم.

سپس شیء grecaptcha اقدام به فراخوانی متد execute می‌کند که توکن را با اجرای یک فراخوانی ای‌جکس از سرور گوگل دریافت می‌کند. لازم به اشاره است که در زمان فراخوانی متد execute باید site key و action name را نیز ارسال کنیم. نام اکشن به ما امکان می‌دهد که تجزیه دقیقی از داده‌های در کنسول ادمین گوگل داشته باشیم. همچنین برای تأیید پاسخ reCAPTCHA از سوی سرور استفاده می‌شود که در ادامه آن را خواهیم دید.

زمانی که متد execute پاسخ توکن را دریافت می‌کند، توکن را به تابع بی‌نام عرضه شده در متد then ارائه می‌کند. سپس دو متغیر پنهان یعنی token و action را همراه با مقادیرشان به فرم ارائه می‌کنیم. در نهایت فرم را با فراخوانی متد When در جی کوئری تحویل می‌دهیم.

مدیریت تحویل فرم و اعتبارسنجی

در این بخش فایل subscribe_newsletter_submit.php را ایجاد کرده و کد زیر را برای مدیریت تحویل فرم در آن وارد می‌کنیم:


مهم‌ترین بخش پس از تحویل، تأیید توکن است که همراه با دیگر مقادیر فرم ارائه شده است. به این منظور باید یک درخواست POST با نشانی https://www.google.com/recaptcha/api/siteverify ارائه کنیم. ضمناً باید secret key و token را نیز به عنوان داده‌های POST ارسال کنیم. در مثال فوق، ما از تابع‌های PHP cURL برای ایجاد درخواست POST استفاده کرده‌ایم.

در پاسخ یک شیء JSON دریافت می‌کنیم که شامل اطلاعات ضروری است که می‌توان برای تأیید تحویل استفاده کرد. چنان که پیش‌تر بحث کردیم، دست‌کم باید سه مورد success، action و score را بررسی کنید تا مطمئن شوید که فرم از سوی یک انسان تحویل شده است.

سخن پایانی

در این مقاله به بررسی طرز کار و همچنین پیاده‌سازی عملی یکی از رایج‌ترین گزینه‌های ضد اسپم شخص ثالث به نام Google reCAPTCHA v3 پرداختیم. به این ترتیب با روش عملی استفاده و یکپارچه‌سازی آن در وب‌سایت‌های PHP آشنا شدیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

telegram
twitter