اجرای View و استفاده از خروجی آن در کدنویسی

نسخه ی views مورد بحث: 6.x-2.16

منظور از اجرای View این است که می خواهیم خروجی یک View را به صورت یک آرایه در برنامه مان استفاده کنیم.

هر View، به چند طریق می تواند استفاده شود:

  • طریقه‌ی معمول که عبارت است از قرار دادن View در یک Block یا در یک Page یا ... که دروپال به صورت خودکار  View را اجرا می کند و خروجی آن Render شده و به کاربر نمایش داده می شود.
  • اجرای View در برنامه نویسی به این صورت که View فراخوانی می شود و خروجی آن به صورت یک آرایه‌ی ساخت یافته در برنامه Return می شود. در این حالت View رندر نمی شود و می توان از ساختمان داده ی آن استفاده‌ی بهینه کرد.
  • ...

در زیر چند تا نمونه را معرفی می کنم:

توجهجهت آزمایش، می توانید یک View ایجاد کنید که لیست node هایی که منتشر شده اند و نوع آن ها story است را نشان دهد. و مثال های این قسمت را بر روی آن انجام دهید.
در زیر من کد Export گرفته شده ی این View را برای استفاده ی شما قرار می دهم که می توانید آن را Import کنید تا View ی مورد نظر ایجاد شود.

فایل ضمیمه شده است. views_test.txt


روش اول

می خواهیم View را اجرا کنیم و خروجی HTML حاصل از Render شدن View را در برنامه استفاده کنیم:

$view = views_get_view('{view name}');
$display_id = 'default';
$view->set_display($display_id);
$view->execute();

print $view->preview();

طرز کار کد فوق به این صورت است که:

1 - ابتدا، با استفاده از تابع views_get_view() آبجکت یک View را به دست می آوریم.
این متد، نام View را به عنوان آرگومان دریافت می کند و یک آبجکت View برمیگرداند.

توجه کنید که برای به دست آوردن نام View باید به آدرس URL صفحه ی ویرایش View دقت کنید. مثلا در مثال ما، آدرس صفحه‌ی ویرایش View عبارت است از:
/admin/build/views/edit/example_view
که نام View می شود : "example_view"

2 - آبجکت View که برگردانده می شود دارای تعداد زیادی خصوصیت و متد است. یکی از متد های این آبجکت، متد set_display() می باشد.
متد set_display() نام یک display را به عنوان آرگومان دریافت می کند و display فعال در آبجکت view را تنظیم می نماید.

برای به دست آوردن نام display، صفحه ی ویرایش View را باز کنید و موس را بر روی تب افقی متعلق به Display مورد نظرتان بیاورید. در پایین پنجره ی مرورگر، آدرس URL آن نقطه نمایش داده می شود. بخش انتهایی آدرس URL نام display را نشان می دهد.

تصویر چگونگی نمایش دادن نام Display در هنگام ویرایش View

در مثال ما، نام display ها عبارت است از:
default, page_1
همان طور که می بینید نام Display ها به این صورت نام گذاری می شود که نوع Display بعلاوه یک آندلاین و شمارنده ی Display می باشد. مثل page_1, page_2 , ...

3 - پس از این که Display پیش فرض را در آبجکت View تنظیم کردیم، می توانیم آن را با فراخوانی متد execute() اجرا کنیم. متد execute سبب می شود که View اجرا شود و خروجی آن نیز در داخل آبجکت قرار گیرد. یعنی آبجکت View بعد از فراخوانی متد execute نتایج اجرا را نیز شامل می شود. که در خاصیت result آن قرار گرفته است.

4 - متد preview از آبجکت view، خروجی view را Render می کند و به فرمت HTML باز می گرداند که می توان مستقیما آن را print گرفت.

روش دوم

می توان با متد execute_display() از آبجکت view مستقیما یک display خاص از view را اجرا کنیم و خروجی HTML آن را به دست آوریم. (در این حالت دیگر نیازی به استفاده از متد set_display() نمی باشد.)

$view->execute_display('{display name}', '{arguments}')

این متد دو تا آرگومان دریافت می کند که اولی نام Display مورد نظر است و دومی یک آرایه شامل آرگومان ها جهت ارسال به View می باشد. اگر View ی مورد نظر دارای آرگومان نباشد،می توان یک آرایه ی خالی ارسال کرد. array()

print $view->execute_display('default', array());
فایل‌های ضمیمه: 

دیدگاه‌ها

سلام

خسته نباشید بسیار عالی بود فقط اگر امکان داره چون فعلا که مشغول این نسخه هستید بعد از اتمام این نسخه در مورد نسخه 3 این ماژول هم توضیحاتی بدید عالی میشه چون اصلا منابعی برای ورژن 3 به فارستی حتی دست و پا شکسته هم نداریم هرچند تفاوت ظاهری بین این دو ورژن یکم زیاد هست ولی در کل میشه از آموزش 2 یه کمکی گرفت

 

