بررسی چند تابع مفید taxonomy در برنامه نویسی دروپال (بخش اول)

بررسی چند تابع مفید taxonomy در برنامه نویسی دروپال (بخش اول)

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

در این مقاله به بررسی تعدادی از توابع مفید سیستم دسته بندی دروپال می پردازیم. اساس این مقاله بر api دروپال 7 است. در سایر نسخه های دروپال نیز توابع با همین نام ها وجود دارند ولی ممکن است در ورودی ها و خروجی آنها تفاوت هایی موجود باشد.

واژه های مهم در سیستم دسته بندی دروپال (Taxonomy)

کوچکترین واحد در نظام دسته بندی دروپال که مهمترین نیز هست، دسته یا Term است. از آنجا که می توانیم در دروپال دسته بندی های متفاوتی را داشته باشیم، بنابراین دسته ها را در واحد هایی به نام Vocabulary قرار می دهیم. یعنی هر Vocabulary بیانگر یک نظام دسته بندی برای محتوا یا ... است که می تواند حاوی تعداد زیادی دسته باشد. نکته مهم دیگری در دسته بندی دروپال، سلسله مراتب است. هر دسته می تواند حاوی چند زیر دسته باشد (children). به این صورت برای هر دسته (Term) اهمیت دارد که بدانیم والد آن چه دسته دیگری است. به دسته والد Parent Term گفته می شود.

برای مثال در این مقاله یک سایت فروشگاه آنلاین داریم. محصولات درون دسته هایی قرار می گیرند. سلسله مراتب دسته بندی محصولات را درون یک Vocabulary به اسم Product Categories قرار داده ایم:

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

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

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

تابع taxonomy_term_load برای بازیابی اطلاعات یک دسته

اولین تابعی که در اینجا باید آن را معرفی کنیم، taxonomy_term_load است. از این تابع برای گرفتن اطلاعات یک دسته استفاده می کنیم. این تابع شناسه عددی یکتای دسته (tid که مخفف Term ID است) را می گیرد و یک آبجکت حاوی اطلاعات آن دسته را باز می گرداند. در صورتی که برای شناسه داده شده هیچ دسته ای در سایت موجود نباشد این تابع مقدار FALSE را بر می گرداند.

بعضی از اطلاعات موجود در آبجکتی که بگردانده می شود عبارتند از:

  • tid: شناسه یکتای term
  • name: نام دسته یعنی همان نامی که برای دسته در نظر گرفته ایم
  • vid: شناسه یکتای vocabulary که این دسته در آن قرار دارد
  • description: توضیحی است که برای دسته وارد شده است. این فیلد را در فرم افزودن دسته در مدیریت دروپال می بینید
  • parent: حاوی شناسه (tid) والد یا والد های این term است. در صورتی که این فیلد صفر باشد یعنی دسته صاحب هیچ والدی نیست یا به عبارت بهتر زیر دسته ی دسته دیگری نیست
  • و اطلاعات دیگری ...

در مثال دسته بندی محصولات، می خواهیم اطلاعات مربوط به term یا دسته Sport را در ماژول یا تکه کدی که می نویسیم، به دست بیاوریم. البته می دانیم که میخواهیم دسته ای که شناسه آن 4 است را لود کنیم. برای لود این دسته یا term از تابع taxonomy_term_load استفاده می کنیم:

$tid = 4; $term = taxonomy_term_load($tid); dpm($term);

همانطور که می بینید خروجی تابع را درون متغیر $term ذخیره کرده ایم. خروجی را برای نمایش به تابع dpm از ماژول devel داده ایم که ببینیم که چه اطلاعاتی در آبجکت خروجی تابع است:

تابع taxonomy_term_load برای بازیابی اطلاعات یک دسته

حالا به تغییری که در کد داده ایم دقت کنید:

$tid = 4; $term = taxonomy_term_load($tid); dpm($term->name);

در اینجا فقط نام دسته را از آبجکت خروجی گرفته ایم که نمایش کد را در پایین ملاحظه می کنید:

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

این تابع زمانی مفید است که ما شناسه یک دسته را بدانیم و بخواهیم به سایر اطلاعات آن دسته دسترسی پیدا کنیم مثلا نام دسته، vocabularyکه دسته در آن قرار دارد و یا توضیح و یا شناسه والد هایش را بیابیم.با توجه به اینکه یک دسته در دروپال 7 یک entity نیز محسوب می شود، بنابراین اگر دسته دارای فیلد هایی هم باشد، آبجکت خروجی این تابع حاوی اطلاعات فیلد های دسته نیز هست.

تابع taxonomy_term_save برای ذخیره یک دسته

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

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

شناسه عددیvocabulary که دسته ذیل آن قرار می گیرد vid
نام دسته name
توضیح یا شرح دسته description
فرمت متنی توضیح دسته format
رتبه قرار گیری دسته درvocabulary که در آن قرار دارد. این عدد برای مرتب سازی دسته های در یک vocabulary استفاده می شود. weight
شناسه دسته. این داده اختیاری است چون اگر دسته جدید باشد هنوز شناسه ندارد بنابراین مقداری برایtid نداریم. ولی اگرtid با عددی پر شده باشد، طبیعتا می خواهیم یک دسته موجود را آپدیت کنیم. tid
والد یا والد های دسته. این می تواند شناسه دسته دیگری باشد یا آرایه از شناسه دسته های دیگر باشد که والد این دسته محسوب می شوند. parent

خروجی این تابع یک عدد است که در واقع بیانگر یک متغیر ثابت از بین موارد زیر است:

  • SAVED_NEW
  • SAVED_UPDATED

یعنی می توانید خروجی را با یکی از این مقادیر مقایسه کنید که به ترتیب بیانگر ذخیره یک دسته جدید در دیتابیس و آپدیت یک دسته موجود در دیتابیس هستند. وقتی یک دسته جدید در دیتابیس ذخیره می شود می توانید شناسه این دسته جدید را از $term->tid به دست بیاورید در صورتی که نام آبجکتی که به این تابع می دهید $term باشد.

نمونه کد زیر را ببینید:

$tid = 4;
$term = taxonomy_term_load($tid);
dpm($term);
	
$term->name = "Sports 2015";
$result = taxonomy_term_save($term);
if($result == SAVED_UPDATED) {
	drupal_set_message('The category has been updated successfully.');
}
	
$tid = 4;
$term2 = taxonomy_term_load($tid);
dpm($term2);

در قسمت اول کد مثل قبل دسته با شناسه 4 را در آبجکت $term لود کرده ایم. محتوای آن را نیز نمایش داده ایم.

در قسمت دوم آبجکت $term را ویرایش کرده ایم. همانطور که می بینید نام دسته را تغییر داده ایم. سپس با استفاده از تابع taxonomy_term_save آبجکت $term را ذخیره کرده ایم. از آنجا که یک دسته موجود را به آن داده ایم، دسته جدیدی ایجاد نمی شود و فقط اطلاعات دسته موجود در دیتابیس آپدیت می شود. خروجی تابع را با SAVED_UPDATED مقایسه کرده ایم که در صورتی که دسته به روز رسانی شده است، پیغامی حاکی از موفقیت روی صفحه سایت نمایش داده شود.

در قسمت سوم مجدد همان دسته را در متغیر دیگری لود کرده ایم و اطلاعات آن را نمایش داده ایم که نسبت به تغییراتی که داده ایم مطمئن بشویم.

نتیجه را به این صورت می بینید:

تابع taxonomy_term_save برای ذخیره یک دسته

ارسال نظر