مقدار دهی یک فیلد در دروپال بر اساس فیلد های دیگر با ماژول Computed Field

مقدار دهی یک فیلد در دروپال بر اساس فیلد های دیگر با ماژول Computed Field

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

شماره پیگیری برای سیستم پشتیبانی و تیکتینگ دروپالی

در نظر بگیرید که برای یک سیستم پشتیبانی و تیکتینگ باید فیلدی داشته باشید که حاوی شماره پیگیری تیکت ارسال شده است. ساده ترین حالت برای انجام این کار ایجاد یک نوع محتوا به نام تیکت است. شناسه هر محتوا یا NID که آن را به صورت یکتایی از سایر محتوای سایت متمایز می کند، نیز می تواند نقش شماره پیگیری را بازی کند. ولی ممکن است مشتری بخواهد شماره پیگیری در عین سادگی، فرمت خاصی داشته باشد. مثلا فرض کنید شماره پیگیری ها از یک عدد مثل 1000 شروع شوند. مثلا از جمع عدد 1000 و NID به دست بیاید. به این صورت می خواهید برای اینکه از سیستم فیلد های دروپال استفاده کنید و بعد از مزیای ماژول views نیز برای جستجو و گزارش بهره ببرید، باید فیلدی اضافه کنید که به صورت اتوماتیک قابل محاسبه باشد.

امتیاز دهی به محتوای سایت در دروپال

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

مقدار دهی اتوماتیک فیلد ها  در دروپال

برای انجام چنین کاری، ماژول Computed Field ارائه شده است. این ماژول قدرتمندی است که نیاز به مقداری برنامه نویسی دارد. این فیلد قابلیتی را می دهد که بتوانید مقداری که باید در فیلد ذخیره شود و همین طور نمایش آن را با استفاده از کد های PHP، برنامه نویسی کنید.

نصب ماژول Computed Field

نصب این ماژول مانند سایر ماژول ها آسان است. برای نصب این ماژول باید فایل فشرده ماژول را از سایت دروپال دانلود کرده و آن را در فولدر ماژول های دروپال (sites/all/modules) از حالت فشرده خارج کنید. سپس به صفحه مدیریت ماژول ها در دروپال رفته و در گروه Fields ماژول را یافته و آن را فعال کنید.

افزودن فیلد Computed به دروپال

موقعیت اول که در مورد یک سیستم پشتیبانی صحبت کردیم را در نظر بگیرید. می خواهیم یک فیلد شماره پیگیری اضافه کنیم که ضمن اینکه به صورت اتوماتیک پر می شود، فردی هم در مقدار دهی آن دخالت نداشته باشد. فرمولی که برای این شماره در نظر می گیریم، جمع عدد 1000 با شناسه محتوا (nid) است.

بنابراین به قسمت مدیریت فیلد ها می رویم. در اینجا من یک نوع محتوای جدید به نام Ticket به دروپال اضافه کرده ام. به مدیریت فیلد های این نوع محتوا می روم. یک فیلد جدید از نوع computed ایجاد می کنم.

افزودن فیلد شماره پیگیری computed در دروپال

عنوان فیلد، نام ماشینی فیلد، نوع فیلد و ویجت آن را به ترتیبی که در شکل بالا ملاحظه می کنید، وارد کرده و دکمه Save را در انتهای صفحه می زنم تا به مرحله بعدی یعنی تنظیمات فیلد برویم.

تنظیمات فیلد computed در دروپال

در صفحه تنظیمات فیلد (Field Settings)، اولین چیزی که مشاهده می شود، فیلد متنی Computed Code (PHP) است. در اینجا باید یک کد PHP نوشت که مشخص می کند که چه داده ای باید برای مقدار فیلد در دیتابیس ذخیره شود. بنابراین نحوه پر شدن مقدار فیلد در اینجا مشخص می شود. همین طور که می بینید به صورت پیش فرض این کد، در داخل این فیلد نوشته شده است:

$entity_field[0]['value'] = "";

این کد مشخص می کند که اولین مقدار این فیلد یک رشته خالی است. این کد به ما نشان می دهد که برای دسترسی به فیلد و مقدار دهی آن باید از متغیر $entity_field استفاده کنیم. این موضوع را باید به دقت مورد توجه قرار بدهیم، چون اصل کار ما با این متغیر خواهد بود.

متغیر های دیگری که در اینجا قابل استفاده هستند در توضیح زیر فیلد نوشته شده اند. آنها عبارتند از: $entity_type، $entity، $field، $instance، $langcode و $items.

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

فیلد مورد نظر ما حاوی شماره پیگیری تیکت است و قرار شد که از مجموع عدد 1000 با شناسه محتوا به دست بیاید. شناسه محتوا را می توانیم از متغیر $entity به دست بیاوریم. متغیر $entity حاوی آبجکت محتوا است، بنابراین یکی از اطلاعات درون آن nid می باشد.

تا اینجا می توانیم کد مورد نظر خود را بنویسیم:

if(empty($entity_field[0]['value'])) {
$base_number = 1000;
$entity_field[0]['value'] = $base_number + $entity->nid;
}

در خط اول یک شرط (if)  گذاشته ایم که بررسی کند آیا مقدار اول فیلد پر است یا خالی. چون می خواهیم فقط یک بار فیلد را مقدار دهی کنیم، این کار را انجام داده ایم. در خط بعد یک متغیر تعریف کرده ایم که عدد پایه برای جمع بستن را ذخیره کند که در اینجا عدد پایه 1000 بود. در خط بعد، مقدار اول فیلد را که در بالا در مورد آن صحبت کردیم را با مجموع عدد پایه و شناسه محتوا ($entity->nid)  پر می کنیم.

