Ctools eklentisi nedir (içerik türü, erişim vb.) Ve biri bunları nasıl oluşturur?


Yanıtlar:


84

Her zaman ve sonra Ctools Page manager ve Paneller ile çalışırken , özel Ctools eklentileri eklemek faydalıdır.

Ctools eklentileri çok sayıda formda gelir ve Feeds , Addressfield ve Openlayers gibi diğer modüller, diğer modüller tarafından genişletilebilen eklentiler sağlamak için Ctools kullanır. En yaygın eklenti türleri, muhtemelen "içerik türü" ve "erişim" dir. İlk olmalı değil varlık "içerik" ve onun demetleri ile karıştırılmamalıdır, ayrıca içerik türleri denir.

İlk olarak, kazan plakası :

Herhangi bir modül için eklentileri sağlama, önce Ctools'a onları nerede arayacaklarını söylemeleri gerekir. Aşağıdaki kanca, "content_types" ve "access" türlerinden ctools için eklentiler sunduğumuzu söylüyor. İşlev daha basit hale getirilebilir, ancak bu yolla yalnızca doğru modülün eklentiler hakkında söylenmesini sağlamanın yanı sıra, yalnızca istenen türde bir eklenti sağladığımız zaman, dosyaları diske taramasını sağlarız.

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

Aşağıda iki eklenti sağlayan bir modül için örnek bir dizin yapısı verilmiştir. Bir içerik türü ve bir erişim eklentisi.

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

İçerik türü eklentisi

Ctools sözlüğündeki bir içerik türü, örneğin Görünümler tarafından sağlandığı gibi daha sık "Bölme" olarak bilinir. Bu soruda: Bir görünüm tarafından oluşturulan NID'lerin listesini engellemenin ve bunları başka bir görünüm için filtre olarak kullanmanın bir yolu var mı? yazar, programlı olarak argümanları bir görünüme besleme konusunda sorular sorar. Bu kendi içinde çok zor olmasa da, takip eden soru hızlı bir şekilde “Sonuçları nasıl görüntülerim?” Olur.

Bir cevap, yeni bir "içerik türü" oluşturmak olacaktır.

Şimdi, asıl içerik türü eklentisi, yukarıdan görünümler sorusunu tekrar kullanarak, şöyle görünebilir:

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

Bu modül etkin durumdayken, Paneller'de, 'Özel kategorim' olan yeni bir kategori olmalı, burada birinde tek bir bölme bulunmalı ve böylece kodu yukarıdan yazmalı.

Erişim eklentisi

Aşağıdaki erişim eklentisi, kelimenin kökünden ölçülen bir terimin derinliğine bağlı olarak değişkenleri ve / veya panelleri doldurma yeteneği sağlayacaktır.

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

Bu harika! Ancak bunun için herhangi bir "resmi" belge var mı? (google çok fazla blog yazısı buluyor ancak "resmi" bir şey
bulamıyor

1
Ctools modülünün kendisinde, öncelikle bir şeyler aldığım yerlerden bir sürü örnek var. Birden fazla vesileyle resmi belge yazma görevini üstlenmeye çalıştım, ancak her zaman buharım bitiyor.
Letharion,

Bu öğreticiyi takip ettiğimde bir sorunum var ve bu, yapılandırma formunun yalnızca boş değil, düğmelerden yoksun olmasıdır.
beth

Her nasılsa, bu soruyu özledim / cevap verdim, ilk kez cevapla, harika yaz!
Clive

2
@ beth_odent_type_edit_form () 'daki sayı $ form referansa alınmamalıdır.
Justin,

1

CTools eklentileri, işlevlerini genişletmenin bir yolu olarak herhangi bir modülün parçası olabilecek küçük dosyalardır. Bileşenler (bölmeler) sağlamak, panellerinize ek stil seçenekleri eklemek vb. İçin kullanılabilirler.

Lütfen adım adım dokümantasyon için Panoları olmayan CTools Eklentileri sayfasını kontrol edin . Yani kısaca şöyle olur:

  1. CTools bağımlılıklarını .infodosyanızı aşağıdaki gibi eklemeniz gerekir :

    dependencies[] = ctools
    dependencies[] = panels
    
  2. CTools'a eklentinin nerede olduğunu söyle:

    <?php
    function MYMODULE_ctools_plugin_directory($module, $plugin) {
      if (($module == 'ctools') && ($plugin == 'content_types')) {
        return 'plugins/content_types';
      }
    }
    ?>
    
  3. Eklentiyi bir .incdosyaya uygulayın (varsayılan olarak $module.$api.inc). Örnek eklenti kodu:

    <?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;
    }
    ?>
    

Eklentilerin varsayılan konumu şöyle görünür:

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

Daha fazla örnek için, lütfen ctools_plugin_exampleCTools modülünün bir parçası olarak modülü kontrol edin veya modülü etkinleştirdikten sonra Drupal UI'da Yardım sayfasını ( CTools Eklenti Örnekleri ) kontrol edin .


Drupal 8'de, bu şimdi çekirdeğin bir parçasıdır (bkz: Drupal \ Component \ Plugin ) ve Nesne devralma, Nesne arayüzleri ve Tek dosya kapsülleme sağlar. Bakınız: Drupal 8 Now: Drupal 7'deki Nesne Yönelimli eklentiler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.