تاریخ شمسی (جلالی) دروپال با Datex

By کوشا حسینی, 30 آوریل, 2013

توجه: فایل patch تغییر کرده است، برای راهنمای جدید در مورد patch جدید به http://drupalion.com/node/167 مراجعه کنید

بروزرسانی 11 تیر 92: افزودن امکانات

امکان استفاده از ماژول بدون نیاز به patch وجود دارد.
در date به ازای هر فیلد میتوان مشخص کرد که این فیلد شمسی باشد یا نباشد.
views در حالت بدون patch نیز شمسی خواهد بود.
اگر library ها را نصب نکنید ماژول خطایی نمایش نمیدهد.

بروزرسانی 10 تیر 92: رفع مشکلات

اگر روز در تاریخ انتخاب نمیشد ماه را اشتباه نشان میداد که حل شد.
فایل patch درست کار نمیکرد که اصلاح شد.
ارتباط با ماژول date بهتر شد و مشکلات رفع شد.

بروزرسانی 20 خرداد 92: تمام مشکلات گزارش شده حل شد.

تمام مشکلاتی که در بخش دیدگاه ها اعلام شده بود. حل شد. خوشحال میشیم که اگر مشکل دیگه ای هست دوستان اعلام کنند. مرحله بعدی اضافه کردن popup به ماژول date است. در حال حاضر شما فقط میتوانید با استفاده از حالت select list از ماژول date  استفاده کنید. و مرحله بعدی آماده شدن برای انتقال به دروپال 8 است.

بروزرسانی 10 اردیبهشت 92: ماژول را بروزرسانی کردیم. در این نسخه تغییرات زیر صورت گرفته است.

1- تعداد ماژول ها به 3 تا کاهش پیدا کرده.
2- اگر patch رو اعمال نکنید سایت شما down نمیشود. اما یادتان باشد که برای استفاده از این ماژول حتما باید patch را اعمال کنید.
3- تعداد زیادی باگ ماژول رفع شده است و به نظر میرسد که ماژول به وضعیت پایدار نزدیک میشود.
4- در هنگام ویرایش محتوا میتوانید از جاوااسکریپت مربوط به تغییر تاریخ استفاده کنید. برای این منظور حتما فایل جاوااسکریپت انتهای همین مطلب را دانلود کنید.

بروزرسانی 15 اسفند 91: مشکل خطا هنگام ویرایش محتوا حل شد. از نظر ما این ماژول در حال حاضر قابل استفاده در سایت های تجاری نیز هست.

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

هنگام کار روی پروژه‌های دروپالی، نیاز شدیدی به پشتیبانی بهتر و کاملتر از تاریخ‌های جلالی توسط هسته دروپال احساس می‌شد. استفاده از یک فیلد متنی برای ذخیره کردن تاریخ، در حالی که ماژول بسیار خوب و کاملی برای تاریخ‌های میلادی وجود داشت، بسیار دست و پاگیر بود. محاسبات عددی روی تاریخ هم جزئی از سخت‌ترین بخش‌ها بود. بعد از سعی برای افزودن این قابلیت به دروپال، اولین نتیجه کار، ساخته شدن یک کتابخانه (Datex API) با توابع مفید و کاربردی بود. از جمله امکانات خوبش، وجود یک شیئ (Class) هست، مشابه آنچه PHP برای تاریخ ارائه می‌کند: DatexObject در مقابل Date. آره... اسمش می‌تونست Datex باشه! تایپ کمتر یک کلمه خودش کلی به آدم حال می‌ده ولی خوب، ما دروپالی هستیم دیگه! دروپال DateObject رو داره ما هم DatexObject رو انتخاب کردیم.
بعد کامل شدن API مورد نظر، نوبت به دروپال و ماژول Date می‌رسید. ماژول دروپالی خیلی خوب دیگری هم برای اینکار توسط سپهر لاجوردی و سینا سالک عزیز نوشته شده: Clendar system. اما کارایی این ماژول برای ما کافی نبود.


ماژول‌های موجود در بسته Datex:

Datex API کتابخانه کار با تاریخ جلالی با پشتیبانی از PHP-Intl: 

قبلا در مورد روش استفاده از PHP-Intl در کدهای php توضیحات مختصری داده بودم. Datex API هم از این امکان پشتیبانی میکند (این کتابخانه می‌تواند در تمام پروژه های PHP استفاده شود و مختص دروپال نیست). روش استفاده خیلی ساده است: بعد از نصب ماژول Datex، فایل Patch موجود در ماژول رو روی دروپال نصب شده اعمال می‌کنید و یک دروپال جلالی با پشتیبانی از Intl تحویل می‌گیرید! به همین سادگی، به همین خوش‌مزگی! راهنمایی بیشتر در مورد اعمال Patch.
این نکته رو یادتون نره برای استفاده از PHP-Intl حتما باید کتابخانه PHP-Intl در سرور شما نصب و فعال شده باش. در صورت عدم وجود این کتابخانه، Datex با رفتن روی حالت Fallback، با متدهای داخلی خودش، تاریخ‌ها رو مدیریت می‌کنه و شما متوجه تغییری نمی‌شید اما پیشنهاد من به شما استفاده از PHP-Intl است. اگر از یک هاست اشتراکی استفاده میکنید میتوانید با سرویس‌دهنده خود برای نصب این کتابخانه تماس بگیرید.

