تغییر اطلاعات ارسال (نام کاربری و تاریخ) در نظرات و محتوای دروپال

تغییر اطلاعات ارسال (نام کاربری و تاریخ) در نظرات و محتوای دروپال

اطلاعات ارسال نظرات و محتوا در دروپال

در کنار محتوا و یا نظری که در سایت دروپالی ارسال می شود، به صورت پیش فرض نام کاربری فرد ارسال کننده و همین طور تاریخ ارسال را مشاهده می کنید. ممکن است این نحوه نمایش چیزی نباشد که مورد نظر ما یا صاحب سایت باشد. خصوصا در یک سایت فارسی، نمایش نام کاربری از حروف لاتین، ممکن است جالب نباشد.

نمونه از این کار را در سایت دروپالیکا مشاهده می کنید. مثلا در بالای هر محتوا، به جای نام کاربری admin نام نویسنده نوشته می شود که به صفحه پروفایل آن کاربر در دروپال نیز لینک شده است. همین طور تاریخ ارسال نیز تغییر کرده است.

صرفنظر از اینکه در دروپال، می توان هر کاری را با روش های متعددی انجام داد، در این مطلب به روشی که در سایت دروپالیکا برای تغییر اطلاعات ارسال، استفاده شده است، می پردازم.

نام و تاریخ ارسال محتوا و نظر در دروپال

تغییر نام ارسال کننده و فرمت تاریخ محتوا در تم دروپال

در سایت دروپالیکا، این کار در تم سایت انجام شده است. در هر تم معمولا یک فایل به نام template.php وجود دارد که برای نوشتن کد های PHP مورد نیاز برای تم استفاده می شود. در این فایل می توان توابعی را پیاده سازی کرد که رفتار نمایشی دروپال را تغییر می دهند. برای نمونه میخواهیم نحوه نمایش تاریخ و نام ارسال کننده محتوا را در سایت تغییر بدهیم.

تغییر نام ارسال کننده و فرمت تاریخ  محتوا در تم دروپال

کد زیر در فایل template.php تم دروپالیکا نوشته شده است:

function drupalika_preprocess_node(&$variables) {
	$user = user_load($variables['uid']);
	$user_link = entity_uri('user', $user);
  $user_profile_link = l($user->field_usr_fname['und'][0]['safe_value'], $user_link['path'], $user_link['options']);
  $datetime = format_date($variables['created'], 'custom', 'l / j F / Y');
	$str = t('By !user in @time' , array('!user' => $user_profile_link, '@time' => $datetime));
	$variables['submitted'] = '<div class="node-submit-data">' . $str . '</div>';
}

تابع قالب template_preprocess_node در دروپال

این پیاده سازی مجدد تابع قالب template_preprocess_node است. همانطور که می بینید نام تابع با جایگزینی نام تم به جای کلمه template در اسم تابع قالب به دست آمده است. این تابع یک متغیر در ورودی خود دارد که بهتر است به تبعیت از دروپال نام آن را $variables گذاشت. همین طور باید توجه شود که این متغیر به صورت ارجاعی به این تابع ارسال شده است بنابراین باید پیش از اسم متغیر علامت & قرار داشته باشد.

اگر این تابع را به فایل template.php اضافه کرده اید ولی تغییر مشاهده نکرده اید، می توانید با انجام عمل clear cache در مدیریت دروپال، تغییرات را ببینید.

ورودی تابع template_preprocess_node

ورودی تابع آرایه $variables است. برای مشاهده محتویات آن می توانید از روشهایی که در «مشاهده مقادیر متغیر ها و آرایه ها در برنامه نویسی ماژول دروپال» بیان شده است استفاده کنید. مثلا به این صورت:

function drupalika_preprocess_node(&$variables) {
 	custom_dpm($variables);
}

function custom_dpm(&$param) {
	drupal_set_message('<pre style="direction: ltr !important; text-align: left !important">' . print_r($param,TRUE) . "</pre>");
}

به این شکل، مقادیر آرایه $variables را می توانید ملاحظه کنید و از هر ایندکس آن اطلاعاتی که لازم دارید را استخراج کنید.

در اینجا ما از سه خانه از این آرایه استفاده کرده ایم:

  1. $variables['uid'] که شناسه کاربر ارسال کننده مطلب را می دهد.
  2. $variables['created'] که زمان ارسال مطلب در سایت را در قالب timestamp نگهداری می کند.
  3. $variables['submitted'] که محتوای آن دقیقا چیزی است که در قسمت اطلاعات ارسال کننده در سایت نمایش داده می شود.

