Ir para o conteúdo

Component Node Reference Em Um Webform


Criado por Venicios Ribeiro, Out 21 2010 08:39

Não há respostas para este tópico
  • Por favor, faça o login para responder

#1 Venicios Ribeiro

Venicios Ribeiro
  • Venicios Ribeiro
  • Colaborador
  • 2 Revisões

Revisou 21 outubro 2010 - 08:39

Em alguns casos, precisamos de campos dinâmicos nos nossos webforms, pensando nisso, criei um component
que referencia nodes Chamado WebForm Node Reference.

Atualmente ele gera somente selects, estou trabalhando para que seja dinâmico e gere todos os tipos
possíveis de um input.

Siga os passos abaixo

INSTALAÇÃO
1 - Crie um arquivo node_reference.inc e insira dentro da pasta components do módulo webform.
2 - Cole o conteúdo abaixo dentro do arquivo.

file: node_reference.inc

<?php
// $Id: node_reference.inc,v 0.0.1 2010/10/15 01:27:27 veniciosribeiro Exp $

/**
 * @file
 *   Webform module node_reference component.
 */

/**
 * Create a default node_reference component.
 */

function _webform_defaults_node_reference() {
  return array(
    'name' => '',
    'form_key' => NULL,
    'pid' => 0,
    'weight' => 0,
    'value' => '',
    'mandatory' => 0,
    'email' => 0,
    'extra' => array(
      'width' => '',
      'maxlength' => '',
      'field_prefix' => '',
      'field_suffix' => '',
      'disabled' => 0,
      'description' => '',
      'attributes' => array(),
    ),
  );
}

function get_content_forms($op = false){

  $array = array();

  $node_type  = $op['node_type'];     // tipo de conteudo do select
  $cat_type  = $op['cat_type'];       // tipo de categoria do select
  $sql_type  = $op['sql_type'];       // tipo de sql do select

  switch($sql_type){

    // valor para gerenciamento dentro do web form
    // -> tipos de conteúdo
    case '1':
      $sql = db_query("SELECT title, nid FROM node WHERE type = '$node_type'");

      if($sql):
        while($val = db_fetch_object($sql)):
          //print_r($val);
          $array[$val->title] = $val->title;
        endwhile;
      endif;

    break;

    // valor para gerenciamento dentro do web form
    // -> categorias do select
    case '2':

      $qr = "SELECT DISTINCT field_tipo_select_value FROM content_field_tipo_select";

      $sql = db_query($qr);

      if($sql):
        while($val = db_fetch_object($sql)):
          $array[$val->field_tipo_select_value] = $val->field_tipo_select_value;
          #print_r($val);
        endwhile;
      endif;

    break;

  // valor para renderização final no html
  // -> options do select
  case '3':
    $qr = "SELECT * FROM node node
            left join content_type_seguimento_categoria cat
            on node.nid = cat.nid
            left join content_field_tipo_select tipo
            on cat.nid = tipo.nid
            where node.type = '$node_type'
            and tipo.field_tipo_select_value = '$cat_type'
          ";
    $sql = db_query($qr);

    if($sql):
      while($val = db_fetch_object($sql)):
        $array[$val->title] = $val->title;
      endwhile;
    endif;
    #print_r($qr.'<br><br>'.$sql.'<br><br>');
  break;


  case '':
    $array = node_get_types('names');
    #print_r($sql);
  break;

  }

  return $array;
}


/**
 * Create a set of form items to be displayed on the form for editing this
 * component. Use care naming the form items, as this correlates directly to the
 * database schema. The component "Name" and "Description" fields are added to
 * every component type and are not necessary to specify here (although they may
 * be overridden if desired).
 * @return
 *   An array of form items to be displayed on the edit component page.
 */
function _webform_edit_node_reference($currfield) {

  $edit_fields = array();

  $edit_fields['value'] = array(
    '#type' => 'select',
    '#title' => t('Escolha um tipo de conteúdo'),
    '#default_value' => $currfield['value'] ? $currfield['value'] : get_content_forms(array('sql_type' => '1')),
    '#options' => get_content_forms(array('sql_type' => '')),
    '#weight' => -2,
  );

  $edit_fields['extra']['tipo_select'] = array(
    '#type' => 'select',
    '#title' => t('Escolha uma categoria'),
    '#default_value' => $currfield['extra']['tipo_select'],
    '#options' => get_content_forms(array('node_type' => $currfield['value'] ? $currfield['value'] :
                                          array('Escolha um tipo de conteúdo'),
                                          'sql_type' => '2')),
    '#weight' => -1,
  );

  $edit_fields['extra']['disabled'] = array(
    '#type' => 'checkbox',
    '#title' => t('Disabled'),
    '#return_value' => 1,
    '#description' => t('Make this field non-editable. Useful for setting an unchangeable default value.'),
    '#weight' => 3,
    '#default_value' => $currfield['extra']['disabled'],
  );

  #print_r($edit_fields);

  return $edit_fields;
}

