it-swarm.asia

هل من الممكن تعيين إعدادات البيجر في طرق العرض ديناميكيًا؟

لنفترض على سبيل المثال ، أن لديك طريقة عرض يتم عرضها عند عرض نوع عقدة معين ، ولكنك تريد أن تكون إعدادات النداء مختلفة لكل عقدة فردية. كنت أفكر في إنشاء حقل CCK مثل "إعداد النداء" ومن ثم إعطائه خيار عدد صحيح لـ x-y. لكنني لا أعرف ما إذا كان من الممكن توصيل هذا الحقل ديناميكيًا بطريقة ما بإعدادات طرق العرض. أو هل هناك طريقة أخرى للقيام بذلك ربما؟

13
Jay

ربط المشاهدات الذي تريد استخدامه هو hook_views_pre_build التي يتم استدعاؤها قبل بناء الاستعلام. الآن هذا على افتراض أن لديك بعض الخبرة الأساسية في تطوير الوحدة النمطية وأنك على دراية بواجهة برمجة تطبيقات المشاهدات.

يجب أن تكون قادرًا على القيام بما يلي:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

أعلاه نستخدم ربط طرق العرض الذي يتم استدعاؤه قبل أن يتم إنشاء استعلام العرض بهذه الطريقة سيعكس النداء وكل شيء آخر التغيير.

كلمة تحذير: يجب استخدام خطاطيف العرض فقط إذا فهمت ما يحدث. رمز أعلاه هو مكتوب لوجهات النظر -2.

أتمنى أن يساعدك هذا.

18
ericduran

ل Drupal 7 ، يجب فقط كتابة ما يلي:

$view->items_per_page = $pager_count;

في المثال:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

يمكنني استخدام مثال التعليمات البرمجية بواسطةericduran.

2
heilop

لتحديث نتيجة المشاهدات ونداء النداء في hook_views_pre_render ، يمكنك القيام بما يلي:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

هذا يجب أن يعمل !! ؛)

1
tanmayk

يجب عليك استخدام وظيفة العرض المسبق

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}
1
dobeerman

قانونmaymayk خدع لي. في hook_views_pre_render ، تمت إضافة سطرين فقط من التعليمات البرمجية

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

ولكن لم أكن بحاجة إلى إضافة النتائج إلى طريقة العرض.

0
adevms