কীভাবে ভিউজ পিএইচপি ফিল্ড এবং কাস্টম ভিউ হ্যান্ডলার অনুসারে বাছাই করবেন?


11

কিছু দৃশ্যের পারফরম্যান্স সংক্রান্ত সমস্যাগুলি সমাধান করার জন্য এবং সর্বোত্তম অনুশীলনের প্রতি শ্রদ্ধা জানাতে আমি নিজের কাস্টম হ্যান্ডলারদের দ্বারা কিছু সময় আগে কনফিগার করা কিছু ভিউ পিএইচপি প্রতিস্থাপন করতে চাই ।

উদাহরণস্বরূপ, আমি একটি সেট পিএইচপি ফিল্ড পেয়েছি, প্রদর্শন থেকে বাদ , সেটআপ সঙ্গে:

মান কোড:

if( $row->sticky ==1 ) {
  return 100;
} else {

  if ( isset($row->product_id) && $row->product_id != ""  ){

    $query = "SELECT COUNT(statut.entity_id) FROM field_data_field_statut_depart statut"
    . " INNER JOIN  field_data_field_product product ON statut.entity_id= product.field_product_product_id"
    . " INNER JOIN  field_data_field_date_depart depart ON statut.entity_id = depart.entity_id"
    . " WHERE product.entity_id = ". $row->nid." AND field_statut_depart_value IN (2,3) AND field_date_depart_value > NOW(); ";

    $select = db_query($query);
    $count = $select->fetchField();

    return $count; 
  }
  else {
    return -1;
  }
}

আউটপুট কোড :

