Ctools प्लगइन (सामग्री प्रकार, पहुंच आदि) क्या हैं, और कोई उन्हें कैसे बनाता है?


जवाबों:


84

हर अब और तब जब Ctools पेज मैनेजर , और पैनलों के साथ काम कर रहा है , तो कस्टम ctools प्लगइन्स को जोड़ना उपयोगी है।

Ctools प्लगइन्स बड़ी संख्या में फॉर्म में आते हैं, और अन्य मॉड्यूल, जैसे कि फ़ीड्स , एड्रेसफ़ील्ड और ओपनलेयर सभी अन्य मॉड्यूल द्वारा एक्स्टेंसिबल उपलब्ध कराने के लिए Ctools का उपयोग करते हैं। हालांकि प्लगइन के सबसे सामान्य रूप, शायद "सामग्री प्रकार", और "पहुंच" हैं। पहले इकाई "सामग्री" और उसके बंडलों के साथ भ्रमित नहीं होना चाहिए, जिसे सामग्री प्रकार भी कहा जाता है।

सबसे पहले, बॉयलरप्लेट :

किसी भी मॉड्यूल को ctools प्लगइन्स प्रदान करने के लिए, उन्हें पहले CTools को बताना चाहिए कि उन्हें कहाँ देखना है। नीचे दिए गए हुक का कहना है कि हम ctools के लिए प्लगइन्स प्रदान करते हैं, "content_types" और "एक्सेस" प्रकार के। फ़ंक्शन को सरल बनाया जा सकता है, लेकिन इस तरह से हम यह सुनिश्चित करते हैं कि केवल सही मॉड्यूल प्लगइन्स के बारे में बताया जाए, साथ ही यह केवल फाइलों के लिए डिस्क को स्कैन करने में मदद करता है जब हम वास्तव में प्लगइन का प्रकार प्रदान करते हैं।

function HOOK_ctools_plugin_directory($owner, $plugin_type) {
  // We'll be nice and limit scandir() calls.
  if ($owner == 'ctools' && ($plugin_type == 'content_types' || $plugin_type == 'access')) {
    return 'plugins/' . $plugin_type;
  }
}

नीचे दो प्लगइन्स प्रदान करने वाले मॉड्यूल के लिए एक उदाहरण निर्देशिका संरचना है। एक सामग्री प्रकार और एक एक्सेस प्लगइन।

module/
module/module.info
module/module.module
module/plugins/
module/plugins/content_types/
module/plugins/content_types/two_views_in_one.inc
module/plugins/access/
module/plugins/access/term_depth.inc

सामग्री प्रकार प्लगइन

Ctools शब्दावली में एक सामग्री प्रकार, अक्सर "फलक" के रूप में जाना जाता है, उदाहरण के लिए दृश्य के रूप में। इस सवाल में: क्या एक दृश्य द्वारा बनाई गई NID की सूची को बाधित करने और उन्हें किसी अन्य दृश्य के लिए फ़िल्टर के रूप में उपयोग करने का कोई तरीका है? , लेखक प्रोग्रामेटिक रूप से किसी दृश्य को तर्क-वितर्क खिलाने के बारे में पूछता है। जबकि इसमें यह कि यह बहुत कठिन नहीं है, अनुवर्ती प्रश्न जल्दी से बन जाता है, "मैं परिणाम कैसे प्रदर्शित करूं?"।

एक उत्तर, एक नया "सामग्री प्रकार" बनाने के लिए होगा।

अब, ऊपर से दृश्य प्रश्न का उपयोग करते हुए वास्तविक सामग्री प्रकार प्लगइन, इस तरह दिख सकता है:

$plugin = array(
  'title' => t('Render a View with arguments from another'),
  'single' => TRUE,
  'category' => array(t('My custom category'), -9),
  // Despite having no "settings" we need this function to pass back a form, or we'll loose the context and title settings.
  'edit form' => 'module_content_type_edit_form',
  'render callback' => 'module_content_type_render',
);

function module_content_type_render($subtype, $conf, $args, $context = NULL) {
  $block = new stdClass;
  $block->title = 'My View';

  $view = views_get_view('get_nids');
  $view->preview('display_machine_name', array($arg1, $arg2));

  $nids = '';
  foreach($view->result as $node) {
    $nids += $node->nid . ',';
  }
  $nids = rtrim($nids, ',');
  $view = views_get_view('get_related');
  $view->execute_display('display_machine_name', array($nids));
  $block->content = $view->render();

  return $block;
}

