type = $type;
$this->ss = new Sugar_Smarty();
}
function fetch($path){
$additional = '';
if(!$this->hasButton && !empty($this->button)){
$additional .= 'button . '>';
}
if(!empty($this->buttons)){
foreach($this->buttons as $v){
$additional .= ' ';
}
}
if(!empty($this->image)){
$additional .= ' image . '>';
}
return $this->ss->fetch($path) . $additional;
}
function findTemplate($view){
static $tplCache = array();
if ( isset($tplCache[$this->type][$view]) ) {
return $tplCache[$this->type][$view];
}
$lastClass = get_class($this);
$classList = array($this->type,str_replace('SugarField','',$lastClass));
while ( $lastClass = get_parent_class($lastClass) ) {
$classList[] = str_replace('SugarField','',$lastClass);
}
$tplName = '';
foreach ( $classList as $className ) {
global $current_language;
if(isset($current_language)) {
$tplName = 'include/SugarFields/Fields/'. $className .'/'. $current_language . '.' . $view .'.tpl';
if ( file_exists('custom/'.$tplName) ) {
$tplName = 'custom/'.$tplName;
break;
}
if ( file_exists($tplName) ) {
break;
}
}
$tplName = 'include/SugarFields/Fields/'. $className .'/'. $view .'.tpl';
if ( file_exists('custom/'.$tplName) ) {
$tplName = 'custom/'.$tplName;
break;
}
if ( file_exists($tplName) ) {
break;
}
}
$tplCache[$this->type][$view] = $tplName;
return $tplName;
}
public function formatField($rawField, $vardef){
// The base field doesn't do any formatting, so override it in subclasses for more specific actions
return $rawField;
}
public function unformatField($formattedField, $vardef){
// The base field doesn't do any formatting, so override it in subclasses for more specific actions
return $formattedField;
}
function getSmartyView($parentFieldArray, $vardef, $displayParams, $tabindex = -1, $view){
$this->setup($parentFieldArray, $vardef, $displayParams, $tabindex);
return $this->fetch($this->findTemplate($view));
}
function getListViewSmarty($parentFieldArray, $vardef, $displayParams, $col) {
$tabindex = 1;
$parentFieldArray = $this->setupFieldArray($parentFieldArray, $vardef);
$this->setup($parentFieldArray, $vardef, $displayParams, $tabindex, false);
$this->ss->left_delimiter = '{';
$this->ss->right_delimiter = '}';
$this->ss->assign('col',$vardef['name']);
return $this->fetch($this->findTemplate('ListView'));
}
/**
* Returns a smarty template for the DetailViews
*
* @param parentFieldArray string name of the variable in the parent template for the bean's data
* @param vardef vardef field defintion
* @param displayParam parameters for display
* available paramters are:
* * labelSpan - column span for the label
* * fieldSpan - column span for the field
*/
function getDetailViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex) {
return $this->getSmartyView($parentFieldArray, $vardef, $displayParams, $tabindex, 'DetailView');
}
// 99% of all fields will just format like a listview, but just in case, it's here to override
function getChangeLogSmarty($parentFieldArray, $vardef, $displayParams, $tabindex) {
return $this->formatField($parentFieldArray[$vardef['name']],$vardef);
}
function getEditViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex) {
if(!empty($vardef['function']['returns']) && $vardef['function']['returns'] == 'html'){
$type = $this->type;
$this->type = 'Base';
$result= $this->getDetailViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex);
$this->type = $type;
return $result;
}
return $this->getSmartyView($parentFieldArray, $vardef, $displayParams, $tabindex, 'EditView');
}
function getImportViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex)
{
return $this->getEditViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex);
}
function getSearchViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex) {
if(!empty($vardef['auto_increment']))$vardef['len']=255;
return $this->getSmartyView($parentFieldArray, $vardef, $displayParams, $tabindex, 'EditView');
}
function getPopupViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex){
if (is_array($displayParams) && !isset($displayParams['formName']))
$displayParams['formName'] = 'popup_query_form';
else if (empty($displayParams))
$displayParams = array('formName' => 'popup_query_form');
return $this->getSearchViewSmarty($parentFieldArray, $vardef, $displayParams, $tabindex);
}
public function getEmailTemplateValue($inputField, $vardef, $context = null){
// This does not return a smarty section, instead it returns a direct value
return $this->formatField($inputField,$vardef);
}
function displayFromFunc( $displayType, $parentFieldArray, $vardef, $displayParams, $tabindex = 0 ) {
if ( ! is_array($vardef['function']) ) {
$funcName = $vardef['function'];
$includeFile = '';
$onListView = false;
$returnsHtml = false;
} else {
$funcName = $vardef['function']['name'];
$includeFile = '';
if ( isset($vardef['function']['include']) ) {
$includeFile = $vardef['function']['include'];
}
if ( isset($vardef['function']['onListView']) && $vardef['function']['onListView'] == true ) {
$onListView = true;
} else {
$onListView = false;
}
if ( isset($vardef['function']['returns']) && $vardef['function']['returns'] == 'html' ) {
$returnsHtml = true;
} else {
$returnsHtml = false;
}
}
if ( $displayType == 'ListView'
|| $displayType == 'popupView'
|| $displayType == 'searchView'
|| $displayType == 'wirelessEditView'
|| $displayType == 'wirelessDetailView'
|| $displayType == 'wirelessListView'
) {
// Traditionally, before 6.0, additional functions were never called, so this code doesn't get called unless the vardef forces it
if ( $onListView ) {
if ( !empty($includeFile) ) {
require_once($includeFile);
}
return $funcName($parentFieldArray, $vardef['name'], $parentFieldArray[$vardef['name']], $displayType);
} else {
$displayTypeFunc = 'get'.$displayType.'Smarty';
return $this->$displayTypeFunc($parentFieldArray, $vardef, $displayParams, $tabindex);
}
} else {
if ( !empty($displayParams['idName']) ) {
$fieldName = $displayParams['idName'];
} else {
$fieldName = $vardef['name'];
}
if ( $returnsHtml ) {
$this->setup($parentFieldArray, $vardef, $displayParams, $tabindex);
$tpl = $this->findTemplate($displayType.'Function');
if ( $tpl == '' ) {
// Can't find a function template, just use the base
$tpl = $this->findTemplate('DetailViewFunction');
}
return "" . $this->fetch($tpl) . '';
} else {
return '{sugar_run_helper include="'.$includeFile.'" func="'.$funcName.'" bean=$bean field="'.$fieldName.'" value=$fields.'.$fieldName.'.value displayType="'.$displayType.'"}';
}
}
}
function getEditView() {
}
/**
* getSearchInput
*
* This function allows the SugarFields to handle returning the search input value given arguments (typically from $_REQUEST/$_POST)
* and a search string.
*
* @param $key String value of key to search for
* @param $args Mixed value containing haystack to search for value in
* @return $value Mixed value that the SugarField should return
*/
function getSearchInput($key='', $args=array())
{
//Nothing specified return empty string
if(empty($key) || empty($args))
{
return '';
}
return isset($args[$key]) ? $args[$key] : '';
}
function getQueryLike() {
}
function getQueryIn() {
}
/**
* Setup function to assign values to the smarty template, should be called before every display function
*/
function setup($parentFieldArray, $vardef, $displayParams, $tabindex, $twopass=true) {
$this->button = '';
$this->buttons = '';
$this->image = '';
if ($twopass){
$this->ss->left_delimiter = '{{';
$this->ss->right_delimiter = '}}';
}
$this->ss->assign('parentFieldArray', $parentFieldArray);
$this->ss->assign('vardef', $vardef);
$this->ss->assign('tabindex', $tabindex);
//for adding attributes to the field
if(!empty($displayParams['field'])){
$plusField = '';
foreach($displayParams['field'] as $key=>$value){
$plusField .= ' ' . $key . '="' . $value . '"';//bug 27381
}
$displayParams['field'] = $plusField;
}
//for adding attributes to the button
if(!empty($displayParams['button'])){
$plusField = '';
foreach($displayParams['button'] as $key=>$value){
$plusField .= ' ' . $key . '="' . $value . '"';
}
$displayParams['button'] = $plusField;
$this->button = $displayParams['button'];
}
if(!empty($displayParams['buttons'])){
$plusField = '';
foreach($displayParams['buttons'] as $keys=>$values){
foreach($values as $key=>$value){
$plusField[$keys] .= ' ' . $key . '="' . $value . '"';
}
}
$displayParams['buttons'] = $plusField;
$this->buttons = $displayParams['buttons'];
}
if(!empty($displayParams['image'])){
$plusField = '';
foreach($displayParams['image'] as $key=>$value){
$plusField .= ' ' . $key . '="' . $value . '"';
}
$displayParams['image'] = $plusField;
$this->image = $displayParams['image'];
}
$this->ss->assign('displayParams', $displayParams);
}
protected function getAccessKey($vardef, $fieldType = null, $module = null) {
global $app_strings;
$labelList = array(
'accessKey' => array(),
'accessKeySelect' => array(),
'accessKeyClear' => array(),
);
// Labels are always in uppercase
if ( isset($fieldType) ) {
$fieldType = strtoupper($fieldType);
}
if ( isset($module) ) {
$module = strtoupper($module);
}
// The vardef is the most specific, then the module + fieldType, then the module, then the fieldType
if ( isset($vardef['accessKey']) ) {
$labelList['accessKey'][] = $vardef['accessKey'];
}
if ( isset($vardef['accessKeySelect']) ) {
$labelList['accessKeySelect'][] = $vardef['accessKeySelect'];
}
if ( isset($vardef['accessKeyClear']) ) {
$labelList['accessKeyClear'][] = $vardef['accessKeyClear'];
}
if ( isset($fieldType) && isset($module) ) {
$labelList['accessKey'][] = 'LBL_ACCESSKEY_'.$fieldType.'_'.$module;
$labelList['accessKeySelect'][] = 'LBL_ACCESSKEY_SELECT_'.$fieldType.'_'.$module;
$labelList['accessKeyClear'][] = 'LBL_ACCESSKEY_CLEAR_'.$fieldType.'_'.$module;
}
if ( isset($module) ) {
$labelList['accessKey'][] = 'LBL_ACCESSKEY_'.$module;
$labelList['accessKeySelect'][] = 'LBL_ACCESSKEY_SELECT_'.$module;
$labelList['accessKeyClear'][] = 'LBL_ACCESSKEY_CLEAR_'.$module;
}
if ( isset($fieldType) ) {
$labelList['accessKey'][] = 'LBL_ACCESSKEY_'.$fieldType;
$labelList['accessKeySelect'][] = 'LBL_ACCESSKEY_SELECT_'.$fieldType;
$labelList['accessKeyClear'][] = 'LBL_ACCESSKEY_CLEAR_'.$fieldType;
}
// Attach the defaults to the ends
$labelList['accessKey'][] = 'LBL_ACCESSKEY';
$labelList['accessKeySelect'][] = 'LBL_SELECT_BUTTON';
$labelList['accessKeyClear'][] = 'LBL_CLEAR_BUTTON';
// Figure out the label and the key for the button.
// Later on we may attempt to make sure there are no two buttons with the same keys, but for now we will just use whatever is specified.
$keyTypes = array('accessKey','accessKeySelect','accessKeyClear');
$accessKeyList = array(
'accessKey' => '',
'accessKeyLabel' => '',
'accessKeyTitle' => '',
'accessKeySelect' => '',
'accessKeySelectLabel' => '',
'accessKeySelectTitle' => '',
'accessKeyClear' => '',
'accessKeyClearLabel' => '',
'accessKeyClearTitle' => '',
);
foreach( $keyTypes as $type ) {
foreach ( $labelList[$type] as $tryThis ) {
if ( isset($app_strings[$tryThis.'_KEY']) && isset($app_strings[$tryThis.'_TITLE']) && isset($app_strings[$tryThis.'_LABEL']) ) {
$accessKeyList[$type] = $tryThis.'_KEY';
$accessKeyList[$type.'Title'] = $tryThis.'_TITLE';
$accessKeyList[$type.'Label'] = $tryThis.'_LABEL';
break;
}
}
}
return $accessKeyList;
}
/**
* This should be called when the bean is saved. The bean itself will be passed by reference
* @param SugarBean bean - the bean performing the save
* @param array params - an array of paramester relevant to the save, most likely will be $_REQUEST
*/
public function save($bean, $params, $field, $properties, $prefix = '') {
if ( isset($params[$prefix.$field]) ) {
if(isset($properties['len']) && isset($properties['type']) && $this->isTrimmable($properties['type'])){
$bean->$field = trim($this->unformatField($params[$prefix.$field], $properties));
}
else {
$bean->$field = $this->unformatField($params[$prefix.$field], $properties);
}
}
}
/**
* Check if the field is allowed to be trimmed
*
* @param string $type
* @return boolean
*/
protected function isTrimmable($type) {
return in_array($type, array('varchar', 'name'));
}
/**
* Handles import field sanitizing for an field type
*
* @param $value string value to be sanitized
* @param $vardefs array
* @param $focus SugarBean object
* @param $settings ImportFieldSanitize object
* @return string sanitized value or boolean false if there's a problem with the value
*/
public function importSanitize(
$value,
$vardef,
$focus,
ImportFieldSanitize $settings
)
{
if( isset($vardef['len']) ) {
// check for field length
$value = sugar_substr($value, $vardef['len']);
}
return $value;
}
/**
* isRangeSearchView
* This method helps determine whether or not to display the range search view code for the sugar field
* @param array $vardef entry representing the sugar field's definition
* @return boolean true if range search view should be displayed, false otherwise
*/
protected function isRangeSearchView($vardef)
{
return !empty($vardef['enable_range_search']) && !empty($_REQUEST['action']) && $_REQUEST['action']!='Popup';
}
/**
* setupFieldArray
* This method takes the $parentFieldArray mixed variable which may be an Array or object and attempts
* to call any custom fieldSpecific formatting to the value depending on the field type.
*
* @see SugarFieldEnum.php, SugarFieldInt.php, SugarFieldFloat.php, SugarFieldRelate.php
* @param mixed $parentFieldArray Array or Object of data where the field's value comes from
* @param array $vardef The vardef entry linked to the SugarField instance
* @return array $parentFieldArray The formatted $parentFieldArray with the formatField method possibly applied
*/
protected function setupFieldArray($parentFieldArray, $vardef)
{
$fieldName = $vardef['name'];
if ( is_array($parentFieldArray) )
{
$fieldNameUpper = strtoupper($fieldName);
if ( isset($parentFieldArray[$fieldNameUpper]))
{
$parentFieldArray[$fieldName] = $this->formatField($parentFieldArray[$fieldNameUpper],$vardef);
} else {
$parentFieldArray[$fieldName] = '';
}
} elseif (is_object($parentFieldArray)) {
if ( isset($parentFieldArray->$fieldName) )
{
$parentFieldArray->$fieldName = $this->formatField($parentFieldArray->$fieldName,$vardef);
} else {
$parentFieldArray->$fieldName = '';
}
}
return $parentFieldArray;
}
}
?>