[Решено] Webform: PHP-код в скрытом поле (hidden)

Главные вкладки

Аватар пользователя Anton L. Safin Anton L. Safin 8 июня 2009 в 14:41

Очень удобный и полезный модуль WebForm имеет один недостаток - PHP код (например, для выборки из БД) можно поместить только в поле типа markup, которое не сохраняется в БД и не отправляется на e-mail. Потребовалось мне помещать результат выполнения кода PHP в поле hidden. Немножко хирургического вмешательства, и получился файл hidden_dynamic.inc.

Суть в следующем: после того, как вы положите этот файл в папочку components модуля webform, у вас появится еще один тип поля - hidden_dynamic. По сути, это тот же hidden, но с возможностью установки формата вводимого значения.

P.S. Для экспериментаторов - результат сравнения оригинального и измененного модулей

***** hidden.inc
);
$edit_fields['advanced']['mandatory'] = array(
***** HIDDEN_DYNAMIC.INC
);
$edit_fields['extra']['format'] = filter_form($currfield['extra']['format'], 0, array('extra', 'format'));
$edit_fields['advanced']['mandatory'] = array(
*****

***** hidden.inc
*/
function _webform_render_hidden($component) {
$form_item = array(
***** HIDDEN_DYNAMIC.INC
*/
function _webform_render_hidden_dynamic($component) {
if ($_POST['op'] == t('Preview')) {
$check_filter = TRUE;
}
else {
$check_filter = FALSE;
}

$form_item = array(
*****

***** hidden.inc
'#type' => 'hidden',
'#default_value' => _webform_filter_values($component['value']),
'#weight' => $component['weight'],
***** HIDDEN_DYNAMIC.INC
'#type' => 'hidden',
'#default_value' => _webform_filter_values(check_markup($component['value'], $component['extra']['format'], $check_filter)
NULL, NULL, FALSE),
'#weight' => $component['weight'],
*****

ВложениеРазмер
Иконка пакета hidden_dynamic.zip2.27 КБ

Комментарии

Аватар пользователя VladoMire VladoMire 9 августа 2009 в 1:03

Отлично, то что надо. Спасибо!

Как раз нужно было добавить скрытое поле, в котором значение подставляется динамически обработкой кода PHP, значений извлекаемых из куки. Все получилось!

Аватар пользователя WiseMan WiseMan 21 марта 2010 в 12:15

Тоже столкнулся с такой задачей, но решил найти способ как справиться "по белому", без патчей.

Выход такой:
1. создаете невидимое поле которое вам нужно для получения по e-mail или для записи в базу (пустое).
2. создаете поле типа markup где в своем коде делаете ручной вывод КОПИИ только что созданного поля из первого шагаю. Только оно будет заполненным из вашего кода, соответственно. Это должна быть буквально ручная копия поля.
3. смотрите чтобы 2-ое поле стояло ниже первого - это обязательно, тогда при отправке 2-ое поле как дубликат будет перекрывать 1-ое поле отправляя свои данные.

Пример. Здесь продублировано поле submitted[dannye][pole]:

<fieldset id="webform-component-dannye" class="webform-component-fieldset collapsible">
<legend class="collapse-processed">
<a href="#">Данные</a></legend>
<div class="fieldset-wrapper" style="display: block;">
<input type="hidden" value="" id="edit-submitted-dannye" name="submitted[dannye][pole]"/>

<div id="webform-component-for_pole" class="webform-component-markup"><b>Поле сформировано вручную:</b>
<input type="hidden" maxlength="128" name="submitted[dannye][pole]" size="60" value="ваши данные из php" id="submitted-sponsor"/></div></div>
</fieldset>

Аватар пользователя miritas miritas 20 марта 2010 в 23:46

Привет всем.

Я новичок в друпале и не совсем получается разобраться с указанным висманом методом. Не могли бы вы чуток поподробнее объяснить, что нуэно сделать для того чтобы из поля типа markup передать данные в поле hidden.

Спасибо.

Аватар пользователя Dizman Dizman 31 августа 2010 в 16:05

Закачал файл в папку components. Но новый тип не появился в списке. Версия webform 3.2
В чем может быть причина?

Аватар пользователя antonpamalis antonpamalis 12 апреля 2012 в 16:30

Файл hidden.inc для Webform 6.x-3.17 с выбором формата ввода для значения поля.

<?php

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

/**
 * Implements _webform_defaults_component().
 */

function _webform_defaults_hidden() {
  return array(
    'name' => '',
    'form_key' => NULL,
    'pid' => 0,
    'weight' => 0,
    'value' => '',
    'extra' => array(
      'private' => FALSE,
      'hidden_type' => 'value',
    ),
  );
}

/**
 * Implements _webform_theme_component().
 */

function _webform_theme_hidden() {
  return array(
    'webform_display_hidden' => array(
      'arguments' => array('element' => NULL),
      'file' => 'components/hidden.inc',
    ),
  );
}

/**
 * Implements _webform_edit_component().
 */

function _webform_edit_hidden($component) {
  $form = array();
  $form['value'] = array(
    '#type' => 'textarea',
    '#title' => t('Default value'),
    '#default_value' => $component['value'],
    '#description' => t('The default value of the field.') . theme('webform_token_help'),
    '#cols' => 60,
    '#rows' => 5,
    '#weight' => 0,
  );

  $form['display']['hidden_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'value' => t('Secure value (allows use of all tokens)'),
      'hidden' => t('Hidden element (less secure, changeable via JavaScript)'),
    ),
    '#title' => t('Hidden type'),
    '#description' => t('Both types of hidden fields are not shown to end-users. Using a <em>Secure value</em> allows the use of <em>all tokens</em>, even for anonymous users.'),
    '#default_value' => $component['extra']['hidden_type'],
    '#parents' => array('extra', 'hidden_type'),
  );
 
  $form['hidden']['format'] = filter_form($component['extra']['format'], 0, array('extra', 'format'));

  return $form;
}

/**
 * Implements _webform_render_component().
 */

function _webform_render_hidden($component, $value = NULL, $filter = TRUE) {
  $node = isset($component['nid']) ? node_load($component['nid']) : NULL;

  // Set filtering options for "value" types, which are not displayed to the
  // end user so they do not need to be sanitized.
  $strict = $component['extra']['hidden_type'] != 'value';
  $allow_anonymous = $component['extra']['hidden_type'] == 'value';
  //$default_value = $filter ? _webform_filter_values($component['value'], $node, NULL, NULL, $strict, $allow_anonymous) : $component['value'];
  $default_value = $filter ? _webform_filter_values(check_markup($component['value'], $component['extra']['format'], FALSE), $node, NULL, NULL, FALSE) : $component['value'];
  if (isset($value[0])) {
    $default_value = $value[0];
  }

  $element = array(
    '#type' => 'hidden',
    '#title' => $filter ? _webform_filter_xss($component['name']) : $component['name'],
    '#weight' => $component['weight'],
    '#translatable' => array('title'),
  );

  if ($component['extra']['hidden_type'] == 'value') {
    $element['#type'] = 'value';
    $element['#value'] = $default_value;
  }
  else {
    $element['#type'] = 'hidden';
    $element['#default_value'] = $default_value;
  }

  return $element;
}

/**
 * Implements _webform_display_component().
 */

function _webform_display_hidden($component, $value, $format = 'html') {
  $element = array(
    '#title' => $component['name'],
    '#value' => isset($value[0]) ? $value[0] : NULL,
    '#weight' => $component['weight'],
    '#format' => $component['extra']['format'],//$format,
    '#theme' => 'webform_display_hidden',
    '#theme_wrappers' => $format == 'html' ? array('webform_element', 'webform_element_wrapper') : array('webform_element_text'),
    '#post_render' => array('webform_element_wrapper'),
    '#translatable' => array('title'),
  );

  // TODO: This check is unusual. It shows hidden fields in e-mails but not
  // when viewing in the browser unless you're an administrator. This should be
  // a more logical check. See these related issues:
  // http://drupal.org/node/313639
  // http://drupal.org/node/781786
  if ($format == 'html') {
    $element['#access'] = user_access('edit all webform submissions') || user_access('access all webform results');
  }

  return $element;
}

function theme_webform_display_hidden($element) {
  return $element['#format'] == 'html' ? check_plain($element['#value']) : $element['#value'];
}

/**
 * Implements _webform_analysis_component().
 */

function _webform_analysis_hidden($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 (strlen(trim($data['data'])) > 0) {
      $nonblanks++;
      $wordcount += str_word_count(trim($data['data']));
    }
    $submissions++;
  }

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

/**
 * Implements _webform_csv_data_component().
 */

function _webform_table_hidden($component, $value) {
  return check_plain(empty($value[0]) ? '' : $value[0]);
}

/**
 * Implements _webform_csv_data_component().
 */

function _webform_csv_headers_hidden($component, $export_options) {
  $header = array();
  $header[0] = '';
  $header[1] = '';
  $header[2] = $component['name'];
  return $header;
}

/**
 * Implements _webform_csv_data_component().
 */

function _webform_csv_data_hidden($component, $export_options, $value) {
  return isset($value[0]) ? $value[0] : '';
}

Аватар пользователя TurboAndroid TurboAndroid 24 апреля 2012 в 22:37

а для Webform 7.x-3.17
есть подобное решение?
нашел функцию, check_markup($component['value'],$format_id,'',$cache = FALSE)
если например в hidden.inc (или создать клон hidden-static.inc) вместо $component['value'] поставить эту функцию, как правильно туда поставить пхп код чтобы он отработал корректно \

мне надо чтобы отработал такой код < ? php print current_path(); ? > и присвоился как значение поля и отправился по почте. ничего не хочу редактировать. просто и нагло статически определенное поле.

Аватар пользователя Antoniy Antoniy 18 декабря 2012 в 4:51

"semjuel" wrote:
есть d7 такое решение?

Это для 7.x-3.18

Но, наверное не правильно, потому что я тупо брал куски кода из markup.inc, которые отвечают за формат ввода и его рендеринг, и тупо вставлял в нужные места в hidden.inc, переименовывая #markup в #hidden.

Но это работает !)))) На мыло уходит результат вычислений, сделанных PHP-кодом в поле hidden.

