# زبان های اسکریپتی > PHP > Laravel Framework >  فیلد های دلخواه در سیستم فروشگاهی

## rahahost

سلام خدمت همه دوستان :)

در حال طراحی یه سیستم فروشگاهی هستم که متاسفانه در موردی به مشکل برخوردم که ممنون میشم راهنمایم کنید :

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

میخوام بدونم با چه روشی باید این کارو انجام بدم ؟
چند جدول باید داشته باشم ؟
ارتباط ها باید چطوری باشه ؟

موقع ثبت اطلاعات ، هر دسته ای که انتخاب شده ، باید فیلدهای همون دسته بارگذاری بشه ،، بنابر این باید موقع ذخیره چطوری عمل کنم ؟
منظورم اینه که چطوری باید فیلد رو ذخیره کنم ؟ 

امکانش هست ساختار جدولش رو برام ترسیم کنید ؟
واقعا در این مورد به مشکل برخوردم !

متشکرم .

----------


## wallfa

باید بهتر توضیح بدی : 
ولی چیزی که داخل ذهن منه 
1- جیسون اطلاعات و ذخیره اونها در دیتابیس 
2- جدولی که ای دی هر محصول بگیره و ذخیره کنه و جلوش اسم فیلد خاص و در نهایت ذخیره اطلاعات خاص

----------


## ni.alpr

فکر می کنم بهترین کار این باشه که دیتابیس فروشگاه ساز های موجود رو یکم مطالعه کنید. معمولا از meta-data ها برای این کار استفاده می کنن.

*Magento Database Diagrams*
*MS2 Database Schema
*
پ ن : ضمنا این سوالتون بیشتر مربوط به دیتابیس می شه .

----------


## rahahost

> فکر می کنم بهترین کار این باشه که دیتابیس فروشگاه ساز های موجود رو یکم مطالعه کنید. معمولا از meta-data ها برای این کار استفاده می کنن.
> 
> *Magento Database Diagrams*
> *MS2 Database Schema
> *
> پ ن : ضمنا این سوالتون بیشتر مربوط به دیتابیس می شه .


لینکی که دادید خیلی مفید بود اما این جداول خیلی پیچیدگی داره که شاید لازم به این همه پیچیدگی نباشه !

  چهار بخش کاملا مشخصه :
1 - یک جدول برای دسته محصولات لازمه
2 - یک جدول برای فیلدها لازمه
3 - یک جدول برای مشخص کردن اینکه کدوم فیلد مربوط به کدوم دسته هست
4 - جدول محصولات 

یک گروه ایجاد میشه و درون جدول گره های محصولات ثبت میشه 
چند فیلد برای اون دسته ثبت میشه و آی دی های دسته و فیلد درون جدول مشترک ( جدول شماره 3 که بالا اشاره کردم )

تا این بخش مشکلی نیست 

مشکل از این به بعد شروع میشه که :
ما برای ثبت محصول ، فیلدهای دسته محصولات رو نمایش میدیم و اونهارو پر میکنید ، موقع ذخیره شدن ، این مقادیر اضافه شده ، باید کجا ذخیره بشه ؟

باید طوری باشه که اگه دسته پاک شد ، فیلدهای دسته هم پاک بشه ( که این مشکلی نیست و با caseCade ) حل میشه و اینکه اگه یک فیلد حذف شد ، مقدارش هم درون جدولی که مقدار رو ذخیره کرده ، حذف بشه !

یه عکس ضمیمه کردم که ارتباط هارو مشخص کردم درونش ولی متاسفانه هنوز نمیدونم باید برای ذخیره مقدار فیلدها 


ضمیمه 125870

----------


## MMSHFE

درمورد Redis تحقیق کنید. اگه نمیخواین از ساختارهای جدولی و RDBMSها خارج بشین، میتونید یک جدول داشته باشین با فیلدهای زیر:
product_id
attribute
value
که فیلد product_id کلید خارجی به جدول product هست و ترکیب فیلدهای product_id و attribute رو با هم کلید اصلی کنید. حالا میتونید مثلاً برای اینکه محصول شماره 5 خاصیتی به نام رنگ داشته باشه و مقدارش هم سفید باشه، رکوردی با مقادیر زیر ثبت کنید:
5
color
white
و الی آخر

----------


## rahahost

> درمورد Redis تحقیق کنید. اگه نمیخواین از ساختارهای جدولی و RDBMSها خارج بشین، میتونید یک جدول داشته باشین با فیلدهای زیر:
> product_id
> attribute
> value
> که فیلد product_id کلید خارجی به جدول product هست و ترکیب فیلدهای product_id و attribute رو با هم کلید اصلی کنید. حالا میتونید مثلاً برای اینکه محصول شماره 5 خاصیتی به نام رنگ داشته باشه و مقدارش هم سفید باشه، رکوردی با مقادیر زیر ثبت کنید:
> 5
> color
> white
> و الی آخر


