我正在SugarCRM Community Edition(版本6.5.16)上创建一个发票模块。
我想要的技巧是根据名为“已发送”的复选框的值创建一个字段readonly。因此:如果发送了发票,则用户无法再编辑发票。
我知道在editviewdefs中只读取一个字段可以通过将类型设置为readonly来完成:
0 =>
array (
'name' => 'invoicenumber',
'label' => 'LBL_INVOICENUMBER',
'type' => 'readonly',
),
但是,无论选中“已发送”复选框,此字段现在都是只读的。
我尝试在editviewdefs.php中使用PHP编辑数组,但这导致始终关闭字段。如果为所有记录构建一次editviewdefs.php,这是有道理的。
有没有办法用PHP或SugarCode(当然是PHP)做到这一点? 我想转向的最后一种方法是使用javascript,但有点想避免它,因为这是非常重要的功能。一个用户意外关闭javascript最终可能变得非常混乱。
所以,如果您有任何疑问,请询问。为了这个OP,我尽可能包含尽可能少的代码,但如果您对代码有疑问,请随意提问!
非常感谢!
答案 0 :(得分:2)
我找到了。
问题不在于我放置代码的地方,问题在于缓存viewdef。 因此修复+重建后看到的第一个项目将成为其他项目的默认项目。我之前没有发现问题,因为我将SugarCRM设置为Developer Mode,它不会缓存viewdef。
最简单的方法是这样的:
首先,复制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',
),
确保开发人员模式已关闭,以获得正确的测试结果。运行修复&amp;重建。 现在一切都应该按预期工作了。 :)
答案 1 :(得分:-1)
这将是Sugarcrm的Sugar Logic运作良好的一个很好的例子。糖开发博客不久前写了一个类似的例子 http://developer.sugarcrm.com/2012/11/08/using-sugar-logic-to-conditonal-make-fields-read-only/