টোটুলস প্লাগইন কী কী (সামগ্রীর ধরণ, অ্যাক্সেস ইত্যাদি), এবং কীভাবে এটি তৈরি করা যায়?


56

টোটুল প্লাগইনগুলি কী কী এবং কীভাবে এটি তৈরি করা যায়?

উত্তর:


84

কোটুল পৃষ্ঠাগুলি পরিচালক এবং প্যানেলগুলির সাথে কাজ করার পরে , কাস্টম টোটুলস প্লাগইন যুক্ত করা কার্যকর।

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

প্রথমত, বয়লারপ্লেট :

যে কোনও মডিউলটি সিটিউল প্লাগইন সরবরাহ করার জন্য তাদের প্রথমে কোটলগুলিকে বলা উচিত যেখানে তাদের সন্ধান করা উচিত। নীচের হুকটি বলে যে আমরা "কন্টেন্ট_ টাইপস", এবং "অ্যাক্সেস" প্রকারের সিটিওলগুলির জন্য প্লাগিন সরবরাহ করি। ফাংশনটি সহজতর করা যেতে পারে, তবে এইভাবে আমরা নিশ্চিত করি যে কেবলমাত্র সঠিক মডিউলটি প্লাগইনগুলি সম্পর্কে জানানো হবে, পাশাপাশি কেবলমাত্র যখন আমরা প্রকৃতপক্ষে প্লাগিনের জন্য জিজ্ঞাসা করা হচ্ছে তখন ধরণের ফাইল সরবরাহ করি।

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

সামগ্রীর ধরণের প্লাগইন

কোল্টস ভোকাবুলারিতে একটি সামগ্রীর ধরণ, প্রায়শই "ফলক" হিসাবে পরিচিত, উদাহরণস্বরূপ দর্শনগুলির দ্বারা সরবরাহ করা। এই প্রশ্নে: কোনও ভিউ দ্বারা তৈরি এনআইডি-র একটি তালিকা বাধা দেওয়ার এবং এগুলিকে অন্য দর্শনের জন্য ফিল্টার হিসাবে ব্যবহার করার কী উপায় আছে? , লেখক প্রোগ্রামে একটি দৃশ্যে আর্গুমেন্টগুলি খাওয়ানোর বিষয়ে জিজ্ঞাসা করে। যদিও এটি এটি খুব কঠিন নয়, তবুও ফলোআপ প্রশ্নটি দ্রুত হয়ে যায়, "আমি কীভাবে ফলাফলগুলি প্রদর্শন করব?"।

একটি উত্তর, একটি নতুন "সামগ্রীর ধরণ" তৈরি করা হবে।

এখন, উপরে থেকে ভিউ প্রশ্নটি ব্যবহার করে প্রকৃত সামগ্রী ধরণের প্লাগইনটি এর মতো দেখতে পেল:

$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];
}

এটা সত্যিই দারুন! তবে এর জন্য কি কোনও "অফিসিয়াল" ডকুমেন্টেশন রয়েছে? (গুগল অনেকগুলি ব্লগ পোস্ট খুঁজে পেয়েছে তবে "অফিসিয়াল" কিছুই নয় ..)
ডনকুইক্সোট

1
সিটিউল মডিউলে নিজেই প্রচুর উদাহরণ রয়েছে যা মূলত যেখানে আমি জিনিসগুলি তুলেছি। আমি একাধিক অনুষ্ঠানে নিজেকে অফিসিয়াল ডক্স লেখার কাজটি গ্রহণ করার চেষ্টা করেছি, তবে সবসময় বাষ্পের বাইরে চলে যায়।
লেথেরিয়ন

আমি যখন এই টিউটোরিয়ালটি অনুসরণ করি তখন আমার একটি সমস্যা হয় এবং তা হ'ল কনফিগারেশন ফর্মটি কেবল ফাঁকা নয়, বোতামগুলির অভাব রয়েছে।
বেথ

আমি কোনওভাবেই এই প্রশ্ন / উত্তরটি প্রথমবারের মতো মিস করেছি, দুর্দান্ত লেখা!
ক্লাইভ

2
@ তবে ইস্যুটি মডিউল_কন্টেন্ট_টাইপ_এডিট_ফর্মের $ ফর্ম) (রেফারেন্সের মাধ্যমে পাস করা উচিত নয়)।
জাস্টিন

1

সিটিউলস প্লাগইনগুলি এমন ছোট ফাইল যা এর কার্যকারিতা বাড়ানোর উপায় হিসাবে যে কোনও মডিউলের অংশ হতে পারে। এগুলি উপাদানগুলি (প্যানগুলি) সরবরাহ করতে, আপনার প্যানেলে অতিরিক্ত শৈলীর বিকল্প যুক্ত করতে ব্যবহার করা যেতে পারে etc.

ধাপে ধাপে ডকুমেন্টেশনের জন্য দয়া করে প্যানেল পৃষ্ঠা ছাড়াই সিটিউলস প্লাগইনগুলি দেখুন । সংক্ষেপে এটি যায়:

  1. আপনার .infoফাইলে আপনাকে সিটুল নির্ভরতা যুক্ত করতে হবে:

    dependencies[] = ctools
    dependencies[] = panels
  2. আপনার প্লাগইনটি কোথায় রয়েছে তা সিটুলগুলিকে বলুন:

    <?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মডিউলটি যা সিটিউলস মডিউলের অংশ হিসাবে পরীক্ষা করে দেখুন বা মডিউলটি সক্ষম করার পরে ড্রুপাল ইউআইতে সহায়তা পৃষ্ঠা ( সিটুলস প্লাগিন উদাহরণ ) চেকআউট করুন ।


ড্রুপাল 8-এ, এটি এখন মূল অংশ (দেখুন: ড্রুপাল \ উপাদান \ প্লাগইন ) এবং এটি অবজেক্ট ইনরিয়েন্স, অবজেক্ট ইন্টারফেস এবং একক ফাইল এনক্যাপসুলেশন সরবরাহ করে। দেখুন: ড্রুপাল 8 এখন: ড্রুপাল 7-তে ওরিয়েন্টেড প্লাগইনগুলি

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