نمایش داده ها درون جدول در دروپال با theme_table

نمایش داده ها درون جدول در دروپال با theme_table

جدول در HTML

با جدول در HTML آشنا هستیم. برای ایجاد جداول از تگ table استفاده می کنیم. این تگ نسبت به تگ های دیگر HTML پیچیدگی بیشتری دارد. نحوه نمایش اطلاعات در ردیف ها و ستون های جدول باید دقیقاً با استفاده از تگ های HTML مشخص شود. برای مثال کد یک جدول را در ادامه می بینید:

<table>
	<thead>
		<tr>
			<th>ID</th>
			<th>Username</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>1</td>
			<td>root</td>
		</tr>
	</tbody>
</table>

به صورت کلی یک جدول دارای قسمت سر (thead) که تیتر ستون های جدول را معین می کند و بدنه (tbody) که ردیف های اطلاعاتی در آن قرار دارند، است. هر ردیف از جدول با تگ tr مشخص می شود و هر سلول در ردیف خودش با تگ td در بدنه و با تگ th در سر جدول نوشته می شود.

نمایش داده ها در جداول در HTML هنوز هم مرسوم هستند. برنامه نویسی در سمت سِروِر برای تولید جداول به صورت داینامیک و پویا نیاز به دقت دارد و بعضاً می تواند کاری مشکل باشد. همین طور چون نیاز به تولید کد های HTML داریم، نوشتن تگ های HTML در کد های PHP در هر جایی از برنامه مناسب نیست. بنابراین بهتر است کار تولید جدول از آرایه ای از داده ها را به یک تابع واگذار کنیم که قابلیت استفاده مجدد را داشته باشد.

تولید جدول HTML در دروپال

دروپال چنین کاری را انجام داده است و در API دروپال می توانیم از تابع theme_table برای تولید جدول HTML از داده ها استفاده کنیم. در این مقاله به نحوه استفاده از این تابع و بررسی ورودی های آن می پردازیم و مثالی در این باره را نیز بررسی می کنیم.

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

$variables = array(
	'header' => array(
		'ID',
		'Username',
	),
	'rows'=> array(
		array(
			1,
			'root',
		),
		array(
			2,
			'admin',
		),
	),
	'attributes' => array(
		'class' => array('users-table'),
	),
);

$table = theme_table($variables);

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

تولید جدول HTML در دروپال

این کد های HTML است که این تابع تولید کرده است:

<table class="users-table">
 <thead><tr><th>ID</th><th>Username</th> </tr></thead>
<tbody>
 <tr class="odd"><td>1</td><td>root</td> </tr>
 <tr class="even"><td>2</td><td>admin</td> </tr>
</tbody>
</table>

تابع theme_table در دروپال

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

theme_table($variables)

ساختار این آرایه به صورت کلی دارای ایندکس های زیراست:

header یک آرایه از عناوین ستون ها
rows یک آرایه از داده های ردیف های مختلف جدول که هر خانه از آن خود یک آرایه از داده های آن ردیف است
attributes آرایه ای از خصوصیت های HTML که برای تگ table استفاده می شود
caption عنوان کلی جدول
colgroups آرایه از گروه های ستون های جدول
sticky سر جدول یا عناوین جدول را با اسکرول کردن هم نمایش می دهد
empty پیامی که در صورت خالی بودن جدول از داده ها، نمایش داده می شود

نمونه ساده از از استفاده از این ها را در کد زیر مشاهده می کنید:

$variables = array(
	'header' => array(
		'ID',
		'Username',
	),
	'rows'=> array(
		array(
			1,
			'root',
		),
		array(
			2,
			'admin',
		),
	),
	'attributes' => array(
		'class' => array('users-table'),
	),
	'sticky' => TRUE,
	'empty' => t('There are no results.'),
	'caption' => t('Users'),
);



$table = theme_table($variables);

نمایش آن به صورت زیر است:

تابع theme_table در دروپال

امکانات پیشرفته تر تابع theme_table

این تابع مدیریت بیشتری روی نمایش جدول به برنامه نویس می دهد. جدول زیر اطلاعات بیشتری در این باره ارائه می کند:

