2013-11-21 42 views
2

我在SugarCRM Community Edition(版本6.5.16)上创建了一个发票模块。在SugarCRM中有条件地创建一个字段

我想提取的技巧是根据名为'Sent'的复选框的值只读字段。所以:如果发票已发送,用户无法再编辑发票。

我知道editviewdefs制备场只读可以通过设置类型来完成为只读:

0 => 
array (
'name' => 'invoicenumber', 
'label' => 'LBL_INVOICENUMBER', 
'type' => 'readonly', 
), 

然而,这一领域现在是只读的,无论该复选框“发送”被选中的。

我试着在editviewdefs.php中用PHP编辑数组,但是这导致总是关闭这些字段。如果editviewdefs.php为所有记录构建一次,这是有道理的。

有没有办法用PHP或SugarCode(当然是PHP)做到这一点? 我想转向的最后一招是使用JavaScript,但有点想避免它,因为这是非常重要的功能。一个不小心关闭javascript的用户最终可能变得相当混乱。

所以,如果您有任何问题,请询问。为了这个OP,我已经包含了尽可能少的代码,但是如果您有关于代码的问题,请随时询问!

非常感谢!

+0

我做到了。将回答这个时Stackoverflow允许我(没有足够的声誉,现在这样做) – TheUnpragmaticProgrammer

回答

2

我找到了。

问题不在于我放置代码的地方,问题在于viewdefs的缓存。 因此,修复+重建后看到的第一个项目将成为其他项目的默认设置。起初我没有发现问题,因为我将SugarCRM设置为开发人员模式,在此模式下它不缓存viewdefs。

去最简单的方法是这样的: 首先,进行复印editviewdefs并将其命名为任何你喜欢(我的是:closededitviewdefs.php) 现在,更改无论你在新创建的文件EditView中一样。 做出更改后,将closededitviewdefs.php中的第5行从'EditView' =>更改为'ClosedEditView' => 完成后,在您的module/views文件夹中创建一个文件:view.edit.php。这些是它的内容(在适用的情况下替换模块特定的内容):

<?php 
class [REPLACEWITHMODULENAME]ViewEdit extends ViewEdit { 
    public function preDisplay() { 

     $bean = $this->bean; 
     $isClosed = $bean->sent; 

     if ($isClosed==1) { 
      $metadataFile = 'custom/modules/[MODULEFOLDER]/metadata/closededitviewdefs.php'; 
      $this->ev = $this->getEditView(); 
      $this->ev->view = 'ClosedEditView'; 
     } else { 
      $metadataFile = 'custom/modules/[MODULEFOLDER]/metadata/editviewdefs.php'; 
      $this->ev = $this->getEditView(); 
     } 
     $this->ev->ss =& $this->ss; 
     $this->ev->setup($this->module, $this->bean, $metadataFile, get_custom_file_if_exists('include/EditView/EditView.tpl')); 
    } 
} 
?> 

这种方式从现在开始创建两个缓存文件。 有一个主要问题:没有页眉和页脚在您的关闭视图中! 您可以轻松地加入以下closededitviewdefs.php解决这个:

'form' => 
array(
    'headerTpl' => 'include/EditView/header.tpl', 
    'footerTpl' => 'include/EditView/footer.tpl', 
), 

确保开发模式是关闭正确的测试结果。运行修复&重建。 现在一切都应按预期工作。 :)

-1

这将是一个很好的例子,其中Sugarcrm的Sugar Logic工程很棒。糖发展博客写了一个类似的例子前一段时间 http://developer.sugarcrm.com/2012/11/08/using-sugar-logic-to-conditonal-make-fields-read-only/

+0

它会!但不幸的是,我们无法购买全面的糖牌。我们现在使用的是Community Edition:它可以做我们想做的任何事情,但需要更多的编码才能做到。对于在Sugar中没有(很容易)完成的事情,我们已经在Sugar数据库之上构建了一个外部应用程序。不过,我相信从长远来看,许可证和Sugar Logic会更好。 – TheUnpragmaticProgrammer