/**
 * 'Edit form' callback for the content type.
 */
function module_content_type_edit_form($form, &$form_state) {
  // No settings beyond context, which has already been handled.
  return $form;
}

इस मॉड्यूल को सक्षम करने के साथ, अब पैनल्स में एक नई श्रेणी होनी चाहिए, 'मेरी कस्टम श्रेणी', जहां किसी को एक एकल फलक मिलनी चाहिए, जो ऊपर से कोड प्रदान करता है।

एक्सेस प्लगइन

नीचे दिए गए एक्सेस प्लगइन शब्दावली की जड़ से मापे गए शब्द की गहराई के आधार पर वेरिएंट और / या पैन को फाइल करने की क्षमता प्रदान करेंगे।

<?php
/**
 * @file
 * Plugin to provide access control based upon a parent term.
 */

/**
 * Plugins are described by creating a $plugin array which will be used
 * by the system that includes this file.
 */
$plugin = array(
  'title' => t("Taxonomy: term depth"),
  'description' => t('Control access by the depth of a term.'),
  'callback' => 'term_depth_term_depth_ctools_access_check',
  'default' => array('vid' => array(), 'depth' => 0),
  'settings form' => 'term_depth_term_depth_ctools_access_settings',
  'settings form validation' => 'term_depth_term_depth_ctools_access_settings_validate',
  'settings form submit' => 'term_depth_term_depth_ctools_access_settings_submit',
  'summary' => 'term_depth_term_depth_ctools_access_summary',
  'required context' => new ctools_context_required(t('Term'), array('taxonomy_term', 'terms')),
);

/**
 * Settings form for the 'term depth' access plugin.
 */
function term_depth_term_depth_ctools_access_settings($form, &$form_state, $conf) {
  // If no configuration was saved before, set some defaults.
  if (empty($conf)) {
    $conf = array(
      'vid' => 0,
    );
  }
  if (!isset($conf['vid'])) {
    $conf['vid'] = 0;
  }

  // Loop over each of the configured vocabularies.
  foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
    $options[$vid] = $vocabulary->name;
  }

  $form['settings']['vid'] = array(
    '#title' => t('Vocabulary'),
    '#type' => 'select',
    '#options' => $options,
    '#description' => t('Select the vocabulary for this form. If there exists a parent term in that vocabulary, this access check will succeed.'),
    '#id' => 'ctools-select-vid',
    '#default_value' => $conf['vid'],
    '#required' => TRUE,
  );

  $form['settings']['depth'] = array(
    '#title' => t('Depth'),
    '#type' => 'textfield',
    '#description' => t('Set the required depth of the term. If the term exists at the right depth, this access check will succeed.'),
    '#default_value' => $conf['depth'],
    '#required' => TRUE,
  );

  return $form;
}

/**
 * Submit function for the access plugins settings.
 *
 * We cast all settings to numbers to ensure they can be safely handled.
 */
function term_depth_term_depth_ctools_access_settings_submit($form, $form_state) {
  foreach (array('depth', 'vid') as $key) {
    $form_state['conf'][$key] = (integer) $form_state['values']['settings'][$key];
  }
}

/**
 * Check for access.
 */
function term_depth_term_depth_ctools_access_check($conf, $context) {
  // As far as I know there should always be a context at this point, but this
  // is safe.
  if (empty($context) || empty($context->data) || empty($context->data->vid) || empty($context->data->tid)) {
    return FALSE;
  }

  // Get the $vid.
  if (!isset($conf['vid'])) {
    return FALSE;
  }
  $depth = _term_depth($context->data->tid);

  return ($depth == $conf['depth']);
}

/**
 * Provide a summary description based upon the checked terms.
 */
function term_depth_term_depth_ctools_access_summary($conf, $context) {
  $vocab = taxonomy_vocabulary_load($conf['vid']);

  return t('"@term" has parent in vocabulary "@vocab" at @depth', array(
    '@term' => $context->identifier,
    '@vocab' => $vocab->name,
    '@depth' => $conf['depth'],
  ));
}

/**
 * Find the depth of a term.
 */
function _term_depth($tid) {
  static $depths = array();

  if (!isset($depths[$tid])) {
    $parent = db_select('taxonomy_term_hierarchy', 'th')
      ->fields('th', array('parent'))
      ->condition('tid', $tid)
      ->execute()->fetchField();

    if ($parent == 0) {
      $depths[$tid] = 1;
    }
    else {
      $depths[$tid] = 1 + _term_depth($parent);
    }
  }

  return $depths[$tid];
}

