Source for file sottomaschera.php
Documentation is available at sottomaschera.php
* File che genera le sottomaschere.
* Vengono lette le opzioni dai registri di regole e viene generato l'html e il javascript necessario
* @author Mario Marcello Verona <marcelloverona@gmail.com>
* @copyright 2007 Mario Marcello Verona
* @license http://www.gnu.org/licenses/gpl.html GNU Public License
require_once("./inc/conn.php");
require_once("./inc/layouts.php");
require_once("./inc/func.comuni.php");
require_once("./inc/func.frontend.php");
require_once("./inc/func.campi_submask.php");
require_once("./inc/func.hash_iframe.php");
include("./inc/func.var_frontend.php");
###############################################################
# INFO GENERALI SOTTOMASCHERA
FROM ". $db1['frontend']. ".registro_submask
WHERE id_submask=". intval($_GET['id_submask']);
$SM_INSERT = ($info_sub['sub_insert']== '1') ? true: false;
$SM_UPDATE = ($info_sub['sub_update']== '1') ? true: false;
$SM_DELETE = ($info_sub['sub_delete']== '1') ? true: false;
$MAX_RECORD_SUB = ($info_sub['max_records']> 0) ? $info_sub['max_records']: 5;
$SM_TIPO_VISTA = $info_sub['tipo_vista'];
###############################################################
# INFO COLONNE SOTTOMASCHERA
$sql_info_campi_sub = "SELECT *
FROM ". $db1['frontend']. ".registro_submask_col
WHERE id_submask=". intval($_GET['id_submask']). "
ORDER BY ordinal_position
$q_info_campi_sub = vmsql_query($sql_info_campi_sub,$link);
for($i= 0;$i< count($info_campi_sub);$i++ ){
if($info_campi_sub[$i]['in_tipo']== 'select_from'){
$CAMPI_TENDINE[]= $info_campi_sub[$i]['column_name'];
// NOME della sottomaschera
$nome_sub = (trim($info_sub['nome_frontend'])!= "") ? $info_sub['nome_frontend'] : $info_sub['nome_tabella'];
###############################################################
# CHIAVI PRIMARIE SOTTOMASCHERA
# si assume che ci siano due chiavi primarie,
# una riferita al valore della tabella esterna qui considerato come indipendente,
# l'altra (chiave) riferita al valore della tabella esterna dipendente
# Serve per preservare in caso di modifica il riferimento al record.
/*$PKS = prendi_all_PK_submask_oid(intval($_GET['id_submask']));
$array_PK_dipendente = $PKS;
/*// cerca la chiave riferita alla tabella indipendente
$K_PK_tab_indipendente = array_search($info_sub['campo_pk_parent'],$array_PK_dipendente);
$PK_tab_indipendente=$array_PK_dipendente[$K_PK_tab_indipendente];*/
// Cerca in tutti i campi quello definito come "parent_ref"
for($k= 0;$k< count($info_campi_sub);$k++ ){
if($info_campi_sub[$k]['in_tipo']== 'parent_ref'){
$CAMPO_PARENT_REF= $info_campi_sub[$k]['column_name'];
if($CAMPO_PARENT_REF== ''){
openErrorGenerico('Errore nelle impostazioni della sottomaschera',false,'Non sembra essere definito il riferimento alla chiave esterna. Verificare le impostazioni.');
$PK_tab_indipendente= $CAMPO_PARENT_REF;
// togli la variabile indipendente
unset($array_PK_dipendente[$K_PK_tab_indipendente]);
// resta (su 2 assunte) la PK dipendente
list($PK_tab_dipendente)=array_values($array_PK_dipendente);*/
for($i= 0;$i< count($info_campi_sub);$i++ ){
if($info_campi_sub[$i]['in_visibile']== '1' && $info_campi_sub[$i]['column_name']!= $info_sub['campo_fk_sub']){
$campi[] = $info_campi_sub[$i]['column_name'];
$info_campo_mostrare[] = $info_campi_sub[$i];
elseif($info_campi_sub[$i]['in_tipo']== 'parent_ref'){
$CAMPO_REF_PARENT = $info_campi_sub[$i]['in_default'];
###############################################################
if(isset ($CAMPO_REF_PARENT)){
$sql_ETICHETTA = "SELECT parent.$CAMPO_REF_PARENT
FROM ". $info_sub['nome_tabella']. " AS child
RIGHT JOIN ". oid2name($info_sub['id_table']). " AS parent ON parent.". $info_sub['campo_pk_parent']. "=child.". $info_sub['campo_fk_sub']. "
else $ETICHETTA = "<em>Dato non disponiblile</em>";
###############################################################
# SQL PER PRENDERE I DATI
$n_campi = count($campi);
$sql_dati = "SELECT ". implode(",",$campi). " FROM ". $info_sub['nome_tabella']. "
ORDER BY ". $info_sub['orderby_sub']. " ". $info_sub['orderby_sub_sort'];
$sql_chiavi = "SELECT ".$PK_tab_dipendente." FROM ".$info_sub['nome_tabella']."
WHERE ".$info_sub['campo_fk_sub']."='".intval($_GET['pk'])."'
ORDER BY ".$info_sub['orderby_sub']." ".$info_sub['orderby_sub_sort'];*/
if(vmsql_try($sql_chiavi,$link)){
// PRENDO I VALORI DELLE CHIAVI primaerie dipendenti
$q_chiavi = vmsql_query($sql_chiavi,$link);
$n_chiavi = vmsql_num_rows($q_chiavi);
list($dati_chiavi_sub) = vmsql_fetch_row_all($q_chiavi,true);
// PRENDO TUTTI i dati per tutti i record per metterli in un campo nascosto, magari serializzati?
$sql_all_data = "SELECT * FROM ". $info_sub['nome_tabella']. "
WHERE ". $info_sub['campo_fk_sub']. "='". intval($_GET['pk']). "'
ORDER BY ". $info_sub['orderby_sub']. " ". $info_sub['orderby_sub_sort'];
openErrorGenerico("Errore nella impostazione della sottomaschera: Numero di campi attesi per la chiave primaria incongruente (attesi 2 campi)",false);
#############################################################################################################
$files= array("js/scriptaculous/lib/prototype.js",'js/sottomaschera.js');
// SE ci sono campi data , datetime o timestamp, prendi il calendario
$files[]= "js/jscalendar/calendar.js";
$files[]= "js/jscalendar/lang/calendar-it.js";
$files[]= "js/jscalendar/calendar-setup.js";
$files[]= "sty/jscalendar/calendar-win2k-cold-1.css";
$INIZIO_LAYOUT = openLayout1("Sottomaschera ". $nome_sub,$files,'sottomaschera');
echo str_replace("<body>","<body onload=\"self.focus();\">",$INIZIO_LAYOUT); unset ($INIZIO_LAYOUT);
<script type=\"text/javascript\">
var max_righe=$MAX_RECORD_SUB;
var modifiche_attive=false;
var eliminazione_attiva=false;
var oid_parent={$_GET['oid_parent']};
var id_submask={$_GET['id_submask']};
var pk_parent='{$_GET['pk']}';
var campo_pk_indipendente = '$PK_tab_indipendente';
". //var campo_pk_dipendente = '$PK_tab_dipendente';
"var nome_tabella='". $info_sub['nome_tabella']. "';
var righe_mod= new Array();
var tipo_vista= '$SM_TIPO_VISTA';
var campi_iframe= new Array('". implode("','",$CAMPI_TENDINE). "');
for($i= 0;$i< $MAX_RECORD_SUB;$i++ ){
$js_manuale.= "var a$i = new Array(); ";
$sotto_array_js.= "a$i,";
$sotto_array_js= substr($sotto_array_js,0,- 1);
var campi_mod= new Array();
var valori_del = new Array();
echo "<h1><span class=\"var\">". ucfirst($nome_sub). "</span> - sottomaschera di <span class=\"var\">". oid2name($info_sub['id_table']). "</span></h1>";
<span id=\"risposta\"></span>
if($SM_INSERT || $SM_UPDATE){
echo "<div id=\"pulsanti-azioni\">\n";
echo "<input title=\"Nuovo record\" type=\"button\" id=\"p_insert\" name=\"insert\" value=\" Nuovo record \" onclick=\"nuovo_record();\" accesskey=\"n\" />\n";
else echo "<input type=\"hidden\" id=\"p_insert\" />\n";
if($SM_INSERT || $SM_UPDATE){
echo "<input disabled=\"disabled\" title=\"Annulla\" type=\"button\" id=\"p_annulla\" name=\"annulla\" value=\" Annulla \" onclick=\"annulla();\" accesskey=\"a\" />\n";
else echo "<input type=\"hidden\" id=\"p_annulla\" />\n";
if($SM_INSERT || $SM_UPDATE){
echo "<input disabled=\"disabled\" title=\"Salva i record\" type=\"button\" id=\"p_save\" name=\"save\" value=\" Salva \" onclick=\"salva(nome_tabella);\" accesskey=\"s\" />\n";
else echo "<input type=\"hidden\" id=\"p_save\" />\n";
//echo " <input type=\"button\" title=\"DEBUG Var\" name=\"DEBUG Var\" value=\" DEBUG Var \" onclick=\"debug_var();\" />\n";
echo " <input type=\"button\" title=\"Chiudi la finestra\" name=\"Chiudi\" value=\" Chiudi \" onclick=\"if(modifiche_attive || eliminazione_attiva){if(confirm('Ci sono operazioni in sospeso, si vuole comunque chiudere la finestra senza salvare le modifiche?')){self.close();}}else{self.close();}\" />\n";
if($SM_INSERT || $SM_UPDATE){
echo "<div class=\"etichetta-record\">". utf8_encode($ETICHETTA). " <span style=\"color:#000\">(<span id=\"numero_record\">$n_dati</span> record)</span></div>\n";
######################################################################################################################
if($SM_TIPO_VISTA== 'tabella'){
// crea le celle di tabella
$TRIGGER_ASSEGNAZIONE= "";
// for($i=0;$i<$MAX_RECORD_SUB;$i++){
for($i= 0;$i< $n_dati;$i++ ){
$RIGA.= "<tr id=\"riga_$i\" style=\"display:none;\">";
for($j= 0;$j< $n_campi;$j++ ){
if($SM_UPDATE && $SM_DELETE && $j== 0) $TR_TH.= "<th class=\"nocolor-r\"> </th>";
elseif($SM_UPDATE && $j== 0) $TR_TH.= "<th class=\"nocolor\"> </th>";
if($SM_DELETE && $j== 0) $TR_TH.= "<th class=\"nocolor\"> </th>";
$TR_TH.= "<th>". $campi[$j]. "</th>";
// $chiave_record = (isset($dati_chiavi_sub[$i])) ? $dati_chiavi_sub[$i] : "n".$i;
$chiave_record = ($n_all_dati>= $i) ? $i : "n". $i;
if($SM_UPDATE && $j== 0) $RIGA.= "<th class=\"sm-update\"> <a href=\"javascript:;\" onclick=\"modifica($i);\">modifica</a> </th>";
if($SM_DELETE && $j== 0) $RIGA.= "<th class=\"sm-delete\"> <a href=\"javascript:;\" onclick=\"elimina($i);\">elimina</a> </th>";
$dato_ins = (isset ($dati_sub[$i][$j])) ? $dati_sub[$i][$j] : "";
// TRIGGER ASSEGNAZIONE VALORI
$RIGA.= "<td style=\"display:none;\"><div id=\"value_riga_$i\">". $dati_serializzati. "</div></td>";
$RIGA.= "\t\t<tr id=\"riga_x\" style=\"display:none;\">\n";
for($j= 0;$j< $n_campi;$j++ ){
$TR_TH.= "\t\t\t<th>". $campi[$j]. "</th>\n";
$dato_ins = (isset ($dati_sub[$i][$j])) ? $dati_sub[$i][$j] : "";
$TABLE = "<table id=\"table-submask\" border=\"0\" summary=\"dati sottomaschera\">\n<tbody>\n";
$TABLE.= "</tbody></table>\n\n";
######################################################################################################################
// for($i=0;$i<$MAX_RECORD_SUB;$i++){
for($i= 0;$i< $n_dati;$i++ ){
$DIVR.= "<div id=\"riga_$i\" style=\"display:none;\" class=\"entry-record\">";
$chiave_record = ($n_all_dati>= $i) ? $i : "n". $i;
if($SM_UPDATE) $controlli.= "<a href=\"javascript:;\" onclick=\"modifica($i);\">modifica</a>";
if($SM_UPDATE && $SM_DELETE) $controlli.= " - ";
if($SM_DELETE) $controlli.= "<a href=\"javascript:;\" onclick=\"elimina($i);\">elimina</a>";
if($SM_UPDATE || $SM_DELETE) $DIVR.= "<span class=\"controlli\">$controlli</span>\n";
$DIVR.= "<table summary=\"tabella di formattazione record\" border=\"0\" class=\"tab-format\">";
for($j= 0;$j< $n_campi;$j++ ){
if($SM_UPDATE && $SM_DELETE && $j==0) $TR_TH.="<th class=\"nocolor-r\"> </th>";
elseif($SM_UPDATE && $j==0) $TR_TH.="<th class=\"nocolor\"> </th>";
if($SM_DELETE && $j==0) $TR_TH.="<th class=\"nocolor\"> </th>";
$TR_TH.="<th>".$campi[$j]."</th>";
$dato_ins = (isset ($dati_sub[$i][$j])) ? $dati_sub[$i][$j] : "";
$DIVR.= ($j== 0) ? "<td class=\"numerone\" rowspan=\"$n_campi\">". ($i+ 1) . "</td>" : "";
$DIVR.= ($info_campo_mostrare[$j]['in_tipo']== 'hidden') ? "" : "<td class=\"label\">". $campi[$j]. "</td>";
// TRIGGER ASSEGNAZIONE VALORI
$DIVR.= "<div id=\"value_riga_$i\" style=\"display:none;\">". $dati_serializzati. "</div>";
$DIVR.= "\t\t<div id=\"riga_x\" style=\"display:none;\" class=\"entry-record\">\n";
$DIVR.= "<table summary=\"tabella di formattazione record\" border=\"0\">";
for($j= 0;$j< $n_campi;$j++ ){
// $TR_TH.="\t\t\t<th>".$campi[$j]."</th>\n";
$dato_ins = (isset ($dati_sub[$i][$j])) ? $dati_sub[$i][$j] : "";
$DIVR.= ($j== 0) ? "<td class=\"numerone\" rowspan=\"$n_campi\">0</td>" : "";
$DIVR.= "<td class=\"label\">". $campi[$j]. "</td>". tipo_campo_submask($chiave_record,$dato_ins,$info_campo_mostrare[$j]);
echo "<script type=\"text/javascript\">
function trigger_assegnazione(){
echo ($SM_TIPO_VISTA== 'tabella') ? $TABLE: $DIVR;
echo "<script type=\"text/javascript\">
for(j=0;j<$MAX_RECORD_SUB;j++){
id_riga_considerata = 'riga_'+j;
document.getElementById(id_riga_considerata).style.display='';
|