توجه داشته باشید که در اینجا نیازی نیست که تگ های <?phpرا بنویسید.

نمایش فیلد computed در دروپال

دومین چیری که در تنظیمات این فیلد مشاهده می کنید، Display Code (PHP) است. در این قسمت کد PHP لازم برای نمایش مقدار فیلد را می بینید. به صورت پیش فرض کد زیر در آن قرار دارد:

$display_output = $entity_field_item['value'];

در اینجا نیز تعدادی متغیر مهم هستند که باید آنها را بشناسیم. اولین متغیر مهم در اینجا $display_output است که باید رشته ای حاوی نمایش فیلد را به آن بدهیم. یعنی چیزی که برای ماژول computed field جهت نمایش این فیلد اهمیت دارد مقداری است که به این متغیر می دهیم.

برای دسترسی به مقدار فیلد از متغیر $entity_field_item استفاده می کنیم. همانطور که در کد بالا می بینید مقدار خام فیلد درون $entity_field_item['value'] قرار دارد.

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

نحوه ذخیره سازی فیلد computed در دروپال

قسمت دیگری که باید تنظیمات آن را بررسی کنید مربوط به نحوه ذخیره سازی مقدار فیلد در دیتابیس است. برای ذخیره سازی مقدار فیلد در دیتابیس حتما چک باکس Store value in the database را علامت بزنید.

در فیلد های رادیویی Data Type باید نوع فیلد در دیتابیس را مشخص کنیم. در این قسمت باید با نوع داده های دیتابیس آشنا باشید. ما چون میخواهیم مقدار فیلد به صورت رشته ای ساده ذخیره شود همان گزینه carcahr که در ابتدای لیست مشاهده می شود را علامت می زنیم. تنظیمات بعدی فقط برای بعضی از انواع داده کاربرد دارند. مثلا Data Length برای نوع رشته ای مثلا varchar و text قابل استفاده هستند یا Data Size برای فیلد های عددی مثل int و  float و  تنظیمات precision و scale برای decimal مفید هستند.

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

در صفحه بعد تنظیمات دیگری مربوط به فیلد را مشاهده می کنید، یکی تعداد مقادیر فیلد است که آن را در این مورد خاص 1 می گذاریم. به سایر تنظیمات نیز کاری نداشته و ذکمه ذخیره را می زنیم تا به صفحه مدیریت فیلد ها باز گردیم. فیلد computed که اضافه کرده ایم را در لیست مشاهده می کنیم.

فیلد computed در عمل

برای اینکه ببینیم چه اتفاقی برای این فیلد رخ داده است، به صفحه افزودن محتوا می رویم. یک محتوا از نوع تیکت اضافه می کنیم. در فرم آن مشاهده می کنید که اثری از فیلد computed نیست.

فیلد computed در دروپال در فرم افزودن محتوا

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

نمایش فیلد computed در صفحه محتوا

شناسه محتوا یا nid، برای این محتوا عدد 2 بوده است و به درستی نیز مقدار شماره پیگیری محاسبه، ذخیره و نمایش داده شده است.

تنظیم نمایش فیلد computed در دروپال

مانند هر فیلد دیگری در دروپال، برای فیلد computed نیز می توانیم در قسمت مدیریت نمایش فیلد، فورمتر مورد نظر را انتخاب کنیم. اگر چه با اینکه می توانیم نمایش فیلد را به صورتی که دیدید برنامه نویسی کنیم، دستمان برای نحوه نمایش بسیار باز است ولی تعدادی فورمتر هم توسط ماژول Computed Field ارائه شده است.

تنظیم نمایش فیلد computed در دروپال

نظرات

مرسی وحید جان،
ماژول رو نصب کرده بودم ولی نحوه استفاده ش رو نمیدونستم چطوری بود.
با توضیحات بالا کارم راه افتاد. ممنونم :)

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

مرسی از آموزش خوبتون
مثلا یک فیلد داریم از نوع ترم رفرنس هستند که به صورت درختی نمایش داده میشوند و اگر بخواهیم مقدار این فیلد به این صورت پر شود که موقعی که یوزر یکی از ترم ها رو انتخاب میکند و زیر شاخه هر یک از ترم ها باشند یک حرف به را برایش جایگزین کنیم به این صورت که ترم های زیر را داریم
ترم 1
- ترم 11
-ترم 12
-ترم13
ترم 2
-ترم21
-ترم22
-ترم23
ترم 3
-ترم 31
-ترم32
-ترم33

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

term2/100
که مقدار 100 شماره محتوا یا nid می باشد

با سلام و تشکر از شما
ببخشید من یک مشکلی دارم که یک مدته به هیچ وجه نمیتونم حلش کنم ممنون میشم اگه راهنماییم کنید
فرض کنید کاربر یک فایل رو برای فروش داخل سایت قرار میده که 30 درصد از اون فایل برای سایت و 70 درصدش برای خود کاربر خواهد بود الان چجوری میشه کاری کرد که این 70 درصد رو حساب کنه و در پروفایل کاربر نشون بده

لطفا راهنماییم کنه واقعا ممنون میشم

ارسال نظر