جناب شهرکی ، ممنون از لطفتون :)

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

برای نمایش فیلد های هر دسته مشکلی ندارم ، مشکل در ذخیره کردنشه که مقدارهارو چطوری و تو چه جدولی و به چه شکلی ذخیره کنم ؟!

----------


## MMSHFE

خوب میتونید یک جدول جداگانه دیگه برای خصوصیتها داشته باشین که یک کلید خارجی به جدول دسته بندیها داره و اینطوری مشخص کنید هر فیلد مربوط به چه دسته ای هست و برحسب دسته مربوطه فیلدها رو نشون بدین. جدول مقادیر رو هم تغییر بدین تا بجای اسم خاصیتها کلید خارجی به جدول خصوصیتها ذخیره بشه. امیدوارم خوب توضیح داده باشم.

----------


## rahahost

> خوب میتونید یک جدول جداگانه دیگه برای خصوصیتها داشته باشین که یک کلید خارجی به جدول دسته بندیها داره و اینطوری مشخص کنید هر فیلد مربوط به چه دسته ای هست و برحسب دسته مربوطه فیلدها رو نشون بدین. جدول مقادیر رو هم تغییر بدین تا بجای اسم خاصیتها کلید خارجی به جدول خصوصیتها ذخیره بشه. امیدوارم خوب توضیح داده باشم.


قسمت اول توضیحاتتون رو انجام داده بودم که :
1 - جدول دسته محصولات ساختم
2 - جدول فیلدها رو هم ساختم
3 - کلید اصلی هر دو جدول رو در جدول دیگه ای کلید خارجی کردم که مشخص کنم هر فیلد مربوط به چه دسته ای هست .

قسمت دوم توضیحاتتون برام گنگ بود .
فرض کنید و فیلدهارو نمایش دادم ( زمانی که میخوام محصول رو ثبت کنم ) و مقادیرشو هم وارد کردم 
حالا این مقادیر باید درون یک جدول دیگه ثبت بشه که شامل آی دی فیلد ، آی دی محصول و مقدار فیلد میشه ؟

امکانش هست دیاگرام این ارتباط هارو برام رسم کنید ؟

واقعا ممنونم .

----------


## MMSHFE

بله دقیقاً :
یک ارتباط 1 به n داریم بین جدول categories و attributes ازطریق کلید خارجی توی جدول attributes
یک ارتباط 1 به n داریم بین جدول categories و products ازطریق کلید خارجی توی جدول products
یک ارتباط n به n داریم بین جدول products و attributes ازطریق جدول واسط productattributes (با دو کلید خارجی product_id و attribute_id) که توی همین جدول فیلد value هم داریم

اگه باز هم ابهامی هست بفرمایید.

----------


## rahahost

ممنونم جناب شهرکی عزیز :)

الان شکل جداول مشخصه و معلوم شده که باید ارتباط ها به چه شکلی باشه :)

مشکل دیگه که هست اینه که از دید من لاراول کمی محدود هست :

من الان میبایست کلید اصلی جدول محصولات و فیلدهارو در یک جدول دیگه بعنوان کلید خارجی ( با روش pivot ) به هم وصل کنم 

مشکل اینجاست که در این روش فیلد اضافه ای نمیشه قرار داد و مقدار هارو گرفتو ذخیره کرد و متد sync برای ذخیره فقط آی دی میگیره !

دوستان لاراولی لطفا راهنمایی کنید تا این بخش سوالم هم حل بشه 

متشکرم .

----------


## rahahost

یه تصویر هم ضمیمه میکنم که دقیقا به ساختار جدولم اشاره میکنه و معلومه کجایه کا اشکال دارم :)
1416466096831.jpg

----------


## rahahost

تا به حال فروشگاه طراحی نکردید با لاراول ؟
این بخش رو اصلا نداشتین ؟

دوستان یه نظری ، پیشنهادی چیزی .... !

----------


## ni.alpr

می خواستم همینجا جوابتون رو بنویسم اما واقعا کد نوشتن تو اینجا سخته.

 laravel یه دستور withPivot داره که در ادامه ی  BlongsToMany زنجیر میشه و می تونید باهاش فیلدهای اضافه ای که در pivot دارید رو بهش بدید. 

اینجا رو مطالعه کنید به جوابتون می رسید :  *Laravel 4 :pivot table example* 

