quickcreatemetaparser.php

来自「SugarCRM5.1 开源PHP客户关系管理系统」· PHP 代码 · 共 266 行

PHP
266
字号
<?phpif(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');/********************************************************************************* * SugarCRM is a customer relationship management program developed by * SugarCRM, Inc. Copyright (C) 2004 - 2007 SugarCRM Inc. *  * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation with the addition of the following permission added * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. *  * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more * details. *  * You should have received a copy of the GNU General Public License along with * this program; if not, see http://www.gnu.org/licenses or write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. *  * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road, * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com. *  * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. *  * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * SugarCRM" logo. If the display of the logo is not reasonably feasible for * technical reasons, the Appropriate Legal Notices must display the words * "Powered by SugarCRM". ********************************************************************************//** * EdtiViewMetaParser.php * This is a utility file that attempts to provide support for parsing pre 5.0 SugarCRM  * QuickCreate.html files and produce a best guess editviewdefs.php file equivalent. *  * @author Collin Lee */  require_once('include/SugarFields/Parsers/MetaParser.php');class QuickCreateMetaParser extends MetaParser {function QuickCreateMetaParser() {   $this->mView = 'QuickCreate';}/** * parse *  * @param $filePath The file path of the HTML file to parse * @param $vardefs The module's vardefs * @param $moduleDir The module's directory * @param $merge boolean value indicating whether or not to merge the parsed contents * @param $masterCopy The file path of the mater copy of the metadata file to merge against * @return String format of metadata contents **/function parse($filePath, $vardefs = array(), $moduleDir = '', $merge=false, $masterCopy=null) {   global $app_strings;   $contents = file_get_contents($filePath);      // The contents are not well formed so we add this section to make it easier to parse   $contents = $this->trimHTML($contents) . '</td></tr></table>';   $moduleName = '';      $forms = $this->getElementsByType("form", $contents);   $tables = $this->getElementsByType("table", $forms[0] . "</td></tr></table>");   $mainrow = $this->getElementsByType("tr", $tables[1]);   $rows = substr($mainrow[0], strpos($mainrow[0], "</tr>"));   $tablerows = $this->getElementsByType("tr", $rows);   foreach($tablerows as $trow) {   	   	   $emptyCount = 0;   	   $tablecolumns = $this->getElementsByType("td", $trow);       $col = array();       $slot = 0;       	   foreach($tablecolumns as $tcols) {	   	  	 	  	   	  $sugarAttrLabel = $this->getTagAttribute("sugar", $tcols, "'^slot[^b]+$'");	   	  $sugarAttrValue = $this->getTagAttribute("sugar", $tcols, "'slot[0-9]+b$'");          // If there wasn't any slot numbering/lettering then just default to expect label->vallue pairs          $sugarAttrLabel = count($sugarAttrLabel) != 0 ? $sugarAttrLabel : ($slot % 2 == 0) ? true : false;          $sugarAttrValue = count($sugarAttrValue) != 0 ? $sugarAttrValue : ($slot % 2 == 1) ? true : false;                    $slot++;                    if($sugarAttrValue) {	   	     	 	   	  	 $spanValue = strtolower($this->getElementValue("span", $tcols));             if(empty($spanValue)) {                $spanValue = strtolower($this->getElementValue("slot", $tcols));	             }             if(empty($spanValue)) {                $spanValue = strtolower($this->getElementValue("td", $tcols));             }                          //Get all the editable form elements' names	   	  	 $formElementNames = $this->getFormElementsNames($spanValue);		   	  	 	   	  	 $customField = $this->getCustomField($formElementNames);	   	  	 	   	  	 $name = '';             $readOnly = false;             $fields = null;             $customCode = null;                                     if(!empty($customField)) {                          // If it's a custom field we just set the name               $name = $customField;                                  } else if(empty($formElementNames) && preg_match_all('/[\{]([^\}]*?)[\}]/s', $spanValue, $matches, PREG_SET_ORDER)) {	   	  	   // We are here if the $spanValue did not contain a form element for editing.	   	  	   // We will assume that it is read only (since there were no edit form elements)	   	  	   	           // If there is more than one matching {} value then try to find the right one to key off	           // based on vardefs.php file.  Also, use the entire spanValue as customCode	           	if(count($matches) > 1) {			       $name = $matches[0][1];  			       $customCode = $spanValue;			       foreach($matches as $pair) {		   	  	 	   if(preg_match("/^(mod[\.]|app[\.]).*?/s", $pair[1])) {		   	  	 	       $customCode = str_replace($pair[1], '$'.strtoupper($pair[1]), $customCode);      		   	  	 	   } else if(!empty($vardefs[$pair[1]])) {		   	  	 	       $name = $pair[1];		   	  	 	       $customCode = str_replace($pair[1], '$fields.'.$pair[1].'.value', $customCode);		   	  	 	   }		           } //foreach		       } else {		       	   //If it is only a label, skip		       	   if(preg_match("/^(mod[\.]|app[\.]).*?/s", $matches[0][1])) {		       	   	  continue;		       	   } else if(preg_match("/^[\$].*?/s", $matches[0][1])) {		       	   	  $name = '{' . strtoupper($matches[0][1]) . '}';  		       	   } else {         		   	  	   	  $name = $matches[0][1];		       	   }   		   	   }		   	  	   		   	   $readOnly = true;  	   	  	 } else if(is_array($formElementNames)) {                  	   	  	      if(count($formElementNames) == 1) {	   	  	      	 if(!empty($vardefs[$formElementNames[0]])) {	   	  	            $name = $formElementNames[0];	   	  	      	 } 	   	  	      } else {	   	  	      	 $fields = array();	   	  	      	 foreach($formElementNames as $elementName) {	   	  	      	 	// What we are doing here is saying that we will add all your fields assuming	   	  	      	 	// there are none that are of type relate or link.  However, if we find such a type	   	  	      	 	// we'll take the first one found and assume that is the field you want (the SugarFields	   	  	      	 	// library will handle rendering the popup and select and clear buttons for you).	   	  	      	 	if(isset($vardefs[$elementName])) {	   	  	      	 	   $type = $vardefs[$elementName]['type'];	   	  	      	 	   if($type != 'relate' && $type != 'link') {	   	  	      	 	      $fields[] = $elementName;	   	  	      	 	      $name = $elementName;	   	  	      	 	   } else {	   	  	      	          unset($fields);	   	  	      	 	      $name = $elementName;	   	  	      	 	      break;		   	  	      	 	   }	   	  	      	 	}	   	  	      	 }	   	  	      } //if-else	   	  	 }	   	  	 	   	  	 // Build the entry	   	  	 if(preg_match("/<textarea/si", $spanValue)) {	   	  	 	//special case for textarea form elements (add the displayParams)	   	  	 	$displayParams = array();	   	  	    $displayParams['rows'] = $this->getTagAttribute("rows", $spanValue);	   	  	    $displayParams['cols'] = $this->getTagAttribute("cols", $spanValue);	   	  	    if(!empty($displayParams['rows']) && !empty($displayParams['cols'])) {		   	  	    $field = array();		   	  	    $field['name'] = $name;					$field['displayParams'] = $displayParams;	   	  	    } else {	   	  	        $field = $name;		   	  	    }	   	  	    $col[] = $field;	   	  	 } else if($readOnly) {	   	  	 	$field = array();	   	  	 	$field['name'] = $name;	   	  	 	$field['type'] = 'readonly';	   	  	 	if(isset($customCode)) {	   	  	 	   $field['customCode'] = $customCode;	   	  	 	} //if	   	  	 	$col[] = $field;	   	  	 } else {	   	  	 	if(isset($fields) || isset($customCode)) {	   	  	 	   $field = array();	   	  	 	   $field['name'] = $name;	   	  	 	   if(isset($fields)) {	   	  	 	   	  $field['fields'] = $fields;	   	  	 	   }	   	  	 	   if(isset($customCode)) {	   	  	 	   	  $field['customCode'] = $customCode;	   	  	 	   }  	 	   	   	  	 	   $col[] = $field;	   	  	 	} else {	   	  	 	   $emptyCount = $name == '' ? $emptyCount + 1 : $emptyCount;	   	  	 	   $col[] = $name;	   	  	 	}		   	  	 } //if-else if-else block	   	  } //if($sugarAttrValue)	   } //foreach	   	   // One last final check.  If $emptyCount does not equal Array $col count, don't add 	   if($emptyCount != count($col)) {   	      $metarow[] = $col;	   } //if   } //foreach      $templateMeta = array();   $templateMeta['form']['buttons'] = 'button';   preg_match_all("/(<input[^>]*?)>/si", $tables[0], $matches);   $buttons = array();   foreach($matches[0] as $button) {   		$buttons[] = array('customCode'=>$button);	      }   $templateMeta['form']['buttons'] = $buttons;      $formElements = $this->getFormElements($contents);   $hiddenInputs = array();   foreach($formElements as $elem) {   	      $type = $this->getTagAttribute("type", $elem);   	      if(preg_match('/hidden/si',$type, $matches)) {   	         $name = $this->getTagAttribute("name", $elem);   	         $value = $this->getTagAttribute("value", $elem);   	         $index = stripos($value, '$REQUEST');   	         $value =  !empty($index) ? '$smarty.request.' . substr($value, 10) : $value;   	         $hiddenInputs[] = '<input id="' . $name . '" name="' . $name . '" value="' . $value . '">';   	      }    } //foreach      $templateMeta['form']['hidden'] = $hiddenInputs;   $templateMeta['widths'] = array(array('label' => '10', 'field' => '30'),  array('label' => '10', 'field' => '30'));   $templateMeta['maxColumns'] = 2;      $panels = array();   $panels['default'] = $metarow;   $panels = $this->appplyRules($moduleDir, $panels);   return $this->createFileContents($moduleDir, $panels, $templateMeta, $filePath);   }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?