%PDF- %PDF-
Direktori : /var/www/crm/include/SugarFields/Parsers/ |
Current File : /var/www/crm/include/SugarFields/Parsers/QuickCreateMetaParser.php |
<?php if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point'); /********************************************************************************* * SugarCRM Community Edition is a customer relationship management program developed by * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU Affero 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 Affero General Public License for more * details. * * You should have received a copy of the GNU Affero 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 Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero 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); } } ?>