یادتون باشه لاراول توی مدیریت داده ها خیلی غنی هست ، همچین چیزایی حتما براش در نظر گرفته شده .

----------


## rahahost

> می خواستم همینجا جوابتون رو بنویسم اما واقعا کد نوشتن تو اینجا سخته.
> 
>  laravel یه دستور withPivot داره که در ادامه ی  BlongsToMany زنجیر میشه و می تونید باهاش فیلدهای اضافه ای که در pivot دارید رو بهش بدید. 
> 
> اینجا رو مطالعه کنید به جوابتون می رسید :  *Laravel 4 :pivot table example* 
> 
> یادتون باشه لاراول توی مدیریت داده ها خیلی غنی هست ، همچین چیزایی حتما براش در نظر گرفته شده .



این موردو قبلا دیده بودم امام متاسفانه متوجه نشدم !
امکانش هست طبق جداولی که عکسش رو گذاشتم ، یه نمونه برام مثال بزنید ؟

طبق جدول من ، جدول مشترک بین محصولات و فیلدها ( product_product_group_field ) هست :
 یک فیلد باید بهش اضافه کنم ( اضافه کردن رو باید دستی انجام بدم یا php artisan ... ?) ؟
واسه اینکه در زمان ثبت محصول ، دو مقدار product_id  و product_field_id  به همراه مقدارش رو ثبت کنم ، باید چه کاری انجام یدم ؟

یه مثال بزنید ممنونتون میشم :)

منابع فارسی کمی داریم متاسفانه !

----------


## rahahost

مشکلم رفع شد ، دوستان اگر با مشکلی که من داشتم مواجه شدن ، بگن تا روش رو خدمتشون ارائه بدم :)

----------


## rahahost

سلام مجدد خدمت همه دوستان .

در امتداد مشکلی که داشتم ، مسئله ی جدیدی پیش اومد برام که ممنون میشم یه راهنمایی بکنید تا رفعش کنم :

من درون کنترلرم فیلد های هر دسته از محصولات رو فراخوانی کردم ( بصورت جی کوئری ایجکس ) و هر اینپوت رو با نام آرایه ای نام گذاری کردم :



public function getGroups()
    {
        $id = Input::get('id');
        $group = Productgroup::find($id);
        if($group)
        {
            if(count($group->productfields) >= 1)
            {
                foreach ($group->productfields as $field){

                    echo '
                    <div id="showfields" class="col-lg-12 form-group field">
                    <label for="product_gid" class="col-sm-2">'.$field->fieldname.' : </label>
                    <div class="col-sm-10">
                        <input type="text" name="productfield['.$field->id.']" id='.$field->id.' class="form form-control" placeholder='.$field->fieldname.' />
                    </div>
                    </div>
                    ';
                }
            }
            else
            {
                echo '
                    <div id="showfields" class="col-lg-12 form-group field">
                    <label for="product_gid" class="col-sm-2">فیلد های محصول </label>
                    <div class="col-sm-10">
                        در این دسته فیلدی وجود ندارد .
                    </div>
                    </div>
                    ';
            }
        }
        else
        {
            return 'چنین دسته ای وجود ندارد ، لطفا مجددا تلاش نمایید .';
        }
        
    }




حالا ، خروجی کد من ، زمانی که مقدار های هر فیلد رو وارد میکنم و ارسال میکنم ، به این شکل هست :

array(1) {   [0]=>   array(5) {     [26]=>     string(6) "512 MB"     [27]=>     string(9) "4400 Mghz"     [28]=>     string(0) ""     [29]=>     string(6) "512 GB"     [30]=>     string(5) "12 GB"   } }


یعنی : آی دی هر فیلد و مقدار همون فیلد 

حالا من چطور میتونم این دو مقدار رو درون جدول مشترک بین فیلدها و محصولات ، همراه با مقدارشون ثبت کنم ؟
یعنی آی دی محصول ثبت شده + آی دی فیلد ثبت شده + مقدار فیلد رو درون جدول product_productfield ثبت کنم ؟

ممنون میشم راهنماییم کنید .

----------


## rahahost

الان فهمیدم که با روش زیر میشه اما یه آی دی رو قبول میکنه برای فیلد و مقدارش رو میتونم بدم اما من میخوام تعداد زیادی فیلد ( که تعدادشم معلوم نیست ) 



$product->productfields()->sync(array(35 => array('value' => '12 GB')));



مقدار هایی که من دارم ( همونطزور که تو پست قبلی گفتم ) آرایه هست که شامل ای دی فیلد و مقدار همون فیلد میشه !
حالا موندم چطوری باید برای تمام فیلد و مقدار ها ، با متد sync ، مقدار اضافه کنم و ذخیره کنم ؟!