Перед заменой сохранить оригинальный hidden.inc !

Вот код:

<?php

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


/**
 * Implements _webform_defaults_component().
 */

function _webform_defaults_hidden() {
  return array(
    'name' => '',
    'form_key' => NULL,
    'pid' => 0,
    'weight' => 0,
    'value' => '',
    'extra' => array(
      'private' => FALSE,
      'hidden_type' => 'value',
    ),
  );
}

/**
 * Implements _webform_theme_component().
 */

function _webform_theme_hidden() {
  return array(
    'webform_display_hidden' => array(
      'render element' => 'element',
      'file' => 'components/hidden.inc',
    ),
  );
}

/**
 * Implements _webform_edit_component().
 */

function _webform_edit_hidden($component) {
  $form = array();
  $form['value'] = array(
    '#type' => 'text_format',
    '#title' => t('Value'),
    '#default_value' => $component['value'],
    '#description' => t('Markup allows you to enter custom HTML or PHP logic into your form.') . theme('webform_token_help'),
    '#weight' => -1,
    '#format' => $component['extra']['format'],
    '#element_validate' => array('_webform_edit_markup_validate'),
  );

  $form['display']['hidden_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'value' => t('Secure value (allows use of all tokens)'),
      'hidden' => t('Hidden element (less secure, changeable via JavaScript)'),
    ),
    '#title' => t('Hidden type'),
    '#description' => t('Both types of hidden fields are not shown to end-users. Using a <em>Secure value</em> allows the use of <em>all tokens</em>, even for anonymous users.'),
    '#default_value' => $component['extra']['hidden_type'],
    '#parents' => array('extra', 'hidden_type'),
  );

  return $form;
}

