zoukankan      html  css  js  c++  java
  • SugarCRM 主表EditView.php 中添加子表明细Items 并一同保存

     1.在主表模块中创建子表字段标签
        /wwws/language/zh_cn.lang.php
        'LBL_ConsignmentItem'=>'提运单明细',
        'LBL_ADDROW'=>'新增明细',
        'LBL_REMOVEROW'=>'删除',
        'LBL_SequenceNumeric' => '托运货物序号',
        'LBL_MarksNumbers' => '唛头',
        'LBL_CargoDescription' => '货物简要描述',
        'LBL_Content' => '备注',

        2.创建Item模板
        /wwws/EditView.html

        </table>//在此语句后添写下面代码

        <!-- BEGIN: open_source -->
        <!-- END: open_source -->
        <!-- END: main -->

        <!-- BEGIN: Item -->
          <div id="productSection">
            <INPUT class="button" id="add_row" onclick="addRow('prod', lableMap);" type="button" value="{MOD.LBL_ADDROW}" name="add_row">
            <table id="prod" width="100%" border="0" cellspacing="0" cellpadding="0" class="tabForm">
            <THEAD>
            <tr>
             <TD class="dataLabel" width="20%" ><span>{MOD.LBL_SequenceNumeric}</span></TD>
             <TD class="dataLabel" width="25%" ><span>{MOD.LBL_MarksNumbers}</span></TD>
             <TD class="dataLabel" width="20%" ><span>{MOD.LBL_CargoDescription}</span></TD>
             <TD class="dataLabel" width="35%" ><span>{MOD.LBL_Content}</span></TD>
            </tr>
            </THEAD>
            <!-- BEGIN: items  -->
            <TR>
             <TD class="dataField" ><input type=text size=15  value="{ITEM_SequenceNumeric}" name="SequenceNumeric_  {ITEM_IDX}" id="SequenceNumeric_{ITEM_IDX}"></TD>
             <TD class="dataField" ><input type=text size=25  value="{ITEM_MarksNumbers}" name="MarksNumbers_  {ITEM_IDX}" id="MarksNumbers_{ITEM_IDX}"></TD>
             <TD class="dataField" ><input type=text size=20  value="{ITEM_CargoDescription}" name="CargoDescription_  {ITEM_IDX}" id="CargoDescription_{ITEM_IDX}"></TD>
             <TD class="dataField" ><input type=text size=35  value="{ITEM_Content}" name="Content_  {ITEM_IDX}" id="Content_{ITEM_IDX}"></TD>

             <TD class="dataField" ><INPUT class="button" id="remove" onclick="delRow('prod',{ITEM_IDX})" type="button"   value="{MOD.LBL_REMOVEROW}" name="remove">
             <input type=hidden id=rowIndexId_{ITEM_IDX} name=rowIndexId_{ITEM_IDX} value=0>
             <INPUT type="hidden" name="item_id_{ITEM_IDX}" id="item_id_{ITEM_IDX}"   value="{ITEM_ID}"/> </TD>
            </TR>
            <!-- END: items -->
            </table>
        </form>
        {JAVASCRIPT}
        <!-- END: Item -->
     
        3.向模板赋值
        /wwws/EditView.php
        //Add Custom Fields
        require_once('modules/DynamicFields/templates/Files/EditView.php');//在此语句后添写下面代码

        //contract items
        require_once('modules/Contracts/ContractItem.php');
        $itemObj = new ContractItem();
        $items = $itemObj->getAllByContractId($focus->id);
        if(empty($focus->id) || empty($items))
        {
          $xtpl->assign("ITEM_IDX", 1);
          
          $xtpl->assign("ITEM_SequenceNumeric",'1');
          $xtpl->assign("ITEM_MarksNumbers",'');
          $xtpl->assign("ITEM_CargoDescription",'');
          $xtpl->assign("ITEM_Content",'');  
          $xtpl->assign("ITEM_ID",'');
          
          $xtpl->parse("main.item");
        }
        else
        {
         $idx = 1;
         foreach($items as $item)
         {
          $xtpl->assign("ITEM_IDX", $idx++);
          
          $xtpl->assign("ITEM_SequenceNumeric",$item->SequenceNumeric);
          $xtpl->assign("ITEM_MarksNumbers",$item->MarksNumbers);
          $xtpl->assign("ITEM_CargoDescription",$item->CargoDescription);
          $xtpl->assign("ITEM_PRODUCT_NUM",$item->product_num);
          $xtpl->assign("ITEM_Content",$item->Content);
          
          $xtpl->assign("ITEM_ID",$item->id);
          
          $xtpl->parse("main.item");
         }
        }
        //~~~ end contract items;
     
        //下面的代码是控制输出,需要调整
      $xtpl->parse("main.open_source");
     $xtpl->parse("main");
        $xtpl->out("main");//注意:main 中 没有 </from>标签 , 它在Item标签中所以下面代码必须写
     
     echo "\n<p>\n";//输出明细的标题
     echo get_module_title($mod_strings['LBL_ConsignmentItem'], $mod_strings['LBL_ConsignmentItem'].": ".$focus->name, true);
     echo "\n</p>\n";
     
     $xtpl->parse("Item.items"); //赋明细列表 <!-- BEGIN: items --> 与  <!-- END: items --> 之间
     $xtpl->parse("Item");       //赋   <!-- BEGIN: Item --> 与  <!-- END: Item --> 之间
     $xtpl->out("Item");         //输出 <!-- BEGIN: Item --> 与  <!-- END: Item --> 之间
     
        4.调用javascript脚本
        /wwws/EditView.html

        //在文件开始部分中调用javascript的地方添写下面代码

        <script type="text/javascript" src="modules/wwws/ConsignmentItem.js"></script>
        <script>
        lableMap =
        {
        'btn_del':'{MOD.LBL_REMOVEROW}'
        };
        </script>
        
        5.创建javascript脚本 ,用于Item中创建新行和删除行的javascript
        在模块路径下创建名为 ConsignmentItem.js 的js文件,文件应为明细item模块的名称
        文件中添加下面代码
        function addRow(tbId, lableMap)
        {
         var tbl = document.getElementById(tbId);
         var count = tbl.rows.length;
         var row = tbl.insertRow(count);

         var cell0 = row.insertCell(row.cells.length);
         cell0.innerHTML = '<input type=text size=7  value="1" name=SequenceNumeric_'+count+' id=SequenceNumeric_'+count+'>';
         
         var cell1 = row.insertCell(row.cells.length);
         cell1.innerHTML = '<input type=text size=7  value="" name=MarksNumbers_'+count+' id=MarksNumbers_'+count+'>';
         
         var cell2 = row.insertCell(row.cells.length);
         cell2.innerHTML = '<input type=text size=7  value="0" name=CargoDescription_'+count+' id=CargoDescription_'+count+'>';
         
         var cell3 = row.insertCell(row.cells.length);
         cell3.innerHTML = '<input type=text size=7  value="" name=Content_'+count+' id=Content_'+count+'>';

         var cell4 = row.insertCell(row.cells.length);
         cell4.innerHTML = '<INPUT class="button" id="remove" onclick="delRow(\'prod\','+count+')" type="button" value="'+lableMap['btn_del']+'" name="remove"><input type=hidden id=rowIndexId_'+count+' name=rowIndexId_'+count+' value=0><INPUT type="hidden" name=contract_item_id_'+count+' value="" />';
         
        // var cell7 = row.insertCell(row.cells.length);
        // cell7.innserHTML = '';
        }

        function delRow(tbId, idx)
        {
         var tbl = document.getElementById(tbId);
         var row = tbl.rows[idx];
         row.style.display = 'none';
         
         var delFlag = document.getElementById("rowIndexId_"+idx);
         delFlag.value = 1;
         
         //calculate();
        }
        6.保存
            原理: save.php                  控制保存的走向
                  SaveFormBase.php          执行保存的控制主文件(手动创建)
                  bw_ConsignmentItem.php    保存子表的所用文件(手动创建)
                  bw_Consignment.php        保存主表的所用文件(不用修改) 
                  
            (1)修改 save.php
               \modules\bw_Consignments\Save.php
                将原有的所有代码注释掉
                加入下面代码
                require_once('modules/bw_Consignments/SaveFormBase.php');//引入 执行保存的控制主文件
                $contractForm = new SaveFormBase();
                $contractForm->handleSave('', true, false);
           
            (2)创建 SaveFormBase.php
                \modules\bw_Consignments\SaveFormBase.php   \\在主表模块
                加入下面代码
                <?php
                    if(empty($GLOBALS['sugarEntry'])) die('Not A Valid Entry Point');

                    require_once('include/JSON.php');

                    class SaveFormBase{

                     function checkForDuplicates($prefix){
                      require_once('include/formbase.php');
                      require_once('modules/bw_Consignments/bw_Consignment.php');
                      $focus = new bw_Consignment();
                      $query = '';
                      $baseQuery = 'select id, Consignment_number from Consignments where deleted!=1 and (';

                      if(isset($_POST[$prefix.'bw_consignment_number']) && !empty($_POST[$prefix.'bw_consignment_number'])) {
                       $query = $baseQuery ."  bw_consignment_number like '%".$_POST[$prefix.'bw_consignment_number']."%'";
                       $query .= getLikeForEachWord('bw_consignment_number', $_POST[$prefix.'bw_consignment_number']);
                      }
                      if(!empty($query)){
                       $rows = array();
                       require_once('include/database/PearDatabase.php');
                       $db = & PearDatabase::getInstance();
                       $result = $db->query($query.')');
                       if($db->getRowCount($result) == 0) {
                        return null;
                       }
                       for($i = 0; $i < $db->getRowCount($result); $i++) {
                        $rows[$i] = $db->fetchByAssoc($result, $i);
                       }
                       return $rows;
                      }
                      return null;
                     }

                     function handleSave($prefix, $redirect=true, $useRequired=false)
                     {
                      global $current_user;
                      require_once('modules/bw_Consignments/bw_Consignment.php');
                      require_once('modules/bw_Consignments/bw_ConsignmentItem.php');
                      require_once('log4php/LoggerManager.php');
                      require_once('include/formbase.php');

                      $focus = new bw_Consignment();
                      if($useRequired &&  !checkRequired($prefix, array_keys($focus->required_fields))) {
                       return null;
                      }

                      $focus = populateFromPost($prefix, $focus);
                      if( !ACLController::checkAccess($focus->module_dir, 'edit', $focus->isOwner($current_user->id))){
                       ACLController::displayNoAccess(true);
                      }
                      $check_notify = FALSE;
                      if (isset($GLOBALS['check_notify'])) {
                       $check_notify = $GLOBALS['check_notify'];
                      }

                      if (empty($_POST['record']) && empty($_POST['dup_checked'])) {
                       $duplicates = $this->checkForDuplicates($prefix);
                       if(isset($duplicates)){
                        $duplicateMsg = '';
                        foreach ($duplicates as $duplicate)
                        {
                         $duplicateMsg .= "<a href='index.php?module=" . $focus->module_dir . "&action=DetailView&record=". $duplicate['id']. "'>". $duplicate['bw_consignment_number']. "</a><br>\n";
                        }
                        die("Please check this duplicate record first.<br>\n". $duplicateMsg);
                       }
                      }

                      $return_id = $focus->save($check_notify);
                      
                      $ci = new bw_ConsignmentItem();
                      $all_items = $ci->getAllById($return_id);//通过主表的id 获取此id在子表中的数据列表

                      $updated = array();
                      $keys = array_keys($_POST);//$_POST 中是主表的内容 及 子表的内容  提交的所有数据
                      $sum = 0;


                      
                      for($index = 1; ; $index++) //子表数据 遍历一行赋赋值
                      {
                       if(!isset($_POST["SequenceNumeric_".$index])) //for循环出口
                        break;  
                        
                       $MessageID="";//$_POST[""];
                       $ConsignmentID=$return_id;//主表保存后的id
                        
                       $SequenceNumeric = $_POST["SequenceNumeric_".$index];
                       $MarksNumbers = $_POST["MarksNumbers_".$index];
                       $CargoDescription = $_POST["CargoDescription_".$index];
                       $Content = $_POST["Content_".$index];
                       
                    //   if($quantity <= 0 || !isset($product_id) || empty($product_id))// 条件判断
                    //    continue;
                       
                       $item_id = $_POST["item_id_".$index];
                       
                       $Item = new bw_ConsignmentItem();
                       
                       $deleted  = $_POST['rowIndexId_'.$index];
                       if($deleted == 0)
                       {
                        if(!empty($item_id))
                        {
                         $Item->id = $item_id;
                          array_push($updated, $item_id); //if the id is empty, create one, otherwise, update it.
                        }
                        
                        $Item->MessageID = $MessageID;
                        $Item->ConsignmentID = $ConsignmentID;//主表的id
                        $Item->SequenceNumeric = $SequenceNumeric;
                        $Item->MarksNumbers = $MarksNumbers;
                        $Item->CargoDescription = $CargoDescription;
                        $Item->Content = $Content;   
                        
                        $Item->date_entered = date("Y-m-d H:i:s");
                        $Item->date_modified = date("Y-m-d H:i:s");
                        
                        $Item->save();
                       }
                      }
                     
                      //delete some items.
                      foreach($all_items as $item)
                      {
                       $ci_id = $item->id;
                       if( !in_array($ci_id, $updated) )
                        $item->mark_deleted($ci_id);
                      }
                      //~~ end saving contract items.

                      if(!empty($_POST['duplicate_parent_id'])) {
                       clone_relationship($focus->db, array('bw_consignments_documents'), 'bw_consignment_id',  $_POST['duplicate_parent_id'], $focus->id);
                      }
                      $return_id = $focus->id;
                      $GLOBALS['log']->debug("Saved record with id of ".$return_id);
                      if ($redirect) {
                       handleRedirect($return_id,"bw_Consignments" );
                      } else {
                       return $focus;
                      }
                     }
                    }
                    ?>
     
                 (3)创建 bw_ConsignmentItem.php 文件
                    \modules\bw_Consignments\bw_ConsignmentItem.php   \\在主表模块
                    加入下面代码
                    <?php
                    
                        include_once('config.php');
                        require_once('log4php/LoggerManager.php');
                        require_once('include/database/PearDatabase.php');
                        require_once('data/SugarBean.php');

                        // Contact is used to store customer information.
                        class bw_ConsignmentItem extends SugarBean
                        {
                         // Stored fields
                          var $id;  
                          var $date_entered;
                          var $date_modified;
                          var $assigned_user_id;
                          var $modified_user_id;
                          var $created_by;
                          var $name;
                          var $description;
                          var $deleted;
                          
                          //custom fields
                          var $MessageID;
                          var $ConsignmentID;
                          var $SequenceNumeric;
                          var $MarksNumbers;
                          var $CargoDescription;
                          var $Content;
                         
                         var $table_name = 'bw_consignitems';
                         var $object_name = 'bw_ConsignItem';
                         var $module_dir = 'bw_ConsignItems';
                         var $new_schema = true;

                           var $column_fields = Array('id'
                          ,'MessageID'
                          ,'ConsignmentID'
                          ,'SequenceNumeric'
                          ,'MarksNumbers'
                          ,'CargoDescription'
                          
                          ,'deleted'
                          ,'date_entered'
                          ,'date_modified'
                          ,'created_by'
                          );
                          

                           var $list_fields= array();
                           var $required_fields = array();

                           function Order()
                           {
                          parent::SugarBean();
                          $this->list_fields = $this->column_fields;
                           }

                           function get_xtemplate_data() {
                          $return_array = array();
                          global $current_user;
                          foreach($this->column_fields as $field) {
                           $return_array[strtoupper($field)] = $this->$field;
                          }
                          return $return_array;
                         }
                         function mark_deletedById($id) {
                          $return_array = $this->get_full_list("id","ConsignmentID='".$id."'");
                          foreach ($return_array as $value) {
                           $this->mark_deleted($value->id);
                          }
                         }
                         
                         function fill_in_additional_list_fields() {
                          $this->fill_in_additional_detail_fields();
                          $this->single_total = $this->quantity * $this->trade_price;
                         }
                         
                         function getAllById($id)//传入主表的保存后的id
                         {
                          $return_array = $this->get_full_list("id","ConsignmentID='".$id."'");
                          return $return_array;
                         }
                        }
                    ?>

  • 相关阅读:
    Python中变量的作用域
    Python中关于函数的介绍
    python列表中的赋值与深浅拷贝
    Python中关于集合的介绍及用法
    python中文件操作的六种模式及对文件某一行进行修改的方法
    python中文件操作的其他方法
    python中文件操作的基本方法
    python中字符串的一些用法
    python里字典的用法介绍
    小谈python里 列表 的几种常用用法
  • 原文地址:https://www.cnblogs.com/hailexuexi/p/1953238.html
Copyright © 2011-2022 走看看