عنوان ستون data یک آرایه از عناوین ستون ها است. برای استفاده از امکانات بیشتر در عناوین جدول، هر خانه این آرایه به جای اینکه فقط حاوی عنوان باشد می تواند یک آرایه باشد که اطلاعات بیشتری در مورد آن عنوان نگهداری می کند و ایندکس های آن در سمت راست مشخص شده است. header
نام فیلدی از دیتابیس که این ستون از جدول معادل آن است. در صورتی که از sort استفاده شود، حتما باید این خانه از آرایه مقدار دهی شده باشد. field
قانون مرتب سازی پیش فرض جدول براساس این ستون می تواند نزولی یا صعودی باشد. بنابراین این خانه از آرایه می تواند یکی از مقادیر asc یا desc را داشته باشد. sort
هر خصوصیت HTML دیگر مثل colspan می تواند به عنوان یکی از ایندکس های این آرایه استفاده شود. Any HTML attributes  
رشته ای که باید در آن سلول نمایش داده شود. data آرایه ای از داده های یک ردیف که هر خانه آن یک رشته است. در غیر این صورت می تواند هر خانه از این آرایه، خود یک آرایه باشد که ساختار آن در سمت راست بیان شده است. data یک آرایه از داده های ردیف های مختلف جدول که هر خانه از آن خود یک آرایه از داده های آن ردیف است. برای سفارشی سازی بیشتر جدول، می توان از امکانات دیگری برای هر ردیف و سلول اطلاعاتی جدول استفاده کرد. برای این کار ساختار آرایه هر ردیف پیچیده تر می شود که قسمت های مختلف آن در سمت راست بیان شده است. rows
مشخص می کند که این سلول خاص یک header است. header
هر خصوصیت HTML دیگر مثل colspan می تواند به عنوان یکی از ایندکس های این آرایه استفاده شود. Any HTML attributes
به صورت پیش فرض این ایندکس FALSE در نظر گرفته می شود و نتیجه آن هم این است که ردیف های فرد کلاس odd و ردیف های زوج کلاس even بگیرند. برای حذف این کلاس ها از هر ردیف، ایندکس no_striping برای آن ردیف بایستی TRUE باشد. no_striping
هر خصوصیت HTML دیگر مثل class می تواند به عنوان یکی از ایندکس های این آرایه استفاده شود. Any HTML attributes
آرایه ای از خصوصیت های HTML که برای تگ table استفاده می شود attributes
عنوان کلی جدول caption
آرایه از گروه های ستون های جدول است که می تواند آرایه ای از ستون ها و یا آرایه ای از خصوصیات باشد. colgroups
سر جدول یا عناوین جدول را با اسکرول کردن هم نمایش می دهد sticky
پیامی که در صورت  خالی بودن جدول از داده ها، نمایش داده می شود empty

برای نمونه به حالت پیچیده تری از مثال قبل توجه نمایید:

$variables = array(
	'header' => array(
		array(
			'data' => 'ID',
			'field' => 'uid',
			'sort' => 'asc',
		),
		'Username',
	),
	'rows'=> array(
		array(
			'data' => array(
				array(
					'data' => 1,
				),
				'root',
			),
			'no_striping' => TRUE,
			'class' => 'first-row',
		),
		array(
			2,
			'admin',
		),
	),
	'attributes' => array(
		'class' => array('users-table'),
	),
	'sticky' => TRUE,
	'empty' => t('There are no results.'),
	'caption' => t('Users'),
);

$table = theme_table($variables);

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

امکانات پیشرفته تر تابع theme_table

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

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

در کد ذیل، شناسه و نام کاربری، اعضای سایت از دیتابیس دروپال استخراج شده و در یک جدول نمایش داده می شود:

$variables = array(
	'header' => array(
		'ID',
		'Username',
	),
	'rows'=> array(
	),
	'attributes' => array(
		'class' => array('users-table'),
	),
	'sticky' => TRUE,
	'empty' => t('There are no results.'),
	'caption' => t('Users'),
);

$data = db_select('users')
	->fields('users', array('uid', 'name'))
	->condition('status', 1)
	->execute()->fetchAll(PDO::FETCH_ASSOC);

foreach($data as $value) {
	$variables['rows'][] = array(
		$value['uid'],
		$value['name'],
	);
}

$table = theme_table($variables);

در تصویر زیر نیز نمایش آن را می بینید:

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

ابتدا ورودی تابع theme_table را به صورت یک آرایه تعریف کرده ایم. تنظیمات مختلف جدول مانند عنوان ستون ها را تنظیم کرده ایم و فقط ردیف های اطلاعاتی به صورت یک آرایه خالی در ایندکس rows مشخص شده اند. بعد از اینکه داده ها را از دیتابیس خواندیم، با استفاده از حلقه foreach روی این داده ها حرکت کرده و آرایه rows را که حاوی اطلاعات ردیف های جدول است را می سازیم. سپس تابع theme_table را فراخوانی کرده و آرایه $variables را در ورودی آن قرار می دهیم. به این صورت کد HTML جدول مورد نظرمان را فقط با صدا زدن یک تابع که در Drupal API از قبل موجود است، به دست می آوریم.

نظرات

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

ممنون خیلی خوب بود

ممنون

با سلام و تشکر فراوان،
چطور میتونم این جداولی رو که با theme_table() ایجاد کردم فایل tpl.php نمایش بدم،
مثلا منداده ها رو از دیتابیس میخونم و درون یک جدول به شکل بالا میریزم، حالا میخوام به کاربر در فایل tpl.php نمایششون بدم ، ممنون میشم اگه کمکم کنید، خیلی گیرم روی این قضیه

ارسال نظر