/**
 * Implements _webform_render_component().
 */

function _webform_render_hidden($component, $value = NULL, $filter = TRUE) {
  $node = isset($component['nid']) ? node_load($component['nid']) : NULL;

  $element = array(
    '#type' => 'hidden',
    '#title' => $filter ? NULL : $component['name'],
    '#weight' => $component['weight'],
    '#hidden' => $filter ? _webform_filter_values(check_markup($component['value'], $component['extra']['format'], '', TRUE), $node, NULL, NULL, FALSE) : $component['value'],
    '#format' => $component['extra']['format'],
    '#theme_wrappers' => array('webform_element'),
    '#translatable' => array('title', 'hidden'),
  );

  // TODO: Remove when #hidden becomes available in D7.
  $element['#value'] = $element['#hidden'];

  return $element;
}

/**
 * Implements _webform_display_component().
 */

function _webform_display_hidden($component, $value, $format = 'html') {
  $element = array(
    '#title' => $component['name'],
    '#markup' => isset($value[0]) ? $value[0] : NULL,
    '#weight' => $component['weight'],
    '#format' => $format,
    '#theme' => 'webform_display_hidden',
    '#theme_wrappers' => $format == 'text' ? array('webform_element_text') : array('webform_element'),
    '#translatable' => array('title'),
  );

  return $element;
}

function theme_webform_display_hidden($variables) {
  $element = $variables['element'];

  return $element['#format'] == 'html' ? check_plain($element['#markup']) : $element['#markup'];
}

/**
 * Implements _webform_analysis_component().
 */