ممنون بابت مطلب مفیدتون

 

سلام ف با تشکر از مطلب مفیدتون.

 

من با webform یه صفحه ثبت نام درست کردم ف حالا چه جوری میتونم با اسفاده از ماژول views یا هر ماژول دیگه ای یک فیلد خاص از اون فرم ثبت نام رو از دیتابیس بیرون بکشم و استفاده کنم؟

 

مثلا 4 فیلد ، نام ، نام خانوادگی ، سن ، محل تولد. ثبت شده و من میخوام توی یک صفحه فقط فیلد مربوط به محل تولد رو ببینم

 

ممنون از لطفتون

http://www.shopeman.com

ممنون از راهنماییتون

( ف) اشتباه تایپیه ...(،) وقتی شیفت رو نگیری میشه (ف ) .

 

در مورد این Relationship یه توضیح کوچولو میدین؟

ماژول هستش؟ نحوه استفاده ازش چه جوریه؟

 

ممنون

اگر از دروپال 6 استفاده می کنید، این تصویر را ببینید:

http://www.hejazee.com/sites/www.hejazee.com/files/fields/field_tutorial...

در تصویر دنبال Relationship بگردید تا متوجه شوید منظور از Relationship چیست.

اما اگر از دروپال 7 استفاده می کنید، آخرین نسخه ی ماژول Views و webform را نصب کنید. سپس یک View ی جدید ایجاد کنید.

در هنگام ایجاد یک View جدید، (در این صفحه admin/structure/views/add) نام View را وارد کنید و در قسمت Show: گزینه ی آخر یعنی Webform Submissions را انتخاب کنید. (در دروپال 6 هم چیزی شبیه این وجود دارد)

 

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

I love Drupal

سلام

 

ممنون از توضیحات شما ،

عکسی که ارسال کردین متاسفانه باز نمیشه !

من با دروپال 7 کار میکنم و با اینکه هم view و هم webform رو نصب کردم تو گزینه show اون آیتمی که گفتین وجود نداره

عکس به پیوست ارسال شده:

http://up98.org/upload/server1/02/i/3fqvukjudvu2ot7ox91c.jpg

به هر حال، برای من که کار می کند!

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

من از دروپال 7.12 استفاده می کنم همراه با آخرین نسخه ی Views و webform

همچنین یک node از نوع webform هم ایجاد کرده ام.

http://www.hejazee.com/sites/www.hejazee.com/files/fields/field_tutorial...

 

I love Drupal

با تشکر مجدد و عذر خواهی بابت مزاحمت

 

من دروپال طبق فرمایش شما با ماژول ها رو نصب کردم و اون قسمت از مشکل حل شد ،

اما بعد از اون مرحله ( انتخاب Webform Submissions ) , فیلد خاصی از یک وب فرم که توسط کاربر پر شده رو نمیتونم نمایش بدم !

 

من میخوام از یک وب فرم که مثلا نام و نام خانوادگی شخص رو مپرسه ، یک یا هر دو قیلد رو ببینم ، مثلا :

بهزاد حسینی

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

http://up98.org/upload/server1/02/i/soxn8v0lkqlm0fgjcspr.jpg

 

متاسفانه در حال حاضر، امکان نمایش داده های ارسال شده توسط ماژول Webform در درون Views وجود ندارد!

برای حل این مشکل که خیلی ها از بابت آن ناراحت هستند، راه حل های متعددی ارائه شده است که در زیر برخی از آن ها می توانید مطالعه کنید:

Google search

http://www.drupalgardens.com/content/webform-results-views

http://drupal.stackexchange.com/questions/18279/how-i-create-table-view-...

http://drupal.org/project/webform_views_submitted

http://dev.nodeone.se/node/666

که ظاهرا همه ی آن ها برای دروپال 6 می باشند!

برای دروپال 7 اینجا را ببینید:

http://drupal.org/node/1089598

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

من خودم معمولا از ماژول Webform استفاده نمی کنم. به نظر من، ماژول چندان جذابی نیست.

I love Drupal

من میتونم با شما تماس تلفنی داشته باشم ؟

اگر مقدور بود لطفا شماره تماس خودتون رو برای من ایمیل فرمایید ، متشکرم

 

در ضمن این که مربوط به دروپال 7 هست رو قبلا دیدم ، ظاهرا پچ فایلش باگ زیاد داره ، که کامتهایی که زیرش گذاشتن اینو نشون میده

 

سلام

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

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

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

این مراحل رو انجام دادم ولی درست کار نمی کنه و زیر صفحه ویوز اولی (پروفایل کاربر) همه پست ها رو نشان می ده نه فقط پست های کاربر لطفا راهنماییم کنید:

1. از ویوز دوم یک بلوک ساختم

