it-swarm.asia

استعلام مخصص في طرق العرض؟

في مرحلة ما ، وجدت الحاجة إلى تعديل استعلام SQL الذي تم إنشاؤه بواسطة طرق العرض ، وفي النهاية تجاوزت views_pre_execute وغيرت الاستعلام لهذا الرأي المعين.

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

23
Mad Scientist

يمكنك أيضًا استخدام hook_views_query_alter() لتغيير الاستعلام قبل تشغيله. أعتقد أن هذا يشبه hook_views_pre_execute ، ولكن يسهل تعديل الاستعلام. يمكنك في الأساس الوصول إلى كل جزء من الاستعلام من خلال مصفوفة ذات مفاتيح. لم أجد الكثير من الوثائق الرسمية ، ولكن هناك مثال جيد على ذلك في https://www.appnovation.com/blog/using-hook-views-query-alter . هذا هو أيضًا النهج الذي كان عليّ استخدامه لإصلاح خطأ التاريخ في وحدة التقويم.

25
Chaulky

بشكل عام هذا يعتمد على حالة الاستخدام الخاصة بك.

إذا كنت تريد أن يكون لديك حقل/مرشح/وسيطة يجب أن تتصرف بطريقة معينة ، فمن المستحسن كتابة معالج لها. انظر مساعدة وجهات النظر المتقدمة لمزيد من المعلومات.

إذا كنت تريد تغيير بعض أجزاء الاستعلام ، فيمكنك أيضًا استخدام hook_views_query_alter () . الشيء السيئ في hook_views_query_alter() هو أنه لا يمكنك حقًا إعادة استخدام الرمز هناك.

هذا هو رمز المثال المعروض من الوثائق. يعطي مثالا على ما يمكن أن يفعله الخطاف.

function mymodule_views_query_alter(&$view, &$query) {
  // (Example assuming a view with an exposed filter on node title.)
  // If the input for the title filter is a positive integer, filter against
  // node ID instead of node title.
  if ($view->name == 'my_view' && is_numeric($view->exposed_raw_input['title']) && $view->exposed_raw_input['title'] > 0) {
    // Traverse through the 'where' part of the query.
    foreach ($query->where as &$condition_group) {
      foreach ($condition_group['conditions'] as &$condition) {
        // If this is the part of the query filtering on title, chang the
        // condition to filter on node ID.
        if ($condition['field'] == 'node.title') {
          $condition = array(
            'field' => 'node.nid', 
            'value' => $view->exposed_raw_input['title'], 
            'operator' => '=',
          );
        }
      }
    }
  }
}
4
Daniel Wehner

لقد استخدمت hook_views_query_alter() لتغيير استعلام مشاهدات الخلية. تم اختبار المثال التالي تحت Drupal 7 مع 7.x-3.0 ، يضيف عبارة ORDER BY مخصصة إلى الاستعلام:

 function MYTHEME_views_query_alter(&$view, &$query) {
   // check so it's the correct view
   if($view->name == 'product_view') {
     // set a custom 'ORDER BY' clause in the query
     $query->orderby[0] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,3,4)',
       'direction' => 'ASC'
     );
     $query->orderby[1] = array(
       'field' => 'SUBSTR(taxonomy_term_data_name,1,2)',
       'direction' => 'ASC'
     );
   }
 }
3
Cyclonecode

لا أعرف ما إذا كان بإمكانك تغيير sql مباشرة ، ولكن يمكنك كتابة معالج الحقل الخاص بك وصياغة الاستعلام الخاص بك.

1
EricSchaefer