यह कमाल का है! लेकिन क्या इसके लिए कोई "आधिकारिक" दस्तावेज है? (Google को बहुत सारे ब्लॉग पोस्ट मिलते हैं लेकिन "आधिकारिक" कुछ भी नहीं ..)
दान

1
खुद ctools मॉड्यूल में बहुत सारे उदाहरण हैं, जो मुख्य रूप से है जहां मैंने चीजों को उठाया। मैंने आधिकारिक डॉक्स को एक से अधिक मौकों पर लिखने का काम अपने हाथों में लेने की कोशिश की है, लेकिन हमेशा भाप से बाहर निकलता हूं।
लेटेरियन

जब मैं इस ट्यूटोरियल का अनुसरण करता हूं तो मुझे एक समस्या होती है, और वह यह है कि कॉन्फ़िगरेशन फ़ॉर्म केवल रिक्त नहीं है, लेकिन बटन का अभाव है।
bet

मैं किसी भी तरह इस प्रश्न / उत्तर को याद कर रहा हूं कि पहली बार, जबर्दस्त लेखन!
क्लाइव

2
@beth मॉड्यूल में $ रूप है_कंटेंट_टाइप_डिट_फॉर्म () संदर्भ द्वारा पारित नहीं किया जाना चाहिए।
जस्टिन

1

CTools plugins छोटी फाइलें हैं जो इसकी कार्यक्षमता को बढ़ाने के तरीके के रूप में किसी भी मॉड्यूल का हिस्सा हो सकती हैं। उनका उपयोग घटक (पैन) प्रदान करने के लिए किया जा सकता है, अपने पैनल में अतिरिक्त स्टाइल विकल्प जोड़ सकते हैं, आदि।

कृपया चरण प्रलेखन के लिए पैनल्स पृष्ठ के बिना CTools प्लगइन्स की जाँच करें । तो संक्षेप में यह इस प्रकार है:

  1. आपको अपनी .infoफ़ाइल में CTools निर्भरता जोड़ने की आवश्यकता है :

    dependencies[] = ctools
    dependencies[] = panels
    
  2. CTools बताओ जहाँ आपका प्लगइन स्थित है:

    <?php
    function MYMODULE_ctools_plugin_directory($module, $plugin) {
      if (($module == 'ctools') && ($plugin == 'content_types')) {
        return 'plugins/content_types';
      }
    }
    ?>
    
  3. .incफ़ाइल में प्लगइन लागू करें (डिफ़ॉल्ट रूप से $module.$api.inc)। उदाहरण प्लगइन कोड:

    <?php
    $plugin = array(
      'title' => t('Twitter feed'),
      'description' => t('Twitter feed'),
      'category' => 'Widgets',
      'icon' => '',
      'render callback' => 'twitter_block',
      'defaults' => array(),
    );
    
    // render callback
    function twitter_block() {
      // Add twitter widget javascript
      $url = TWITTER_USER
      $widget_id = TWITTER_WIDGET_ID;
      $data = array();
    
      $data['url'] = $url;
      $data['widget_id'] = $widget_id;
    
      $content = array(
        '#theme' => 'my_block',
        '#content' => $data,
      );
    
      $block = new stdClass();
      $block->content = $content;
      $block->title = '';
      $block->id = 'twitter_block';
    
      return $block;
    }
    ?>
    

प्लगइन्स का डिफ़ॉल्ट स्थान इस तरह दिखता है:

MYMODULE/
    plugins/
        content_types/
        templates/
    MYMODULE.info
    MYMODULE.module  

अधिक उदाहरणों के लिए, कृपया ctools_plugin_exampleमॉड्यूल की जाँच करें जो CTools मॉड्यूल के भाग के रूप में, या मॉड्यूल को सक्षम करने के बाद Drupal UI में मदद पृष्ठ ( CTools Plugin उदाहरण ) की जाँच करें।


Drupal 8 में, यह अब कोर का हिस्सा है (देखें: Drupal \ Component \ Plugin ) और यह ऑब्जेक्ट इनहेरिटेंस, ऑब्जेक्ट इंटरफेस और सिंगल फाइल इनकैप्सुलेशन प्रदान करता है। देखें: Drupal 8 अब: Drupal 7 में ऑब्जेक्ट ओरिएंटेड प्लगइन्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.