* Type: function
* Name: dataform
* Date: 10.sep.2004
* Input:
* - name data form name- string
* - row data readDataRecord - associative array
* - dd dd definition - array of associative array
* - key (required primary key) - string
* - key1 (required primary key) - string
* - key2 (required primary key) - string
* - title - string
* - options data for select menus - associative array
* - edit allow editing of data - bool
* - cmd show dataform commands - int 0=none 1=save/cancel 2=change/cance 3=add/none
* - object name of the object to save - string
* - table table o image dir - string
* - preset id already set
* Purpose: Prints dataform from datasource
* according to the passed parameters
* @param array
* @param Smarty
* @return string
* @uses smarty_function_escape_special_chars()
*/
include dirname(__FILE__) . '/shared.lang.php';
define('F',
'
');
define('F2',
'');
define('FHEADERCMD', ''. ALM_OPT_LB .' | ');
define('FHEADERCELL', ' | '."\n");
define('FROW', '| _LABEL_ | _FCELL_ |
'."\n");
define('FCELLMODSTR', '');
define('FCELLMODREF', '');
define('FCMD',
' | |
');
define('FCMDMOD',
' | |
');
define('FCMDADD', ' |
');
define('PREV','< '. ALM_PREV_LB .' |');
define('NEXT','| '. ALM_NEXT_LB .' > ');
define('NPG',' _NPG_ ');
define('CURRENTPG','_NPG_');
define('PAGINATE','');
function smarty_function_dataform($params, &$smarty)
{
require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
require_once $smarty->_get_plugin_filepath('function','html_options');
require_once $smarty->_get_plugin_filepath('function','html_select_date');
require_once $smarty->_get_plugin_filepath('function','html_select_time');
require_once $smarty->_get_plugin_filepath('modifier','truncate');
require_once $smarty->_get_plugin_filepath('modifier','nl2br');
require_once $smarty->_get_plugin_filepath('modifier','wordwrap');
$row = array();
$dd = array();
$options = array();
$key = null;
$key1 = null;
$key2 = null;
$type = 0;
$name = 'dfform';
$object = null;
$edit = false;
$table = null;
$preset = null;
$extra = '';
foreach($params as $_key => $_val) {
switch($_key) {
case 'name':
case 'object':
case 'title':
case 'key':
case 'key1':
case 'key2':
case 'preset':
$$_key = (string)$_val;
break;
case 'options':
case 'row':
case 'dd':
$$_key = (array)$_val;
break;
case 'paginate':
case 'edit':
$$_key = (bool)$_val;
break;
default:
if(!is_array($_val)) {
$extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
} else {
$smarty->trigger_error("dataform: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
}
break;
}
}
if (!$object) $object = $name;
if (!$table) $table = $object;
if (empty($row) && empty($dd)) {
$smarty->trigger_error("dataform: either dd or row attribute must be present", E_USER_NOTICE);
return '';
}
if (empty($row) ) {
$type = 2; /* new record */
}
if ($edit) $type = 1;
if (empty($dd) ) {
$labels = null;
} else {
foreach ($dd as $_key => $_val)
$labels[$_key] = $_val['label'];
}
if ($preset) {
list($_field, $_text) = preg_split('/,/', $preset);
list($_fieldname, $_fieldvalue) = preg_split('/=/', $_field);
$_preset[$_fieldname] = $_fieldvalue;
$_preset_text[$_fieldname] = $_text;
}
$_html_rows = '';
$_html_result = '';
#
# Crea las filas del dataform en modo edicion
#
$_i = 0;
if ($type) {
foreach ((array)$dd as $_key=>$_val) {
if (!$dd[$_key]) {
continue;
}
if ($type == 2) $_val = '';
if ($type == 1) $_val = $row[$_val['name']];
# Tenemos permiso para mostrar este campo?
if (isset($dd[$_key]['extra']['role']) && $dd[$_key]['extra']['role'] !== $_SESSION['idalm_role']) {
$dd[$_key]['type'] = 'hidden';
}
if ($dd[$_key]['references'] && $dd[$_key]['type'] != 'hidden') {
if ($_preset[$_key]) {
$_selected = $_preset[$_key];
} else {
$_selected = $_val;
if (!isset($references[$dd[$_key]['references']])) $references[$dd[$_key]['references']] = 0;
$references[$dd[$_key]['references']]++;
$n = ($references[$dd[$_key]['references']] == 1) ? '' : $references[$dd[$_key]['references']];
$_val = $row[$dd[$_key]['references'] . $n];
}
$dd[$_key]['type'] = 'references';
}
$_start_year = "-10";
$_end_year = "+10";
switch ($dd[$_key]['type']) {
case 'file':
$_tmp = '';
if ($_val) {
$_file = HOMEDIR . "/_" . $table . "/" . $_val;
$_icon = 'doc.png';
$_p = explode('.', $_file);
$_pc = count($_p);
$ext = $_p[$_pc - 1];
if (preg_match('/doc|rtf|swx|osd/i',$ext)) $_icon = 'doc.png';
if (preg_match('/pdf/i',$ext)) $_icon = 'pdf.png';
if (preg_match('/xls/i',$ext)) $_icon = 'excel.png';
if (preg_match('/jpg|gif|png/i',$ext)) $_icon = 'image.png';
$_tmp = ' Conservar archivo actual (' . $_val . ')

';
}
$_tmp .= '';
break;
case 'image':
case 'img':
$_tmp = '';
$_icon = 'image.png';
$_tmp = '
';
if ($_val) $_tmp .= ' Conservar archivo actual (' . $_val . ')

';
$_tmp .= '';
break;
case 'boolean':
case 'bool':
if (preg_match("/:/", $dd[$_key]['extra']['label_bool'])) {
list($_si, $_no) = preg_split('/:/',$dd[$_key]['extra']['label_bool']);
$_tchecked = ($_val == 't') ? 'checked' : '';
$_fchecked = ($_val == 'f') ? 'checked' : '';
$_tmp = $_si . '' . $_no . '';
} else {
$_checked = ($_val == 't') ? 'checked' : '';
$_tmp = '';
}
break;
case 'datenull':
if (preg_match("/:/", $dd[$_key]['extra']))
list($_start_year, $_end_year) = preg_split('/:/',$dd[$_key]['extra']);
if (!isset($_val) || empty($_val)) $_val = '--';;
$_tmp = smarty_function_html_select_date(array('prefix'=>$_key . '_', 'time'=>$_val, 'start_year'=>$_start_year, 'end_year'=>$_end_year, 'day_empty'=>'--', 'month_empty'=>'--', 'year_empty'=>'--'), $smarty);
break;
case 'date':
if (preg_match("/:/", $dd[$_key]['extra']))
list($_start_year, $_end_year) = preg_split('/:/',$dd[$_key]['extra']);
$_tmp = smarty_function_html_select_date(array('prefix'=>$_key . '_', 'time'=>$_val, 'start_year'=>$_start_year, 'end_year'=>$_end_year), $smarty);
break;
case 'time':
$_tmp = smarty_function_html_select_time(array('prefix'=>$_key . '_', 'time'=>$_val, 'display_seconds'=>false), $smarty);
break;
case 'datetime':
if (preg_match("/:/", $dd[$_key]['extra']))
list($_start_year, $_end_year) = preg_split('/:/',$dd[$_key]['extra']);
$_tmp = smarty_function_html_select_date(array('prefix'=>$_key . '_', 'time'=>$_val, 'start_year'=>$_start_year, 'end_year'=>$_end_year), $smarty);
$_tmp .= smarty_function_html_select_time(array('prefix'=>$_key . '_', 'time'=>$_val, 'display_seconds'=>false), $smarty);
break;
case 'password':
$_tmp = '';
break;
case 'text':
$_tmp = ' '.ALM_MAX.'';
break;
case 'html':
$_tmp = ' '.ALM_MAX.'';
$_tmp .= "\n";
#$_tmp = ' maximizar';
break;
case 'varchar':
case 'char':
if ($dd[$_key]['extra']['list_values']) {
$_options = $dd[$_key]['extra']['list_values'];
$_tmp = smarty_function_html_options(array('options'=>$_options, 'selected'=>$_val), $smarty);
$_tmp = preg_replace("/_REFERENCE_/", $_tmp, FCELLMODREF);
$_tmp = preg_replace("/_FIELD_/", $_key, $_tmp);
} else {
$_val = preg_replace("/\"/", """, $_val);
$_tmp = preg_replace("/_VALUE_/", qdollar($_val), FCELLMODSTR);
$_tmp = preg_replace("/_FIELD_/", $_key, $_tmp);
$_tmp = preg_replace("/_SIZE_/", $dd[$_key]['size'], $_tmp);
}
break;
case 'numeric':
case 'int':
if ($dd[$_key]['extra']['list_values']) {
$_options = $dd[$_key]['extra']['list_values'];
$_tmp = smarty_function_html_options(array('options'=>$_options, 'selected'=>$_val), $smarty);
$_tmp = preg_replace("/_REFERENCE_/", $_tmp, FCELLMODREF);
$_tmp = preg_replace("/_FIELD_/", $_key, $_tmp);
} else {
$_tmp = preg_replace("/_VALUE_/", $_val, FCELLMODSTR);
$_tmp = preg_replace("/_FIELD_/", $_key, $_tmp);
$_tmp = preg_replace("/_SIZE_/", 10, $_tmp);
}
break;
case 'references':
if ($_preset[$_key]) {
$_tmp = '';
$_tmp .= $_selected;
} else {
$_options = $options[$_key];
$_tmp = smarty_function_html_options(array('options'=>$_options, 'selected'=>$_selected), $smarty);
$_tmp = preg_replace("/_REFERENCE_/", qdollar($_tmp), FCELLMODREF);
$_tmp = preg_replace("/_FIELD_/", $_key, $_tmp);
}
break;
case 'hidden':
case 'serial':
$hidden = true;
$_tmp = '';
break;
default:
$_tmp = $_val;
}
if (!empty($dd[$_key]['extra']['help'])) {
$_tmp .= ' ? ';
}
$_tmp = preg_replace("/_FCELL_/", qdollar($_tmp), FROW);
$_tmp = preg_replace("/_LABEL_/", $labels[$_key], $_tmp);
if (!$hidden) {
$_html_rows .= $_tmp;
}
$hidden = false;
}
} else {
#
# Crea las filas del dataform en modo lectura
#
foreach ((array)$row as $_key=>$_val) {
$_tmp = '';
if (!$dd[$_key]) {
continue;
}
# Tenemos permiso para mostrar este campo?
if (isset($dd[$_key]['extra']['role']) && $dd[$_key]['extra']['role'] !== $_SESSION['idalm_role']) {
$dd[$_key]['type'] = 'hidden';
}
if ($dd[$_key]['references']) {
if (!isset($references[$dd[$_key]['references']])) $references[$dd[$_key]['references']] = 0;
$references[$dd[$_key]['references']]++;
$n = ($references[$dd[$_key]['references']] == 1) ? '' : $references[$dd[$_key]['references']];
$_val = $row[$dd[$_key]['references'] . $n];
}
switch ($dd[$_key]['type']) {
case 'char':
if ($dd[$_key]['extra']['list_values']) {
$_options = $dd[$_key]['extra']['list_values'];
$_tmp = $_options[$_val];
} else {
$_tmp = smarty_modifier_truncate($_val, 50);
}
break;
case 'bool':
case 'boolean':
$_si = ALM_YES;
$_no = ALM_NO;
if ($dd[$_key]['extra']['label_bool']) {
list($_si, $_no) = preg_split('/:/',$dd[$_key]['extra']['label_bool']);
}
$_tmp = ($_val == 't') ? $_si : $_no;
break;
case 'file':
if ($_val) {
$_icon = $_val;
$_file = HOMEDIR . "/_" . $table . "/" . $_val;
$_icon = 'doc.png';
$_p = explode('.', $_file);
$_pc = count($_p);
if ($_p[$_pc - 1] == 'doc') $_icon = 'doc.png';
if ($_p[$_pc - 1] == 'pdf') $_icon = 'pdf.png';
if ($_p[$_pc - 1] == 'xls') $_icon = 'xls.png';
$_tmp = '
';
} else {
$_tmp = '--';
}
break;
case 'image':
if ($_val) {
if (THUMBNAILING)
$_tmp = '
';
else
$_tmp = '
';
} else {
$_tmp = '--';
}
break;
case 'hidden':
case 'serial':
$hidden = true;
$_tmp = '';
break;
default:
if($dd[$_key]['extra']['list_values']) {
$_options = $dd[$_key]['extra']['list_values'];
$_val = $_options[trim($_val)];
}
if($_preset[$_key]) {
$_tmp = '';
if(!empty($_pre)) $_pre .= ',';
$_pre .= $_key .'='.$_preset[$_key];
} else {
$_tmp = smarty_modifier_wordwrap($_val);
$_tmp = smarty_modifier_nl2br($_tmp);
}
}
$_tmp = preg_replace('/_FCELL_/', qdollar($_tmp), FROW);
$_tmp = preg_replace('/_LABEL_/', $labels[$_key], $_tmp);
if (!$hidden) $_html_rows .= $_tmp;
$hidden = false;
}
$_html_cmd = preg_replace("/{_ID_}/", $row[$key], FCMD);
}
if ($type == 2) { $_html_cmd = FCMDADD; $action = "add"; }
if ($type == 1) { $_html_cmd = FCMDMOD; $action = "save"; }
if ($type == 0) { $_html_cmd = FCMD; $action = "edit"; }
//if ($cmd)
$_html_rows .= $_html_cmd;
$_i++;
$_tmp = FROW;
if (!($_i % 2)) {
$_tmp = preg_replace("/class=\"dgrow\"/", "class=\"dgrow2\"", $_tmp);
}
#$_html_rows .= preg_replace("/_FCELL_/", $_html_row, $_tmp);
if ($paginate && $maxrows && ($_i >= ($maxrows * $pg)) ) {
$_need_paginate = true;
break;
}
$_f = ($key2) ? F2 : F;
$_f = preg_replace('/_PRESET_/',$_pre,$_f);
$_html_result = preg_replace("/_FHEADER_/", $_html_labels, $_f);
if ($cmd)
$_html_result = preg_replace("/_FHEADERCMD_/", FHEADERCMD, $_html_result);
$_html_result = preg_replace("/_FHEADERCMD_/", '', $_html_result);
$_html_result = preg_replace("/_TITLE_/", $title, $_html_result);
$_html_result = preg_replace("/_FROW_/", qdollar($_html_rows), $_html_result);
#$_npgs = ceil(count($rows) / $maxrows);
$_paginate = '';
if ($paginate && $_npgs > 1) {
if ($pg != 1)
$_paginate = PREV;
for ($_j=1; $_j<=$_npgs; $_j++) {
$npg = ($_j == $pg) ? CURRENTPG : NPG;
$_paginate .= preg_replace("/_NPG_/", $_j, $npg);
}
if ($pg != $_npgs )
$_paginate .= NEXT;
}
$_html_result = preg_replace("/_PAGINATE_/", $_paginate, $_html_result);
if ($_SERVER['PHP_SELF'] == '/almidon/404.php')
$_html_result = preg_replace("/_SELF_/", SELF, $_html_result);
else
$_html_result = preg_replace("/_SELF_/", $_SERVER['PHP_SELF'], $_html_result);
$_referer = preg_replace("/\//", "\/", $_SERVER['PHP_SELF']);
if (preg_match("/$_referer/", $_SERVER['HTTP_REFERER']))
$_referer = $_SERVER['PHP_SELF'];
else
$_referer = $_SERVER['HTTP_REFERER'];
$_html_result = preg_replace("/_REFERER_/", $_referer, $_html_result);
$_html_result = preg_replace("/_KEY_/", $key, $_html_result);
$_html_result = preg_replace("/_KEY1_/", $key1, $_html_result);
$_html_result = preg_replace("/_KEY2_/", $key2, $_html_result);
$_html_result = preg_replace("/{_ID_}/", $_REQUEST[$key], $_html_result);
$_html_result = preg_replace("/_ID1_/", $_REQUEST[$key1], $_html_result);
$_html_result = preg_replace("/_ID2_/", $_REQUEST[$key2], $_html_result);
$_html_result = preg_replace("/_SORT_/", $_REQUEST['sort'], $_html_result);
$_html_result = preg_replace("/_PG_/", $_REQUEST[$object . 'pg'], $_html_result);
$_html_result = preg_replace("/_PGPREV_/", ($pg-1), $_html_result);
$_html_result = preg_replace("/_PGNEXT_/", ($pg+1), $_html_result);
$_html_result = preg_replace("/_FORM_/", $name, $_html_result);
$_html_result = preg_replace("/_OBJECT_/", $object, $_html_result);
$_html_result = preg_replace("/_ACTION_/", $action, $_html_result);
if ($type == 0) $_html_result = preg_replace('/old_/', '', $_html_result);
if(strpos($_html_rows,'value="Agregar"') != '') {
$_SESSION['accion'] = 'add';
} elseif(isset($_SESSION['accion'])) {
unset($_SESSION['accion']);
}
return $_html_result;
}