/**
 * Build a form item array containing all the properties of this component.
 * @param $component
 *   An array of information describing the component, directly correlating to
 *   the webform_component database schema.
 * @return
 *   An array of a form item to be displayed on the client-side webform.
 */
function _webform_render_node_reference($component) {
  $form_item = array(
    '#type'          => 'select',
    '#title'         => $component['name'],
    '#default_value' => _webform_filter_values($component['value']),
    '#required'      => $component['mandatory'],
    '#weight'        => $component['weight'],
    '#description'   => _webform_filter_descriptions($component['extra']['description']),
    '#prefix'        => '<div class="webform-component-'. $component['type'] .'" id="webform-component-'. $component['form_key'] .'">',
    '#suffix'        => '</div>',
  );

  if ($component['extra']['disabled']) {
    $form_item['#attributes']['readonly'] = 'readonly';
  }

  $form_item['#tipo_select'] = $component['extra']['tipo_select'];

  $form_item['#options'] = get_content_forms(array('node_type' => $form_item['#default_value'],
                                                   'cat_type' => $form_item['#tipo_select'],
                                                   'sql_type' => '3'
                                                   ));

  return $form_item;

}

/**
 * Display the result of a password submission. The output of this function
 * will be displayed under the "results" tab then "submissions".
 * @param $data
 *   An array of information containing the submission result, directly
 *   correlating to the webform_submitted_data database schema.
 * @param $component
 *   An array of information describing the component, directly correlating to
 *   the webform_component database schema.
 * @param $enabled
 *   If enabled, the value may be changed. Otherwise it will set to readonly.
 * @return
 *   Textual output formatted for human reading.
 */
function _webform_submission_display_node_reference($data, $component, $enabled = FALSE) {
  $form_item = _webform_render_node_reference($component);
  $form_item['#default_value'] = $data['value']['0'];
  if (!$enabled) {
    $form_item['#attributes']['readonly'] = 'readonly';
  }
  return $form_item;
}

/**
 * Format the output of emailed data for this component
 *
 * @param $data
 *   A string or array of the submitted data
 * @param $component
 *   An array of information describing the component,
 *   directly correlating to the webform_component database schema.
 *
 * @return string
 *   Textual output to be included in the email.
 */
function theme_webform_mail_node_reference($data, $component) {
  $value = $data == '' ? '' : ' '. $component['extra']['field_prefix'] . $data . $component['extra']['field_suffix'];
  return $component['name'] .':'. $value;
}

/**
 * Module specific instance of hook_theme().
 */
function _webform_theme_node_reference() {
  return array(
    'webform_mail_node_reference' => array(
      'arguments' => array('data' => NULL, 'component' => NULL),
    ),
  );
}

/**
 * Module specific instance of hook_help().
 */
function _webform_help_node_reference($section) {
  switch ($section) {
    case 'admin/settings/webform#node_reference':
      return t('Refenrence content type.');
  }
}

/**
 * Calculate and returns statistics about results for this component from all
 * submission to this webform. The output of this function will be displayed
 * under the "results" tab then "analysis".
 * @param $component
 *   An array of information describing the component, directly correlating to
 *   the webform_component database schema
 * @param $sids
 *   An optional array of submission IDs (sid). If supplied, the analysis will be limited
 *   to these sids.
 * @return
 *   An array of data rows, each containing a statistic for this component's
 *   submissions.
 */

function _webform_analysis_rows_node_reference($component, $sids = array()) {
  $placeholders = count($sids) ? array_fill(0, count($sids), "'%s'") : array();
  $sidfilter = count($sids) ? " AND sid in (".implode(",", $placeholders).")" : "";
  $query = 'SELECT data '.
    ' FROM {webform_submitted_data} '.
    ' WHERE nid = %d '.
    ' AND cid = %d '. $sidfilter;
  $nonblanks = 0;
  $submissions = 0;
  $wordcount = 0;

  $result = db_query($query, array_merge(array($component['nid'], $component['cid']), $sids));
  while ($data = db_fetch_array($result)) {
    if (drupal_strlen(trim($data['data'])) > 0) {
      $nonblanks++;
      $wordcount += str_word_count(trim($data['data']));
    }
    $submissions++;
  }

  $rows[0] = array(t('Left Blank'), ($submissions - $nonblanks));
  $rows[1] = array(t('User entered value'), $nonblanks);
  $rows[2] = array(t('Average submission length in words (ex blanks)'), ($nonblanks != 0 ? number_format($wordcount/$nonblanks, 2) : '0'));
  return $rows;
}

/**
 * Return the result of this component's submission for display in a table. The
 * output of this function will be displayed under the "results" tab then "table".
 * @param $data
 *   An array of information containing the submission result, directly
 *   correlating to the webform_submitted_data database schema
 * @return
 *   Textual output formatted for human reading.
 */
