View source
<?php
function msnf_steps($content_type = '', $sorted = FALSE, $reset = FALSE) {
global $language;
static $steps, $steps_sorted;
if (!isset($steps) || $reset) {
if (($cached = cache_get('msnf_step_data:' . $language->language)) !== 0 && !empty($cached->data) && time() < $cached->expire) {
$data = $cached->data;
$steps = $data['steps'];
$steps_sorted = $data['steps_sorted'];
}
else {
$result = db_query('SELECT * FROM {msnf_step} ORDER BY weight, step_name');
$steps = array();
$steps_sorted = array();
while ($step = db_fetch_array($result)) {
$step['settings'] = unserialize($step['settings']);
$step['fields'] = array();
$step['groups'] = array();
_msnf_i18nstrings_step_translate($step);
$extra_fields = msnf_extra_fields($step['type_name']);
$step_fields = msnf_step_get_fields($step['type_name'], $step['step_name']);
foreach ($extra_fields as $field_name => $field) {
if (isset($step_fields[$field_name])) {
$field_strings = array(
'widget_label' => $field['label'],
'widget_description' => $field['description'],
);
drupal_alter('content_field_strings', $field_strings, $field['type_name'], $field_name);
$field['label'] = $field_strings['widget_label'];
$field['description'] = $field_strings['widget_description'];
$step['fields'][$field_name] = $field;
}
}
$steps[$step['type_name']][$step['step_name']] = $step;
$steps_sorted[$step['type_name']][] =& $steps[$step['type_name']][$step['step_name']];
}
if (module_exists('content')) {
$result = db_query('SELECT nfi.*, ms.step_name FROM {msnf_step} ms ' . 'INNER JOIN {msnf_step_fields} msf ON msf.type_name = ms.type_name AND msf.step_name = ms.step_name ' . 'INNER JOIN {' . content_instance_tablename() . '} nfi ON nfi.field_name = msf.field_name AND nfi.type_name = msf.type_name ' . 'WHERE nfi.widget_active = 1 ORDER BY nfi.weight');
while ($field = db_fetch_array($result)) {
$field_strings = array(
'widget_label' => $field['label'],
'widget_description' => $field['description'],
);
drupal_alter('content_field_strings', $field_strings, $field['type_name'], $field['field_name']);
$field['label'] = $field_strings['widget_label'];
$field['description'] = $field_strings['widget_description'];
$steps[$field['type_name']][$field['step_name']]['fields'][$field['field_name']] = $field;
}
}
if (module_exists('fieldgroup')) {
$result = db_query('SELECT cg.*, ms.step_name FROM {msnf_step} ms ' . 'INNER JOIN {msnf_step_fields} msf ON msf.type_name = ms.type_name AND msf.step_name = ms.step_name ' . 'INNER JOIN {' . fieldgroup_tablename() . '} cg ON cg.group_name = msf.field_name AND cg.type_name = msf.type_name ' . 'ORDER BY cg.weight');
while ($group = db_fetch_array($result)) {
$group_strings = array(
'widget_label' => $group['label'],
'widget_description' => $group['description'],
);
drupal_alter('content_field_strings', $group_strings, $group['type_name'], $group['group_name']);
$group['label'] = $group_strings['widget_label'];
$group['description'] = $group_strings['widget_description'];
$steps[$group['type_name']][$group['step_name']]['groups'][$group['group_name']] = $group;
}
}
cache_set('msnf_step_data:' . $language->language, array(
'steps' => $steps,
'steps_sorted' => $steps_sorted,
));
}
}
if (empty($content_type)) {
return $steps;
}
elseif (empty($steps) || empty($steps[$content_type])) {
return array();
}
return $sorted ? $steps_sorted[$content_type] : $steps[$content_type];
}
function msnf_step_types() {
$types = array(
'standard' => t('Standard step'),
);
$types = array_merge($types, module_invoke_all('msnf_step_types'));
return $types;
}
function _msnf_steps_label($content_type) {
$steps = msnf_steps($content_type);
$labels[''] = '<' . t('none') . '>';
foreach ($steps as $step_name => $step) {
$labels[$step_name] = t($step['label']);
}
return $labels;
}
function msnf_save_step($type_name, $step) {
$steps = msnf_steps($type_name);
foreach (module_implements('msnf_save_step') as $module) {
$function = $module . '_msnf_save_step';
$function($step);
}
_msnf_i18nstrings_step_update($step);
$result = SAVED_NEW;
if (!isset($steps[$step['step_name']])) {
db_query("INSERT INTO {msnf_step} (step_type, type_name, step_name, label, settings, weight)" . " VALUES ('%s', '%s', '%s', '%s', '%s', %d)", $step['step_type'], $type_name, $step['step_name'], $step['label'], serialize($step['settings']), $step['weight']);
cache_clear_all('msnf_step_data:', 'cache', TRUE);
}
else {
db_query("UPDATE {msnf_step} SET step_type = '%s', label = '%s', settings = '%s', weight = %d " . "WHERE type_name = '%s' AND step_name = '%s'", $step['step_type'], $step['label'], serialize($step['settings']), $step['weight'], $type_name, $step['step_name']);
cache_clear_all('msnf_step_data:', 'cache', TRUE);
$result = SAVED_UPDATED;
}
foreach (array(
'fields',
'groups',
) as $item_type) {
if (isset($step[$item_type])) {
foreach ($step[$item_type] as $item_name => $item) {
$values = array(
'type_name' => $type_name,
'step' => $step['step_name'],
"field_name" => $item_name,
'weight' => $item['weight'],
);
msnf_step_update_fields($values);
}
}
}
return $result;
}
function msnf_step_update_fields($form_values) {
if ($form_values['step']) {
if (strpos($form_values['step'], 'group_') > -1) {
if (module_exists('fieldgroup')) {
$form_values['group'] = $form_values['step'];
fieldgroup_update_fields($form_values);
db_query("DELETE FROM {msnf_step_fields} WHERE type_name = '%s' AND field_name = '%s'", $form_values['type_name'], $form_values['field_name']);
}
}
else {
$default = _msnf_field_get_step($form_values['type_name'], $form_values['field_name']);
if ($default) {
db_query("UPDATE {msnf_step_fields} SET step_name = '%s', weight = %d WHERE type_name = '%s' AND field_name = '%s'", $form_values['step'], $form_values['weight'], $form_values['type_name'], $form_values['field_name']);
}
else {
db_query("INSERT INTO {msnf_step_fields} (type_name, step_name, field_name, weight) VALUES ('%s', '%s', '%s', %d)", $form_values['type_name'], $form_values['step'], $form_values['field_name'], $form_values['weight']);
}
if (module_exists('fieldgroup')) {
db_query("DELETE FROM {" . fieldgroup_fields_tablename() . "} WHERE type_name = '%s' AND field_name = '%s'", $form_values['type_name'], $form_values['field_name']);
}
}
}
else {
if (module_exists('fieldgroup')) {
db_query("DELETE FROM {" . fieldgroup_fields_tablename() . "} WHERE type_name = '%s' AND field_name = '%s'", $form_values['type_name'], $form_values['field_name']);
}
db_query("DELETE FROM {msnf_step_fields} WHERE type_name = '%s' AND field_name = '%s'", $form_values['type_name'], $form_values['field_name']);
}
cache_clear_all('msnf_step_data:', 'cache', TRUE);
}
function msnf_step_delete($content_type, $step_name) {
db_query("DELETE FROM {msnf_step} WHERE type_name = '%s' AND step_name = '%s'", $content_type, $step_name);
db_query("DELETE FROM {msnf_step_fields} WHERE type_name = '%s' AND step_name = '%s'", $content_type, $step_name);
cache_clear_all('msnf_step_data:', 'cache', TRUE);
}
function msnf_step_default_settings($step_type) {
$settings = array(
'form' => array(
'style' => 'default',
'description' => '',
'button_label' => array(
'next' => t('Next'),
'previous' => t('Previous'),
),
),
);
$settings = array_merge($settings, module_invoke_all('msnf_step_default_settings', $step_type));
return $settings;
}
function msnf_step_validate_name($step, $type_name) {
$errors = array();
if (!$step['label']) {
$errors['label'][] = t('You need to provide a label.');
}
if (!$step['step_name']) {
$errors['step_name'][] = t('You need to provide a step name.');
}
else {
$step_name = $step['step_name'];
$step['step_type'] = !empty($step['step_type']) ? $step['step_type'] : 'standard';
if (substr($step_name, 0, 6) != 'step_') {
$step_name = 'step_' . $step_name;
}
if (!preg_match('!^step_[a-z0-9_]+$!', $step_name)) {
$errors['step_name'][] = t('The step name %step_name is invalid. The name must include only lowercase unaccentuated letters, numbers, and underscores.', array(
'%step_name' => $step_name,
));
}
if (strlen($step_name) > 32) {
$errors['step_name'][] = t('The step name %step_name is too long. The name is limited to 32 characters, including the \'step_\' prefix.', array(
'%step_name' => $step_name,
));
}
$steps = msnf_steps($type_name);
if (isset($steps[$step_name])) {
$errors['step_name'][] = t('The step name %step_name already exists.', array(
'%step_name' => $step_name,
));
}
if (empty($errors['step_name'])) {
$step['step_name'] = $step_name;
}
}
return array(
'step_name' => $step['step_name'],
'errors' => $errors,
);
}
function _msnf_field_get_step($content_type, $field_name) {
return db_result(db_query("SELECT step_name FROM {msnf_step_fields} WHERE type_name = '%s' AND field_name = '%s'", $content_type, $field_name));
}
function msnf_step_get_step($type_name, $step_name) {
return db_fetch_array(db_query("SELECT * FROM {msnf_step} WHERE type_name = '%s' AND step_name = '%s'", array(
$type_name,
$step_name,
)));
}
function msnf_step_get_fields($content_type, $step_name) {
$fields = array();
$result = db_query("SELECT * FROM {msnf_step_fields} WHERE type_name = '%s' AND step_name = '%s'", array(
$content_type,
$step_name,
));
while (($field = db_fetch_array($result)) !== FALSE) {
$fields[$field['field_name']] = $field;
}
return $fields;
}