<?php print $value ; ?>`

তারপরে আমি বিশ্বব্যাপী পিএইচপি সাজানোর মানদণ্ডে সেই ক্ষেত্রটিকে প্রথম সাজানোর মানদণ্ড ( আরোহণ ) হিসাবে ব্যবহার করি :

if ($row1->php> $row2->php) return -1; else return 1;

আপনি যদি আমাকে সঠিক উপায়ে রাখতে পারতেন তবে আমি সত্যিই কৃতজ্ঞ হব: কোন ফাংশন (গুলি) তে আমি পিএইচপি দিয়ে ডেটাবেজে শেষ করতে একই কোডটি তৈরি করব?

সারসংক্ষেপ :

অনুসন্ধান এবং অগ্রগতি, প্লাস @ রেনারহফ সাহায্যের পরে, বেশিরভাগ বাস্তবায়ন ঠিক আছে, নীচে বিস্তারিত বলে মনে হচ্ছে। তবে আমি এখনও একটি পয়েন্ট নিয়ে লড়াই করছি : আমি একটি মান গণনা করতে একটি কাস্টম ফিল্ড হ্যান্ডলার যুক্ত করেছি, তবে কীভাবে আমি এই হ্যান্ডলারের অর্ডার করতে পারি?

সম্পাদনা:

আমি এ পর্যন্ত কি করেছি:

.info ফাইল

files[] = views_handler_vts_products_sort.inc
files[] = includes/views_handler_vts_count_depconf_field.inc

মডিউল ফাইল

/**
 * Implements hook_views_data().
 */
function vts_views_handler_views_data() {
  $data['custom']['table']['group'] = t('Custom');
  $data['custom']['table']['join'] = array(
    // #global is a special flag which let's a table appear all the time.
    '#global' => array(),
  );

  $data['custom']['custom_handler'] = array(
    'title' => t('Vts custom Sort Handler'),
    'help' => 'Sorts products by sticky first then by custom statut field',
    'sort' => array(
      'handler' => 'views_handler_vts_products_sort',
    ),
  );

  $data['custom']['count_depconf_field'] = array(
    'title' => t('Sum of products with status confirmed '),
    'help' => t('Calculate Sum of products with status confirmed, to order lists".'),
    'field' => array(
      'handler' => 'views_handler_vts_count_depconf_field',
      'click sortable'=> TRUE,
    ),
    /*'sort' => array(
      'handler' => 'views_handler_sort',
    ), */
  );  
  return $data;
}

function vts_views_handler_views_api() {
    return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'vts_views_handler'),
  );
}

views_handler_vts_products_sort ফাইল

/**
 * Base sort handler that has no options and performs a simple sort.
 *
 * @ingroup views_sort_handlers
 */
class views_handler_vts_products_sort extends views_handler_sort {

  function query() {
    $this->ensure_my_table();
    // Add the field.
    $this->query->add_orderby('node', 'sticky', 'DESC');
  }
}

views_handler_vts_count_depconf_field ফাইল

/*
 * A simple field to calculate the value I wish to order by.
 */
class views_handler_vts_count_depconf_field extends views_handler_field {

  function query() {
    //do nothing
  }

  function render($values) {
    $count = 0;

    $product_id = isset($values-> commerce_product_field_data_field_product_product_id)? $values-> commerce_product_field_data_field_product_product_id: NULL;
    if(!is_null($product_id)){

      $query = "SELECT COUNT(statut.entity_id) FROM field_data_field_statut_depart statut"
      . " INNER JOIN  field_data_field_product product ON statut.entity_id= product.field_product_product_id"
      . " INNER JOIN  field_data_field_date_depart depart ON statut.entity_id = depart.entity_id"
      . " WHERE product.entity_id = " . $values->nid . " AND field_statut_depart_value IN (2,3) AND field_date_depart_value > NOW(); ";

      $select = db_query($query);
      $count = $select->fetchField();
    }
    return $count;
  }
}

অবশিষ্ট প্রশ্ন:

  • কাস্টম ফিল্ড হ্যান্ডলার দ্বারা অর্ডার কিভাবে? আমি কাস্টম বাছাই হ্যান্ডলারে 'click sortable'=> TRUE,OR 'sort' => array('handler' => 'views_handler_sort',),বা যোগ করার চেষ্টা করেছি $this->query->add_orderby('custom', 'count_depconf_field', 'DESC');। 'অর্ডার ক্লজ' এ অজানা কলামটি ছাড়া আর কিছুই কাজ করে না

  • শাবাশ আমি কিভাবে পেতে পারেন $row->product_idএবং $row->nidভিতরে query()? সাবকিউরিটি তৈরি করার জন্য আমার এটি দরকার। : একটি দর্শন হ্যান্ডলার ক্ষেত্র যুক্ত হয়েছে এবং রেন্ডারে ($ মান) সারি মানগুলি খুঁজে পেয়েছে ...

  • সমাপ্ত : উদাহরণ হ্যান্ডলারের কোন অংশটি আমাকে সম্পাদনা করতে হবে? শুধুমাত্র ক্যোয়ারী ফাংশন? আমার কি পুরো উদাহরণ কোড বা কেবলমাত্র কাস্টম অংশগুলি রাখা দরকার?

ধন্যবাদ

উত্তর:


7

আপনার একটি ভিউ সাজানোর হ্যান্ডলারটি ব্যবহার করতে হবে: https://api.drupal.org/api/views/handlers!views_handler_sort.inc/group/views_sort_handlers/7.x-3.x

পারফরম্যান্স কারণে আপনার ফলাফল বাছাইয়ের জন্য আপনি পিএইচপি ব্যবহার করতে পারবেন না। আপনি যদি পুরো টেবিলের ফলাফলগুলি আনেন তবেই ফলাফলগুলি বাছাই করতে পিএইচপি ব্যবহার করা যেতে পারে এবং বেশিরভাগ সময় এটি কোনও বিকল্প নয়।

সুতরাং, আপনার নিজের ভিউ সাজানোর হ্যান্ডলার তৈরি করতে হবে, আপনার ভিউটিতে এটি কনফিগার করতে হবে এবং তারপরে যথাযথ যোগদানের জন্য ভিউ এপিআইয়ের কার্যকারিতাটি ব্যবহার করতে হবে, যেখানে আপনার সাজানোর জন্য প্রয়োজনীয় ডেটা পৌঁছানোর জন্য এমনকি সাবকিউরিগুলিও থাকতে পারে। আপনার ক্ষেত্রে, সুনির্দিষ্ট তারিখ এবং প্রকারের শর্তযুক্ত সংস্থাগুলির একটি সংখ্যা।

এই সমস্ত কোডটি আপনার অবজেক্টের "ক্যোয়ারী ()" পদ্ধতিতে থাকতে হবে। আপনার এই জাতীয় একটি কোয়েরি অর্জন করতে হবে:

SELECT table_x.field_y, ...
FROM  ...
...
...
ORDER BY row.sticky, (SELECT COUNT(statut.entity_id) 
FROM field_data_field_statut_depart statut
INNER JOIN field_data_field_product product
INNER JOIN field_data_field_date_depart depart
WHERE product.entity_id = table_x.field_y
AND field_statut_depart_value IN (2,3) 
AND field_date_depart_value > NOW())

Https://api.drupal.org/api/views/plugins%21views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Add_orderby/7.x-3.x ফাংশন এবং একটি উপশক্তি ব্যবহার করে ।

সাবকিউরিটি 3 বা ততোধিক জোড় এবং কিছু ক্ষেত্রে শর্তযুক্ত হতে পারে তবে পুরো জিজ্ঞাসা ছাড়া আমি বলতে পারি না।

সম্পাদনা

আপনি "ভিউ_হ্যান্ডলার" অবজেক্ট থেকে প্রসারিত করেন তবে সর্বোচ্চ ডিফল্ট কোডটি ব্যবহার করতে সক্ষম হতে আপনার সরাসরি "ভিউ_হ্যান্ডলার_সোর্ট" থেকে প্রসারিত হওয়া উচিত:

class views_handler_vts_products_sort extends views_handler_sort {
  /**
   * Called to add the sort to a query.
   */
  function query() {
    $this->ensure_my_table();
    // Add the field.
    $this->query->add_orderby($this->table_alias, $this->real_field, $this->options['order']);
  }
}

আপনি উপরের মতো দেখতে পাচ্ছেন যে আপনার ক্ষেত্রে ইউআই ইত্যাদির কোনও নির্দিষ্ট কনফিগারেশন প্রয়োজন না হওয়ায় আপনার ক্ষেত্রে কেবল "ক্যোয়ারী" পদ্ধতি প্রয়োজন etc.

আপনার "ক্যোয়ারী ()" পদ্ধতির ভিতরে প্রোডাক্ট_আইডি বা এনআইডি পেতে , আপনাকে বিদ্যমান ক্ষেত্রগুলি ব্যবহার করতে হবে যা ভিউ ফিল্ড হ্যান্ডলারগুলি (এবং আপনার দর্শনের ইউআইতে সংজ্ঞায়িত) দ্বারা ক্যোয়ারীতে যুক্ত হয়েছিল।

এই ফাইলটি আপনি যা অর্জন করতে চান তার নিখুঁত উদাহরণ (আপনি এটি ভিউ ডকুমেন্টেশনে খুঁজে পেতে পারেন এটি একটি বিদ্যমান ফাইল তবে আমার খ্যাতি খুব কম হওয়ায় লিঙ্কটি সেট করার অনুমতি নেই):

class views_handler_sort_node_version_count extends views_handler_sort {
  function query() {
    $this->ensure_my_table();

    $this->query->add_orderby(NULL, '(SELECT COUNT(vid) FROM {node_revision} WHERE nid = {' . $this->table_alias . '}.nid)', $this->options['order'], 'sort_node_version_count');
  }
}

আপনি যদি এই কোডটি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে পারেন তবে দেখুন এবং শেষ ফলাফলটি দেখে আমি আনন্দিত হব :)


আমি আমার প্রশ্নটি অগ্রগতি সহ সম্পাদনা করেছি। আপনি যদি আপনার উত্তরটি সম্পূর্ণ করতে চান? অনেক অনেক ধন্যবাদ
কোজো

1
সম্পন্ন, দয়া করে এটি পরীক্ষা করে দেখুন এবং আপনি নিজের সাজানোর কাজটি পরিচালনা করতে পেরেছেন কিনা তা আমাকে বলুন :)
রেনারফ

আমার খারাপ, আমি বুঝতে পেরেছি যেহেতু ভিউগুলি বাছাই করার জন্য ডিবি ক্যোয়ারির উপর নির্ভর করে, তাই দেখে মনে হচ্ছে হ্যান্ডলারটি তৈরির মতো একটি ডামি ক্ষেত্রের সাথে আমি কখনও ভিউ বাছাই করব না! সুতরাং আমি অবশ্যই subquery কাজ করতে হবে!
কোজো

1
এর আগে প্রতিক্রিয়া না দেওয়ার জন্য দুঃখিত! আমি আশা করি আমার উত্তরটি কার্যকর হয়েছিল তবে আপনি সমস্ত কাজ নিজেই করেছিলেন, সাব-কোয়েরি ওরফে জিনিসটি সম্পর্কে আমি জানতাম না, আপনার বিস্তারিত সমাধানের জন্য ধন্যবাদ, এটি অনেক লোককে সহায়তা করবে।
রেনারহফ

4

আমি কাস্টম ভিউস হ্যান্ডলারের দ্বারা ভিউ পিএইচপি বাছাইয়ের জায়গায় প্রতিস্থাপন করতে কীভাবে করেছি তার সম্পূর্ণ বাস্তবায়নের নীচে ভাগ করছি ।

.info ফাইল

files[] = includes/views_handler_my_custom_sort.inc

মডিউল ফাইল

/**
 * Implements hook_views_data().
 */
function MODULE_NAME_views_data() {
  $data['custom']['table']['group'] = t('Custom');
  $data['custom']['table']['join'] = array(
    '#global' => array(),
  );

  $data['custom']['custom_handler'] = array(
    'title' => t('My custom Sort Handler'),
    'help' => 'Sorts products by sticky first then by custom statut field',
    'sort' => array(
      'handler' => 'views_handler_vts_products_sort',
    ),
  );

  return $data;
}

function MODULE_NAME_views_api() {
    return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'MODULE_NAME'),
  );
}

ভিউ_হ্যান্ডলার_মাই_ কাস্টম_সোর্ট.আইঙ্ক ফাইল

/**
 * Base sort handler that has no options and performs a simple sort.
 *
 * @ingroup views_sort_handlers
 */
class views_handler_my_custom_sort extends views_handler_sort {

  function query() {
    $this->ensure_my_table();

    $sub_query = "(SELECT COUNT(p.field_product_product_id) "
      . "FROM field_data_field_product p "
      . "LEFT JOIN field_data_field_statut_depart statut ON statut.entity_id = p.field_product_product_id "
      . "LEFT JOIN field_data_field_date_depart depart ON depart.entity_id = p.field_product_product_id  "
      . "LEFT JOIN node nod ON nod.nid = p.entity_id "
      . "WHERE nod.nid = node.nid "//This is a the obligatory condition mapping the subquery with the outer query
      . "AND field_statut_depart_value IN (2,3) "
      . "AND field_date_depart_value > NOW())";

    /* I'm timeless to write the query with the object syntax, here was a beginning
    $sub_query = db_select('field_data_field_product', 'p');
    $sub_query->addField('p', 'field_product_product_id');
    $sub_query->leftJoin('node', 'nod', 'nod.nid = p.entity_id');
    $sub_query->where("nod.nid = node.nid");
    $sub_query->countQuery(); */  

    $this->query->add_orderby('node', 'sticky', 'DESC');
    $this->query->add_orderby(NULL, $sub_query, 'DESC', 'subquery');

  }
}

কিছুটা ব্যাখ্যা: কীভাবে ভিউ হ্যান্ডলারগুলি বাস্তবায়িত করা যায় তা বোঝার পরে, আমি সাবকোয়ারিতে বিভ্রান্ত হয়ে পড়েছিলাম:

  • ফলাফলটি দ্বারা বাইরের ক্যোয়ারী সহ "সারি" সজ্জিত করুন: একই টেবিল এবং কলামটি কিন্তু ভিন্ন ভিন্ন নাম: WHERE nod.nid = node.nid
  • উপন্যাসটি এতে সেট করুন add_orderby: $this->query->add_orderby(NULL, $sub_query, 'DESC', 'subquery');কাজ করে, তবে $this->query->add_orderby(NULL, $sub_query, 'DESC');হয় না

এই শেষ পয়েন্ট অবাক কারণ কারণ SELECT TITLE FROM node ORDER BY (SELECT COUNT(field_product_product_id) FROM field_data_field_product p LEFT JOIN node nod ON nod.nid = p.entity_id WHERE nod.nid = node.nid ) এসকিউএল সরাসরি ইনপুটটিতে কাজ করার এটি বর্তমান সেটআপ জুড়ে নেই across

আপনাকে সাব-কোয়েরি ওরফে নির্দিষ্ট করতে হবে এবং চূড়ান্ত ক্যোয়ারীটি এমন কিছু হবে SELECT TITLE, (SELECT COUNT(field_product_product_id) FROM field_data_field_product p LEFT JOIN node nod ON nod.nid = p.entity_id WHERE nod.nid = node.nid ) as subquery FROM node ORDER BY subquery

কাস্টম হ্যান্ডলার ক্ষেত্রে ফলাফলটি বাছাই করার জন্য মানগুলি গণনা করার চেষ্টা করা হয়নি, কাজ হয়নি কারণ ভিউগুলি বাছাই একটি ডিবি ভিত্তিতে করা হয় এবং কাস্টম ফিল্ড হ্যান্ডলারটি এক ধরনের ডামি ক্ষেত্র ... কমপক্ষে এটি আমার উপসংহার ছিল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.