function _webform_analysis_hidden($component, $sids = array()) {
  $query = db_select('webform_submitted_data', 'wsd', array('fetch' => PDO::FETCH_ASSOC))
    ->fields('wsd', array('no', 'data'))
    ->condition('nid', $component['nid'])
    ->condition('cid', $component['cid']);

  if (count($sids)) {
    $query->condition('sid', $sids, 'IN');
  }

  $nonblanks = 0;
  $submissions = 0;
  $wordcount = 0;

  $result = $query->execute();
  foreach ($result as $data) {
    if (strlen(trim($data['data'])) > 0) {
      $nonblanks++;
      $wordcount += str_word_count(trim($data['data']));
    }
    $submissions++;
  }

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

/**
 * Implements _webform_csv_data_component().
 */

function _webform_table_hidden($component, $value) {
  return check_plain(empty($value[0]) ? '' : $value[0]);
}

/**
 * Implements _webform_csv_data_component().
 */

function _webform_csv_headers_hidden($component, $export_options) {
  $header = array();
  $header[0] = '';
  $header[1] = '';
  $header[2] = $component['name'];
  return $header;
}

/**
 * Implements _webform_csv_data_component().
 */

function _webform_csv_data_hidden($component, $export_options, $value) {
  return isset($value[0]) ? $value[0] : '';
}

P.S.: Была задача адаптировать собранный на коленке ajax калькулятор webform, который считает safe_key под D7

Аватар пользователя Divine Divine 17 марта 2013 в 20:47

"Kremenetskiy" wrote:
Это для 7.x-3.18

У меня webform 7.x-3.18

После замены кода в файле hidden.inc, становится невозможным добавить "Скрытое" поле. В браузере выскакивает ошибка "невозможно отобразить страницу"

Не проверите, может, в коде выше опечатка?

Аватар пользователя Antoniy Antoniy 26 июня 2013 в 1:28

"PVasili" wrote:
Решение в 6-ке не работает

Добавленный? Я заменял дефолтовый. Еще возможно от версии Вебформ зависит..

Аватар пользователя PVasili PVasili 28 июня 2013 в 1:49

"Kremenetskiy" wrote:
Я заменял дефолтовый. Еще возможно от версии Вебформ зависит..

Замена вообще не работает. Версии давно другие уже и видать что-то внутри сильно меняется. Хоть назад откатывайся.

Блин, один из самых нужных модулей и глюк на глюке, с каждой новой версией Sad

Аватар пользователя .poltergeist .poltergeist 21 февраля 2014 в 4:27

PVasili wrote:
"Kremenetskiy" wrote:
Я заменял дефолтовый. Еще возможно от версии Вебформ зависит..

Замена вообще не работает. Версии давно другие уже и видать что-то внутри сильно меняется. Хоть назад откатывайся.

Блин, один из самых нужных модулей и глюк на глюке, с каждой новой версией :(


6.x-3.19 полет нормальный

Аватар пользователя Antoniy Antoniy 28 июня 2013 в 10:48

"PVasili" wrote:
глюк на глюке, с каждой новой версией

Hidden Dynamic с Webform 7.x-3.18 работает, только что проверял.
У меня там PHP-кодик, который считает safe_key селектов и отправляет результат на email

Аватар пользователя Antoniy Antoniy 28 июня 2013 в 10:52

"PVasili" wrote:
глюк на глюке, с каждой новой версией

Хм, даже с webform 4-версии на семерке работало вроде, да и на шестерке (на шестерке не помню какая версия третьего вебформ была).

Аватар пользователя sanita sanita 9 августа 2014 в 18:29

Чудненькое решение! Спасибо!

По хорошему, надо добавить новый вид поля, но это решение гениально, как все простое))

Я только добавила одну проверочку, а то когда несколько скрытых полей, вылазили ошибки - не было понятно кто на ком стоит.

Это мой hidden.inc для 7х.-3.20 (и для 3.18, думаю, тоже подойдет):

<?php
 
/**
 * @file
 * Webform module hidden component.
 */

 
/**
 * Implements _webform_defaults_component().
 */

function _webform_defaults_hidden() {
  return array(
    'name' => '',
    'form_key' => NULL,
    'pid' => 0,
    'weight' => 0,
    'value' => '',
    'extra' => array(
      'private' => FALSE,
      'hidden_type' => 'value',
    ),
  );
}
 
/**
 * Implements _webform_theme_component().
 */

function _webform_theme_hidden() {
  return array(
    'webform_display_hidden' => array(
      'render element' => 'element',
      'file' => 'components/hidden.inc',
    ),
  );
}
 
/**
 * Implements _webform_edit_component().
 */