توابع مفید از API دروپال

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

  1.  user_load: شناسه عددی یک کاربر را می گیرد و اطلاعات آن کاربر در سایت را به صورت کامل بر می گرداند. این اطلاعات حاوی تمام فیلد های اطلاعاتی کاربر است.
  2.  entity_uri: لینک صفحه آن entity که در ورودی می گیرد را می دهد. در اینجا این تابع را برای به دست آوردن لینک صفحه پروفایل کاربر صدا زده ایم. ما در اینجا آبجکت حاوی اطلاعات کاربر ($user) را به آن فرستاده ایم و گفته ایم که این آبجکت نیز یک entity از نوع user است. خروجی این تابع یک آرایه است که دو ایندکس از آن در کد های بعدی استفاده شده است.
  3. l: علی رغم اسم ساده این تابع یکی از توابع پر کاربر در دروپال است و کارش تولید لینک است. یعنی اطلاعاتی درباره یک لینک را در ورودی می گیرد و کد HTML آن لینک را در دروپال می دهد.
  4.  format_date: این تابع زمان را برای نمایش قالب بندی می کند و در ورودی زمان را به صورت timestamp می گیرد.
  5.  t: این تابع نیز استفاده بسیار زیادی در دروپال دارد چون برای ترجمه رشته های متنی استفاده می شود.

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

پیش فرض پیاده سازی این تابع این است که برای کاربر در سایت فیلد نام به صورت متنی در نظر گرفته شده باشد. کد $user->field_usr_fname['und'][0]['safe_value'] نشان می دهد که نام ماشین این فیلد در دروپالیکا field_usr_fname است. بنابراین این موضوع را باید مد نظر داشته باشید که فیلد یا فیلد هایی که می خواهید از اطلاعات آنها استفاده کنید را برای کاربر ایجاد کنید و ثانیا از نام ماشینی آنها به درستی در این تابع بهره ببرید.

تغییر نام ارسال کننده و فرمت تاریخ نظر در تم دروپال

آنچه که برای تغییر اطلاعات ارسال کننده برای هر کامنت در سایت نیز انجام می دهیم، نیز تا حدود زیادی شبیه کاری است که برای نام ارسال کننده محتوا انجام دادیم. برای تغییر اطلاعات ارسال هر نظر، باید تابع template_preprocess_comment را پیاده سازی کنیم. نمونه ای از آن که در دروپالیکا پیاده شده است را در کد زیر می بینید:

function drupalika_preprocess_comment(&$variables) {
 	$comment = $variables['comment'];
  if(!empty($comment->uid)) {
    $user = user_load($comment->uid);
    $user_link = entity_uri('user', $user);
    $user_string = l($user->field_usr_fname['und'][0]['safe_value'], $user_link['path'], $user_link['options']) ;
  }
  else if(!empty($comment->homepage)) {
    $user_string = l($comment->name, $comment->homepage);
  }
  else {
    $user_string = $comment->name;
  }
	$variables['submitted'] = t('By !user in @time' , array('!user' => $user_string, '@time' => format_date($comment->created, 'custom', 'l / j F / Y - H:i')));
}

با توجه به اینکه توضیحاتی در مورد توابع، در تابع قبلی داده شد، از تکرار آنها در این مورد صرفنظر می شود. این تابع نیز همانند قبلی باید در فایل template.php قرار بگیرد و نام تم نیز در آن لحاظ شود.

نظرات

خیلی مطلب مفیدی بود ... ممنون که اجازه میدی بقیه هم از دانشت استفاده کنن ;) ... یه سوال : تاریخ رو چی جوری شمسی کنیم ؟

تصویر admin
علی آقا! برای شمسی کردن تاریخ، در دروپالیکا از ماژول calendar systems استفاده شده است. کافی است این ماژول را نصب و درست تنظیم کنید.

سلام
خیلی خیلی ممنون از آموزش خوبتون دستتان درد نکند.

تصویر admin
مهدی خان، ممنون از لطف شما

خداییش دمتون گرم...

تصویر علی

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

تصویر admin
علی آقا! خود دروپال امکانات کافی برای نمایش تصویر کاربر در کنار کامنت و یا ارسال مطلب را دارد. در تنظیمات کاربر در Account settings در قسمت Configuration باید امکان آپلود تصویر را برای کاربر فعال کنید. در تنظیمات تم در appearance نیز چند چک باکس وجود دارد که یک مورد آن مربوط به نمایش تصویر کاربر در کنار کامنت می باشد.
تصویر علی

حل شد ممنون ;)

سلام خسته نباشین
من دو نوع محتوا دارم میخوام اینا رو با هم ادغام کنم بنظرتون بهترین روش چیه؟ از دیتابیس نام نوع محتوا رو تغییر بدم خوبه؟