----------


## rahahost

تو این انجمن سوالات زیادی پرسیدم که اکثرا به جواب نرسید !

نمیدونم دوستان تا به حال به همچین مشکلاتی برخورد نکردن یا اینکه مشکل دیگران براشون اهمیت نداره !

خوشبختانه تا به حال نشده جواب سوالی رو بدونم و راهنمایی نکنم البته در اون حد نیستم که خودمو .... !

به هر حال ؛ از تاریخ ایجاد این تاپیک تا الان حدود 16 روز گذشته ،بعضی از دوستان راهنماییم کردن ، بعضی ها هم حتی به پیام خصوصیشونم نگاه نکردن ;)

گلایه ای نیست ولی حتما شما هم یه همچین مراحلی رو طی کردید و حتا سوالاتی رو مطرح کردید ، دوست داشتم بدونم وقتی جواب نمیگیرید ، ناراحت و نامید میشین یا نه !


ممنون بابت راهنمایی ها !

جواب این سوالم اینطور میشه که دوستان دیگه اگه به مشکل برخوردن ، بتونن حلش کنن :



$fieldids = Input::get('productfield');
                    $callback_array = array();
                    foreach ($fieldids as $fieldid => $value)
                    {
                        $callback_array[$fieldid] = array("value" => $value);
                    }

                    $product->productfields()->sync($callback_array);

----------


## rahahost

و باز هم مشکلی دیگه !

محصول با موفقت ثبت میشه و مشکلی در این مورد نیست .
حالا فرضا میخوایم ویرایشش کنیم ، این فیلدهایی که پر شدن بودن و ذخیره کرده بودیم باید به همراه فیلد هایی که خالی هستن باگذاری بشه تا اگه کاربر خواست ، ویرایشش بکنه و یا یک فیلد رو به خواسته خودش پر و یا خالی کنه !

برای نمایش فیلد ها باید چیکار کنم ؟

----------


## nasirb

> حالا فرضا میخوایم ویرایشش کنیم ، این فیلدهایی که پر شدن بودن و ذخیره کرده بودیم باید به همراه فیلد هایی که خالی هستن باگذاری بشه تا اگه کاربر خواست ، ویرایشش بکنه و یا یک فیلد رو به خواسته خودش پر و یا خالی کنه !


باید تمام فیلد ها را چه پر شده و چه نشده را نمایش بدید به خاطر اینکه ویرایش فقط پر کردن فیلدهای خالی نیست !!! بلکه ممکنه شما غلط املای داشته باشید و بخواهید اونو ویرایش کنید و ...




> برای نمایش فیلد ها باید چیکار کنم ؟


باید مشخصات محصولی که می خواهید رو بر اساس ستونی Uniqe ای که در جدول set کردید رو فراخوانی کنید . به طور مثال بر اساس id (معمولش هم همینه) . بعد بیایید یک صفحه درست کنید که بر اساس و تعداد فیلد هایی که نیازه(حالا ممکنه پر شده باشه یا نه و بستگی به database داره ) input بذارید و البته حواستون باشه همه ی این input ها داخل یک Form باشه . نکته مهم اینجا اینکه باید action  این فرم رو بر اساس id محصول به یک Route بفرستید ! به طور مثال :

saveEdit/{id}
 بعد مقادیری که از db گرفتید رو داخل value های این input ها قرار می هید حالا ممکنه پر شده باشه یا نشه ( بر اساس زمانی که محصول ثبت شده! ) .
بعد می رید داخل Route مورد نظر و مقادیر وارد شده در فرم رو در db ذخیره می کنید !

----------


## rahahost

سلام .

ممنون از راهنماییتون اما شما فقط الگوریتم دادین که میدونستم شکل پیاده سازیش به زبان الگوریتم چطوری هست ولی کد هایی که باید استفاده کنم رو نمیدونم !

ببینید ، من با کد زیر میتونم مقدار هایی که ذخیره شده رو نمایش بدم :

@foreach ($products->productfields as $productfield)
    <li><span>{{ $productfield->fieldname }}</span> :  {{ $productfield->pivot->value }}</li>
@endforeach



این کد فقط فیلد هایی که پر شده ( مقدارش ) رو نمایش میده اما من باید تمام فیلد هارو نمایش بدم ( فیلد هایی که پر شده و خالی هستن ) تا بتونم ویرایش ، حذف و اضافه کنم مقدارش رو .

ممنون میشم راهنماییم کنید.

----------

