Great idea.
Your proposed code is:
PHP Code:
/*
Modification of core view detail to override preDisplay functionality
*/
require_once('include/MVC/View/views/view.detail.php');
class CustomViewDetail extends ViewDetail{
function CustomViewDetail(){
parent::ViewDetail();
}
// Modified to allow override based on record content
function preDisplay($foundViewDefs = false, $metadataFile = null){
// core version of this function hardcodes definitions for variables,
// we allow them to be passed from the child object
$GLOBALS['log']->debug(sprintf("preDisplay Detail Variables [%][%s]", $foundViewDefs, $metadataFile));
// validate parameters
if($foundViewDefs && is_null($metadataFile)) $foundViewDefs = false;
elseif(!$foundViewDefs && !is_null($metadataFile)) $foundViewDefs = true;
// extra test to validate file passed
if($foundViewDefs && !file_exists($metadataFile)) $foundViewDefs = false;
if (!$foundViewDefs) {
// Resume original code
if(file_exists('custom/modules/' . $this->module . '/metadata/detailviewdefs.php')){
$metadataFile = 'custom/modules/' . $this->module . '/metadata/detailviewdefs.php';
$foundViewDefs = true;
}else{
if(file_exists('custom/modules/'.$this->module.'/metadata/metafiles.php')){
require_once('custom/modules/'.$this->module.'/metadata/metafiles.php');
if(!empty($metafiles[$this->module]['detailviewdefs'])){
$metadataFile = $metafiles[$this->module]['detailviewdefs'];
$foundViewDefs = true;
}
}elseif(file_exists('modules/'.$this->module.'/metadata/metafiles.php')){
require_once('modules/'.$this->module.'/metadata/metafiles.php');
if(!empty($metafiles[$this->module]['detailviewdefs'])){
$metadataFile = $metafiles[$this->module]['detailviewdefs'];
$foundViewDefs = true;
}
}
}
$GLOBALS['log']->debug("CUSTOM metadatafile=". $metadataFile);
if(!$foundViewDefs && file_exists('modules/'.$this->module.'/metadata/detailviewdefs.php')){
$metadataFile = 'modules/'.$this->module.'/metadata/detailviewdefs.php';
}
$this->dv = new DetailView2();
$this->dv->ss =& $this->ss;
$this->dv->setup($this->module, $this->bean, $metadataFile, 'include/DetailView/DetailView.tpl'
} // end $foundViewDefs test
}
}
This is a very interesting feature. However adding this as a method parameter seems a bit quick n dirty
. Also, overriding these methods holds the risk of the method changing with an upgrade which can still render your installation unusable despite the fact that it is upgrade-safe (I've seen it happen). It may be better to leave the original methods alone. I'm proposing the "detailviewdefs.php" name be made by using a class attribute like this:
PHP Code:
<?php
require_once('include/DetailView/DetailView2.php');
class ViewDetail extends SugarView{
var $type ='detail';
var $dv;
var $metafile; //new line
function ViewDetail(){
$this->options['show_subpanels'] = true;
parent::SugarView();
}
//Override me!
function setMetafile() {
}
function preDisplay(){
$metadataFile = null;
$foundViewDefs = false;
$this->setMetafile(); //new line
if(file_exists('custom/modules/' . $this->module . '/metadata/'.$this->metafile.'.php')){ //changed line, use this for every mention of "detailviewdefs" in this method.
$metadataFile = 'custom/modules/' . $this->module . '/metadata/detailviewdefs.php';
$foundViewDefs = true;
}else{
if(file_exists('custom/modules/'.$this->module.'/metadata/metafiles.php')){
require_once('custom/modules/'.$this->module.'/metadata/metafiles.php');
if(!empty($metafiles[$this->module]['detailviewdefs'])){
$metadataFile = $metafiles[$this->module]['detailviewdefs'];
$foundViewDefs = true;
}
}elseif(file_exists('modules/'.$this->module.'/metadata/metafiles.php')){
require_once('modules/'.$this->module.'/metadata/metafiles.php');
if(!empty($metafiles[$this->module]['detailviewdefs'])){
$metadataFile = $metafiles[$this->module]['detailviewdefs'];
$foundViewDefs = true;
}
}
}
$GLOBALS['log']->debug("metadatafile=". $metadataFile);
if(!$foundViewDefs && file_exists('modules/'.$this->module.'/metadata/detailviewdefs.php')){
$metadataFile = 'modules/'.$this->module.'/metadata/detailviewdefs.php';
}
$this->dv = new DetailView2();
$this->dv->ss =& $this->ss;
$this->dv->setup($this->module, $this->bean, $metadataFile, 'include/DetailView/DetailView.tpl');
}
function display(){
if(empty($this->bean->id)){
global $app_strings;
sugar_die($app_strings['ERROR_NO_RECORD']);
}
$this->dv->process();
echo $this->dv->display();
}
}
Bookmarks