تصویر admin
آقا مهدی! منظور شما این هست که مثلا فیلد های آنها یکی شوند؟ نظر بنده این است که به صورت دستی از دیتابیس این کاری انجام ندهید. ولی شاید راههای بهتری نیز باشد، شما بیان کنید که مقصد شما دقیقا چیست شاید راه حل های دیگری بتوان یافت که به این دو نوع محتوا هم دست نزد و نتیجه مناسب را هم گرفت.

ممنون

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

با ماژول زیر
https://drupal.org/project/node_convert
میشه نوع محتوا رو تغییر داد اما مشکل اینجاست که من با این ماژول نوع محتواها رو تغییر میدم و وقتی نوع محتوای خبر رو که تبدیل به مقاله کردم میخوام از سایت حذف کنم. متن نظرات هم حذف میشود.

علت اینکه میخوام مثلا نوع محتوای خبر رو به مقاله تغییر بدم اینه که تعداد نوع محتواهای سایتم حدودا 12 تاست.
بنظرتون اگر تعداد نوع محتوا زیاد باشه در سرعت سایت و ... تاثیر داره؟

شرمنده یک سوال دیگه اینکه من قبلا یک نوع محتوا ایجاد کرده بودم اما بعدا حذفش کردم ولی الان دیتابیس رو نگاه میکنم میبینم از دیتابیس حذف نشده است. یعنی در جدول node type موجود است.

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

ممنونم از پاسختون از تغییر نوع محتوا صرفنظر کردم.

سلام شرمنده
من از یک قالبی استفاده میکنم با اینکه ماژولهای مختلف تاریخ شمسی رو نصب میکنم ولی باز تاریخ مطلب میلادی است در فایل
template.php
این خط رو حذف میکنم تاریخ شمسی میشه ایا حذف این خط مشکلی پیش میاره؟ این کد در قالب به چه شکلی باید باشه که تاریخ رو شمسی نشون بده

$variables['date'] = t('!datetime', array('!datetime' => date('j F Y', $variables['created'])));

کد دقیقا بدینصورت است:

/**
* Override or insert variables into the node template.
*/
function MYTHEME_preprocess_node(&$variables) {
$node = $variables['node'];
if ($variables['view_mode'] == 'full' && node_is_page($variables['node'])) {
$variables['classes_array'][] = 'node-full';
}
$variables['date'] = t('!datetime', array('!datetime' => date('j F Y', $variables['created'])));
}

تصویر admin
شما از تابع dateاستفاده کرده اید که تابع php است و طبیعتا میلادی را به شما می دهد. ولی باید از format_date استفاده کنید به صورتی که در متن مقاله هم آمده است. این تابع دروپال است و ماژول های شمسی ساز دروپال هم معخولا روی همین تابع کار می کنند.

سلام بسیار بسیار از وقتی که گذاشتید ممنونم.
با format_date درست شد.

خیلی عالی بود ، متشکرم

خیلی لازم و کاربردی بود. در مورد نظرات هم آموزش بدید چطوری میشه این کار رو کرد ممنون میشم

سلام من مشکل دارم با این موضوع تم های خارجی
الان مشکل من اینه که وقتی فارسی کردم کل سایت قسمت پایین وبلاگ و وب نوشت های من میلادی هستش
اینم کدشه
چطوری تغییرش بدم ماژول دیت ایکس استفاده میکنم
<?php
print render($content['field_blog_image']);
$date = getdate($created); ?>
<?php ?>

<?php echo $date['mday']; ?>
<?php echo $date['month'] .' '. $date['year']; ?>

<?php ?>

تصویر admin
حسن خان، من با ماژول dateX آشنایی کامل ندارم اگر از راه دروپال رفته باشند شما با استفاده از تابع format_date باید بتوانید، تاریخ را به صورتی که باید نمایش داده شود یا میلادی و یا شمسی نمایش بدهید. مثلا ماژول calendar systems به این صورت کار می کند. بنابراین شما در دروپال همیشه برای هر زبانی و تاریخی تابع یاد شده را صدا می زنید. در صورتی که ماژول dateX نیز این تابع را بازنویسی کرده باشد، مشکلی نیست.

با نام خدا
با سلام... من دروپالم رو ارتقاء دادم، قبل از ارتقاء قسمتِ تاریخ انتشار یا ویرایش محتوا، خالی بود، اما بعد از ارتقای هسته دروپال، موقع ویرایش مطلب، نمیذاره مطلب رو ثبت کنم تا وقتی که تاریخ و زمان رو پاک کنم...
باید چکار کنم که این قسمت که در تصویر مشخص کردم، خالی باشه به صورتِ خودکار..
ممنون میشم راهنمائی کنید
این هم لینک عکسی که گرفتم
http://s6.picofile.com/file/8188129126/drupal_date_submission.JPG

عالی بود.

ارسال نظر