Datex برای جلالی کردن تاریخ‌های هسته دروپال:
با اعمال Patch موجود و فعال سازی این ماژول، تاریخ هسته دروپال به صورت جلالی نمایش داده می‌شه مثل تاریخ زمان انتشار یک مقاله. زبان سایت حتما باید به فارسی تغییر کنه تا این تبدیل انجام بشه. هنگامی که سایت با زبان دیگری در حال نمایش است، تاریخ به صورت میلادی باقی می‌مونه.

Datex Date پشتیبانی از تاریخ شمسی در ماژول Date:
یکی دیگر از ماژول های موجود در این مجموعه که وظیفه شمسی کردن ماژول Date را به عهده دارد. در حال حاضر ویجت کومبو ماژول Date شمسی شده است. برای ماژول pop up بررسی‌هایی انجام شده و همچنان در حال کار کردن روی این مساله هستم. بخش Exposed Filter ماژول Views هم برای هماهنگی با تاریخ شمسی نیاز به کار بیشتر دارد.

Datex Jquery کتابخانه های جاوااسکریپت:
این ماژول پیش نیاز ماژول Datex node Edit است با استفاده از ماژول libraries جاوااسکریپت‌های لازم برای تاریخ جلالی رو فراهم می‌کنه. ماژول کوچیکی هست و به خودی خود کاری انجام نمی‌ده. برای استفاده از این قابلیت باید فایل ضمیمه شده در همین مطلب رو دانلود کنید و به شاخه libraries دروپال منتقل کنید. فایل های اصلی این جاوااسکریپت از وبلاگ آقای wood قابل دانلود هست.

Datex Node Edit برای پشتیبانی از تاریخ جلالی در صفحه افزودن محتوا:
همینطور که از عنوان این ماژول بر می‌آید این ماژول وظیفه افزودن یک datepicker به صفحه افزودن (http://example.com/node/add) و ویرایش (http://example.com/node/%/edit) محتوا را بر عهده دارد. این ماژول نیاز به کار بیشتر دارد.

 

همینطور که میبینید تعدادی از ماژول های بالا نیاز به کار بیشتر دارند. امیدوارم که در طی یک زمان منطقی این مشکلات را حل کنم. هر کدام از دوستان اگر تمایل به همکاری برای تکمیل کردن این ماژول ها دارند میتوانند با ارسال نظرات یا patch ها  در این زمینه کمک کنند. حتی میتونیم برای دوستان در Git دسترسی ایجاد کنیم.

در ضمن برای متمرکز کردن مشکلات و مسائل مربوط این ماژول از شما تقاضا میکنم مشکلات و ایده های خود رو از طریق issue های این ماژول به دست ما برسونید.

 

برای اینکه این ماژول به لیست ماژول های دروپال اضافه شود درخواست خود را در سایت دروپال ثبت شده. اما فعلا میتوانید این ماژول را از صفحه sandbox دانلود کنید.

 

اعمال Patch:

فایل common.inc که در شاخه incluedes در شاخه اصلی دروپال خودتون رو پیدا کنید، خطوط ۲۰۰۸ تا ۲۰۲۳  رو حذف کنید، خط ۲۰۰۸ شامل متن زیر هست:

 

 // Encode markers that should be translated....

و خط ۲۰۲۳ هم شامل علامت زیر است:

}

حالا در خط ۲۰۰۸ که متن بالا رو حذف کردید، خطوط زیر رو اضافه کنید:

  // Preserve format for datex.

  $datex_format = $format;



  // Encode markers that should be translated. 'A' becomes '\xEF\AA\xFF'.

  // xEF and xFF are invalid UTF-8 sequences, and we assume they are not in the

  // input string.

  // Paired backslashes are isolated to prevent errors in read-ahead evaluation.

  // The read-ahead expression ensures that A matches, but not \A.

  $format = preg_replace(array('/\\\\\\\\/', '/(?<!\\\\)([AaeDlMTF])/'), array("\xEF\\\\\\\\\xFF", "\xEF\\\\\$1\$1\xFF"), $format);



  // Call date_format().

  $format = date_format($date_time, $format);



  // Pass the langcode to _format_date_callback().

  _format_date_callback(NULL, $langcode);



  // Translate the marked sequences.

  $date = preg_replace_callback('/\xEF([AaeDlMTF]?)(.*?)\xFF/', '_format_date_callback', $format);



  // Give other modules opportunity to change date format

  $context = array($timestamp, $type, $datex_format, $timezone, $langcode);

  //dpm($context);

  drupal_alter('datex_format', $date, $context);



  return $date;

}

صفحه مربوط به ماژول:

http://drupal.org/sandbox/drupalion/1841798

 

آدرس Git در دروپال:

http://git.drupal.org/sandbox/drupalion/1841798.git

توجه کنید که حتما branch 7.x-1.x رو دریافت کنید