function _webform_edit_hidden($component) {
  $form = array();
  $form['value'] = array(
    '#type' => 'text_format',
    '#title' => t('Value'),
    '#default_value' => $component['value'],
    '#description' => t('Allows you to enter custom HTML or PHP logic into your form.') . theme('webform_token_help'),
    '#weight' => -1,
    '#format' => $component['extra']['format'],
    '#element_validate' => array('_webform_edit_hidden_validate'),
  );
 
  $form['display']['hidden_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'value' => t('Secure value (allows use of all tokens)'),
      'hidden' => t('Hidden element (less secure, changeable via JavaScript)'),
    ),
    '#title' => t('Hidden type'),
    '#description' => t('Both types of hidden fields are not shown to end-users. Using a <em>Secure value</em> allows the use of <em>all tokens</em>, even for anonymous users.'),
    '#default_value' => $component['extra']['hidden_type'],
    '#parents' => array('extra', 'hidden_type'),
  );
 
  return $form;
}
 
/**
 * Element validate handler; Set the text format value.
 */

function _webform_edit_hidden_validate($form, &$form_state) {
  if (is_array($form_state['values']['value'])) {
    $form_state['values']['extra']['format'] = $form_state['values']['value']['format'];
    $form_state['values']['value'] = $form_state['values']['value']['value'];
  }
}

/**
 * Implements _webform_render_component().
 */

function _webform_render_hidden($component, $value = NULL, $filter = TRUE) {
  $node = isset($component['nid']) ? node_load($component['nid']) : NULL;
 
  $element = array(
    '#type' => 'hidden',
    '#title' => $filter ? NULL : $component['name'],
    '#weight' => $component['weight'],
    '#hidden' => $filter ? _webform_filter_values(check_markup($component['value'], $component['extra']['format'], '', TRUE), $node, NULL, NULL, FALSE) : $component['value'],
    '#format' => $component['extra']['format'],
    '#theme_wrappers' => array('webform_element'),
    '#translatable' => array('title', 'hidden'),
  );
 
  // TODO: Remove when #hidden becomes available in D7.
  $element['#value'] = $element['#hidden'];
 
  return $element;
}
 
/**
 * Implements _webform_display_component().
 */

function _webform_display_hidden($component, $value, $format = 'html') {
  $element = array(
    '#title' => $component['name'],
    '#hidden' => isset($value[0]) ? $value[0] : NULL,
    '#weight' => $component['weight'],
    '#format' => $format,
    '#theme' => 'webform_display_hidden',
    '#theme_wrappers' => $format == 'text' ? array('webform_element_text') : array('webform_element'),
    '#translatable' => array('title'),
  );
 
  return $element;
}
 
function theme_webform_display_hidden($variables) {
  $element = $variables['element'];
 
  return $element['#format'] == 'html' ? check_plain($element['#hidden']) : $element['#hidden'];
}
 
/**
 * Implements _webform_analysis_component().
 */

function _webform_analysis_hidden($component, $sids = array()) {
  $query = db_select('webform_submitted_data', 'wsd', array('fetch' => PDO::FETCH_ASSOC))
    ->fields('wsd', array('no', 'data'))
    ->condition('nid', $component['nid'])
    ->condition('cid', $component['cid']);
 
  if (count($sids)) {
    $query->condition('sid', $sids, 'IN');
  }
 
  $nonblanks = 0;
  $submissions = 0;
  $wordcount = 0;
 
  $result = $query->execute();
  foreach ($result as $data) {
    if (strlen(trim($data['data'])) > 0) {
      $nonblanks++;
      $wordcount += str_word_count(trim($data['data']));
    }
    $submissions++;
  }
 
  $rows[0] = array( t('Empty'), ($submissions - $nonblanks));
  $rows[1] = array( t('Non-empty'), $nonblanks);
  $rows[2] = array( t('Average submission length in words (ex blanks)'),
                    ($nonblanks !=0 ? number_format($wordcount/$nonblanks, 2) : '0'));
  return $rows;
}
 
/**
 * Implements _webform_csv_data_component().
 */

function _webform_table_hidden($component, $value) {
  return check_plain(empty($value[0]) ? '' : $value[0]);
}
 
/**
 * Implements _webform_csv_data_component().
 */

function _webform_csv_headers_hidden($component, $export_options) {
  $header = array();
  $header[0] = '';
  $header[1] = '';
  $header[2] = $component['name'];
  return $header;
}
 
/**
 * Implements _webform_csv_data_component().
 */

function _webform_csv_data_hidden($component, $export_options, $value) {
  return isset($value[0]) ? $value[0] : '';
}

Простая проверка для тех, кто говорит, что не работает - запишите в hidden поле

<?php print 'Это работет!'; ?>

и поставьте формат PHP.