PDA

View Full Version : طراحی مناسب برای ویزارد



pswin.pooya
دوشنبه 18 آذر 1392, 23:43 عصر
سلام

ویزارد ها در وب کاربردهای زیادی دارن. مثلا فرایند ثبت نام در دانشگاه، کنکور، خرید بیلیط و فروش و ... . دوستان من دنبال یک طراحی ( Design) مناسب برای پیاده سازی این نمونه از ویزارد ها هستم

بهزاد علی محمدزاده
سه شنبه 19 آذر 1392, 10:36 صبح
سلام ... آقا سیستم عامل کجا اینجا کجا ؟ من گاهی وبلاگ شما رو دنبال می کردم ...

منظورت از ویزارد چیه ؟ طراحی رابط کاربری ؟ یا طراحی فرآیند ها ؟

سوالات قبلی که پرسیده بودی من با Angularjs کار نکرده بودم . اما اینجا (http://www.dotnettips.info/) مطالب خوبی در مورد کار با این کتابخانه هست که فکر می کنم پاسخ سوال شما هم درش هست .

MMSHFE
سه شنبه 19 آذر 1392, 11:01 صبح
برای کار با Wizardها باید از مدیریت Session یا Cookie درکنار یک قالب مناسب برای نمایش مثل Bootstrap و امثال اون (برای جذابیت فرم) یا jQueryUI و YUI و... برای ایجاد حالت Tab در صفحه استفاده کنید.

pswin.pooya
سه شنبه 19 آذر 1392, 11:24 صبح
سلام ... آقا سیستم عامل کجا اینجا کجا ؟ من گاهی وبلاگ شما رو دنبال می کردم ... سلام
آقا دارم یه CMS بنا به سفارش طراحی می کنم که از اون توی همون وبلاگ هم به زودی استفاده می کنم.



منظورت از ویزارد چیه ؟ طراحی رابط کاربری ؟ یا طراحی فرآیند ها ؟

برای کار با Wizardها باید از مدیریت Session یا Cookie درکنار یک قالب مناسب برای نمایش مثل Bootstrap و امثال اون (برای جذابیت فرم) یا jQueryUI و YUI و... برای ایجاد حالت Tab در صفحه استفاده کنید.

بذارید بهتر توضیح بدم. هر ویزارد از یه جنبه هایی شبیه ماشین های FSM است. با این فرق که loop بینهایت نداره. یعنی اینکه از یکسری مرحله (صفحه) تشکیل شده که من دوست دارم اون رو state نام گذاری کنم. در هنگام ورود به هر وضعیت (state) باید ورودی های قبلی چک بشن ( برای امنیت بیشتر و جلوگیری از برخی از نفوذ ها ) و همچنین در هنگام خروج باید ورودی های جدید بررسی بشن. مثلا برای روند خرید کالا یک همچین ماشین وضعیتی (FSM) خواهیم داشت:

انتخاب کالا ->‌وارد کردن مشخصات فردی -> انتخاب سامانه پرداخت -> پرذاخت بانک -> برگشت از بانک و تایید و ...

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

MMSHFE
سه شنبه 19 آذر 1392, 11:37 صبح
خوب شما توی سشن یا کوکی کلاینت، آرایه بسازین برای Stepها و هر Step، خودش باز یک آرایه است شامل انتخابهای کاربر یعنی وقتی به مرحله قبل یا بعد میره، اطلاعات فرم موجود در همون مرحله توی خونه موردنظر از آرایه سشن ذخیره میشه. اینطوری توی هر مرحله میتونید چک کنید سشن مراحل قبل وجود داره یا نه.

pswin.pooya
سه شنبه 19 آذر 1392, 12:31 عصر
چیزی که فعلا تو ذهنم هست یه چیزی شبیه کد زیر است:


<?php
//################################################## ############################
//# title: Wizard Manager
//# c-date: Dec-10-2013
//# author: Pooya Shahinfar (Pswin) - pswinpo@gmail.com
//################################################## ############################


interface iState
{
//! executes when when we start state
public function enter();

//! exectues when we are in the state
public function execute();

//! executes when we exit
public function exit();
}

class WizardManager
{
//====================
// public members
//====================

//! parent
public $parent = null;

//====================
// public methods
//====================

//! change state
public function changeState( $_new_state )
{
//! call exit method from current state
if ( $this->cur_state != null )
{
$this->cur_state->exit();
}

//! change state
$this->cur_state = $_new_state;

//! call enter method of new state
$this->cur_state->enter();
}

//! changes global state
public function changeGlobal( $_new_state )
{
//! call exit method from current state
if ( $global_state != null )
{
$this->global_state->exit();
}

//! change global state
$this->global_state = $_new_state;

//! call enter method of new gloabl state
$this->global_state->enter();
}

//! run
public function execute()
{
if ( $this->cur_state != null )
{
$this->cur_state->execute();
}

if ( $this->global_state != null )
{
$this->global_state->execute();
}
}

//! validation
public function validate( $_seq )
{
// converting checking seqance into an array
$ar = implode( '->', $_seq );

//! checking for array
if ( !is_array( $ar ) ) return false;

try
{
foreach ( $ar as $i => $key )
{
if ( $this->parent->$key() == false )
{
return false;
}
}
}
catch( Exception $ex )
{
// set_error('10114E101');
// log_error('Error in wizard: '. $ex->getMessage() );
return false;
}

return true;
}

//====================
// private members
//====================

//! current state
private $cur_state = null;

//! previous state
private $prv_state = null;
}

?>

البته فعلا تستش نکردم.

اصول کار اینجوری که شما برای هر کدو از مراحل یک کلاس از کلاس iState میسازید ( حالا میتونید این کلاس رو در همون فایل یا فایلهای جدا بذارید). بعد به کمک متد changeState از مدیر ویزارد وضعیت رو عوض می کنید.

حالا چرا هر وضعیت سه تا تابع داره:

۱. تابع enter: زمانی است که برای اولین بار وضعیت رو اجرا می کنید. می تونید از اون برای بررسی داده های وضعیت های قبلی استفاده کنید.
۲. تابع execute: زمانی است که وضعیت تکرار میشه. برای مواقعی که کاربر مثلا داده های رو تو فروم اشتباه وارد کرده به درد می خوره
۳. تابع exit: زمانی است که از وضعیت خارج میشید. می تونید از اون برای چک نهایی داده ها استفاده کنید.

حالا با هر بار رفرش صفحه شما کافیه متد execute از مدیر ویزارد رو اجرا کنید و بقیه کارها اتوماتیک انجام میشه.

من تو کد زنی متوجه شدم که بیشترین کدها مربوط به چک داده های کاربره برای همین متد validate رو اضافه کردم که یک رشته به صورت زیر میگیره:


check_info->chek_user-> ...

حالا هر کدوم از عبارتهای بین -< یک متد در کلاس پدر است که می تونید اون رو به کمک عضو parent از کلاس مدیر ویزاد ست کنید. این متدها باید مقدار true یا false بر گردونن که اعتبار داده ها رو نشون بدن.

MMSHFE
سه شنبه 19 آذر 1392, 13:05 عصر
خوب این روش هم روش خوب و کاملیه و میتونید با Serializeکردن یا json_encode و...، اشیاء رو توی سشن یا کوکی یا دیتابیس یا هرجای دیگه که بخواین، نگهداری کنید.

pswin.pooya
سه شنبه 19 آذر 1392, 13:20 عصر
خوب این روش هم روش خوب و کاملیه و میتونید با Serializeکردن یا json_encode و...، اشیاء رو توی سشن یا کوکی یا دیتابیس یا هرجای دیگه که بخواین، نگهداری کنید.



اینم ایده خوبیه. همین الان داشتم رو همین کار می کردم که چه شکلی وضعیت و پارامترهای اون رو نگهداری کنم. فقط اگر اندازه داده سریالی شده بزرگ بشه مشکل ایجاد نمی کنه؟! ( از نظر ذخیره توی session‌)

MMSHFE
سه شنبه 19 آذر 1392, 13:44 عصر
تو شرایط عادی نه ولی اگه تعداد بازدید همزمانتون بالا بره، چون سشن توی رم سرور ذخیره میشه، به سرور فشار میاره و از اونجا که اطلاعات ویزارد برای هر کاربر، فقط به درد خودش میخوره و مختص هر کاربره و معمولاً هم تا وقتی توی دیتابیس ثبت نشده، امنیتش مهم نیست، بهتره از کوکی برای اینکار استفاده کنید که برای هر کاربر، روی کامپیوتر خودش ذخیره بشه. با کمک کوکی حتی میشه براش طول عمر هم بگذارین تا در دفعات بعدی که به سایت مراجعه میکنه (مثلاً تا 2 هفته) بتونه بقیه Wizard رو انجام بده.