2. بعد در تنظیمات بلوک فقط نمایش در صفحه زیر رو انتخاب کردم و آدرس صفحه پروفایل کاربران رو نوشتم به این صورت

user/*

صفحه پست های ارسالی کاربران به صورت مجزا وقتی آدرس رو به این شکل وارد کنیم (مثلا user/1)کار می کنه و پست های هر کاربر رو نمایش میده ولی بلوک همین ویوز زیر صفحه پروفایل کار نمی کنه

لطفا راهنمایی م کنید ممنون

احتمالا دلیلش اینه که Argument های لازم به Views دوم ارسال نمیشه.

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

در ضمن، در صورت امکان، Export شده‌ی دوتا View تان را برای من قرار دهید تا بررسی کنم.

چند تا نکته:

برای قرار دادن دوتا View در یک View می توانید از Display های از نوع Attachment استفاده کنید.

به نظر من، می‌توانید به جای روش فعلی تان، از panels برای این کار استفاده کنید. البته panels هم دردسرهای خاص خودش رو داره، ولی می توانید View ها را در درون آن قرار دهید و آرگومان هایتان را به آن ارسال کنید.

همچنین، ماژول هایی مانند Workspace (دروپال 6) هم می تواند در این زمینه کمک کند.

و خودم هم معمولا ترجیح می‌دهم که به جای این کارها، برای ساخت یک پروفایل اختصاصی برای کاربر که کاملا سفارشی باشد، از فایل tpl.php استفاده کنم!

البته استفاده از Views و panels انعطاف بیشتری دارد. ولی اولا پردازش را قدری کند می‌کند. و همچنین گاها به مقدار قابل توجه ای کد نویسی نیاز پیدا می‌کند!

I love Drupal

خيلي از لطفتون ممنونم

همين كه پاسخم رو دادين لطف كردين

در خصوص سئوالم بيشتر توضيح مي دم

صفحه توليد شده از ويوز اول : http://farhangi.um.ac.ir/portal/?q=profile/1

صفحه توليد شده از ويوز دوم: http://farhangi.um.ac.ir/portal/?q=userpost/1

كه هر دو تاش با آرگومنت كاربر كار مي كنه يعني اون /1 uid كاربر كه بر اساس اون كار ميكنه

حالا من مي خوام اون ويوز دوم زير ويوز اول نمايش داده بشه بطوريكه پست هاي همون كاربر رو نمايش بده يعني وقتي آدرس اولي رو در بروزر وارد مي كني صفحه توليد شده ويوز دوم هم زيرش نمايش داده بشه

كدهاش هم براتون ميل مي كنم

ممنون از لطفتون

فعلا سرور میل ما درست کار نمی کند و لذا ایمیلی دریافت نمی کنم.
البته کدهای یک View اصلا چیز حساسی نیست و می‌توانید با خیال راحت آن را در همین‌جا قرار دهید!

به احتمال زیاد مشکل در ارسال آرگومان ها است. اگر حوصله‌ی پیگیری مشکل را دارید که بسم الله!

در غیر اینصورت، من به شما توصیه می‌کنم که به جای این‌کار، از panels استفاده کنید (روش بهتری است) و یا این که از فایل tpl.php استفاده کنید (یعنی theme تان را دستکاری کنید)

آموزش قرار دادن یک View در کد PHP هم در همین صفحه نوشته شده است (مطلب اصلی).

I love Drupal

سلام یه سوال متفرقه

اون کادر توجه رو چطوری ایجاد کردین ؟

اصلن چی هست ؟ چطوری میشه توی دروپال ازش استفاده کرد ماژول خاصی وجود داره براش ؟

 

ممنون

منظورتان از کادر توجه چیست؟

اگر منظور فرم ثبت نام در خبرنامه است که به صورت inline pop up ظاهر می شود، باید عرض کنم که این یک ماژول است که خودم آن را نوشته ام و سورس آن خصوصی است! :)

I love Drupal

نه منظورم اون نیست منظروم همون توجه توی متن پست بالا هستش

یه فیلد ثابت توی محتوا هستش یا نه خودتون با کد درستش کردین ؟

توجهجهت آزمایش، می توانید یک View ایجاد کنید که لیست node هایی که منتشر شده اند و نوع آن ها story است را نشان دهد. و مثال های این قسمت را بر روی آن انجام دهید.
....

این ماژول نیست. وقتی می خواهم چنین کادری درست کنم، کد HTML آن را وارد می کنم.

البته می توان برای آن ماژول هم نوشت. اگر بخواهیم برای آن ماژول درست کنیم، باید یک ماژول درست کنیم که یک input filter ایجاد کند و مثلا تگ های {notice} را (به عنوان مثال) به این صورت تبدیل کند.

بعد اگر چنین ماژولی نصب کرده باشیم، کافی خواهد بود که متن مورد نظر را در تگ {notice} قرار دهیم تا این شکلی نمایش داده شود.

I love Drupal

افزودن دیدگاه جدید