function _webform_table_data_node_reference($data) {
  return check_plain(empty($data['value']['0']) ? '' : $data['value']['0']);
}


/**
 * Return the header information for this component to be displayed in a comma
 * seperated value file. The output of this function will be displayed under the
 * "results" tab then "download".
 * @param $component
 *   An array of information describing the component, directly correlating to
 *   the webform_component database schema.
 * @return
 *   An array of data to be displayed in the first three rows of a CSV file, not
 *   including either prefixed or trailing commas.
 */
function _webform_csv_headers_node_reference($component) {
  $header = array();
  $header[0] = '';
  $header[1] = '';
  $header[2] = $component['name'];
  return $header;
}

/**
 * Return the result of a password submission. The output of this function will
 * be displayed under the "results" tab then "submissions".
 * @param $data
 *   An array of information containing the submission result, directly
 *   correlating to the webform_submitted_data database schema.
 * @return
 *   Textual output formatted for CSV, not including either prefixed or trailing
 *   commas.
 */
function _webform_csv_data_node_reference($data) {
  return !isset($data['value']['0']) ? '' : $data['value']['0'];
}


-------

TIPO DE CONTEÚDO BASE

No tipo de conteúdo abaixo nós temos os seguintes Campos:
1 - Título: aqui você insere o valor que ficará visível ao usuário no select.
2 - Tipo: aqui é para qual select você quer que essa opção seja disponibilizada.

content type: Seguimento/Categorias

$content['type']  = array (
  'name' => 'Seguimento/Categorias',
  'type' => 'seguimento_categoria',
  'description' => '',
  'title_label' => 'Título',
  'body_label' => '',
  'min_word_count' => '0',
  'help' => '',
  'node_options' =>
  array (
    'status' => true,
    'promote' => false,
    'sticky' => false,
    'revision' => false,
  ),
  'language_content_type' => '0',
  'old_type' => 'seguimento_categoria',
  'orig_type' => '',
  'module' => 'node',
  'custom' => '1',
  'modified' => '1',
  'locked' => '0',
  'comment' => '0',
  'comment_default_mode' => '4',
  'comment_default_order' => '1',
  'comment_default_per_page' => '50',
  'comment_controls' => '3',
  'comment_anonymous' => 0,
  'comment_subject_field' => '1',
  'comment_preview' => '1',
  'comment_form_location' => '0',
  'print_display' => 1,
  'print_display_comment' => 0,
  'print_display_urllist' => 1,
  'print_mail_display' => 1,
  'print_mail_display_comment' => 0,
  'print_mail_display_urllist' => 1,
);
$content['fields']  = array (
  0 =>
  array (
    'label' => 'Tipo',
    'field_name' => 'field_tipo_select',
    'type' => 'text',
    'widget_type' => 'optionwidgets_select',
    'change' => 'Alterar as informações básicas',
    'weight' => '-4',
    'description' => '',
    'default_value' =>
    array (
      0 =>
      array (
        'value' => '',
      ),
    ),
    'default_value_php' => '',
    'default_value_widget' => NULL,
    'group' => false,
    'required' => 0,
    'multiple' => '0',
    'text_processing' => '0',
    'max_length' => '',
    'allowed_values' => 'Torres
Seguimento
Tipo de Proprietário',
    'allowed_values_php' => '',
    'op' => 'Salvar as configurações do campo',
    'module' => 'text',
    'widget_module' => 'optionwidgets',
    'columns' =>
    array (
      'value' =>
      array (
        'type' => 'text',
        'size' => 'big',
        'not null' => false,
        'sortable' => true,
        'views' => true,
      ),
    ),
    'display_settings' =>
    array (
      'label' =>
      array (
        'format' => 'above',
        'exclude' => 0,
      ),
      'teaser' =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      'full' =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      4 =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      2 =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      3 =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      5 =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
      'token' =>
      array (
        'format' => 'default',
        'exclude' => 0,
      ),
    ),
  ),
);
$content['extra']  = array (
  'title' => '-5',
  'revision_information' => '-2',
  'comment_settings' => '1',
  'menu' => '-3',
  'path' => '0',
  'print' => '-1',
);

-------

UTILIZAÇÃO
1 - "Escolha um tipo de conteúdo:" Selecione o tipo de conteúdo a ser referenciado, depois de escolher, salve antes de continuar.
O value dos campos será igual ao título.
2 - "Escolha uma categoria:" Ao selecionar o tipo de conteúdo escolha a categoria do select.

OBS.: Uma categoria de select funciona da seguinte forma:
Se você tiver 3 campos que são selects no webform e quiser que eles sejam dinâmicos, você poderá selecioná-lo dinamicamente,
sem a necessidade de criar um tipo de conteúdo para cada select.
--
Venicios Ribeiro
interface, cms, front-end and back-end developer
-------------------------------------------




1 usuário(s) está(ão) lendo este código

1 membro(s), 0 visitante(s) e 0 membros anônimo(s)