1: <?php
2: /*****************************************************************************************
3: * X2Engine Open Source Edition is a customer relationship management program developed by
4: * X2Engine, Inc. Copyright (C) 2011-2016 X2Engine Inc.
5: *
6: * This program is free software; you can redistribute it and/or modify it under
7: * the terms of the GNU Affero General Public License version 3 as published by the
8: * Free Software Foundation with the addition of the following permission added
9: * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
10: * IN WHICH THE COPYRIGHT IS OWNED BY X2ENGINE, X2ENGINE DISCLAIMS THE WARRANTY
11: * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
12: *
13: * This program is distributed in the hope that it will be useful, but WITHOUT
14: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15: * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
16: * details.
17: *
18: * You should have received a copy of the GNU Affero General Public License along with
19: * this program; if not, see http://www.gnu.org/licenses or write to the Free
20: * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21: * 02110-1301 USA.
22: *
23: * You can contact X2Engine, Inc. P.O. Box 66752, Scotts Valley,
24: * California 95067, USA. or at email address [email protected].
25: *
26: * The interactive user interfaces in modified source and object code versions
27: * of this program must display Appropriate Legal Notices, as required under
28: * Section 5 of the GNU Affero General Public License version 3.
29: *
30: * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
31: * these Appropriate Legal Notices must retain the display of the "Powered by
32: * X2Engine" logo. If the display of the logo is not reasonably feasible for
33: * technical reasons, the Appropriate Legal Notices must display the words
34: * "Powered by X2Engine".
35: *****************************************************************************************/
36:
37: abstract class MobileLayoutRenderer extends X2Widget {
38:
39: public $mobileLayout;
40: public $model;
41: public $instantiateJSClassOnInit = true;
42:
43: abstract public function renderLayout ();
44:
45: abstract public function getLayout ();
46:
47: private $_packages;
48: public function getPackages () {
49: return array_merge (parent::getPackages (), array (
50: 'MobileLayoutRenderer' => array(
51: 'baseUrl' => Yii::app()->controller->assetsUrl,
52: 'js' => array(
53: 'js/MobileLayoutRenderer.js',
54: ),
55: 'depends' => array ('auxlib')
56: ),
57: ));
58: }
59:
60: /**
61: * Gets the field Permissions into an aray
62: * @return array array of field permissions
63: */
64: public function getFieldPermissions () {
65: // Admin can edit all.
66: if (Yii::app()->params->isAdmin || empty(Yii::app()->params->roles)) {
67: return;
68: }
69:
70: if ($this->model instanceof X2Model) {
71: return $this->model->getFieldPermissions();
72: } else {
73: return null;
74: }
75: }
76:
77: /**
78: * Returns if the form or a specific field can be edited.
79: * If Field is empty, it returns permissions of whole form
80: */
81: public function canEdit($field) {
82: if (!($field instanceof Fields)) return true;
83: if(Yii::app()->params->isAdmin){
84: return true;
85: }
86:
87: // If field is read only no one can edit
88: if($field->readOnly) {
89: return false;
90: }
91:
92: // If permissions aren't set, it can be edited
93: if (!isset($this->fieldPermissions[$field->fieldName])) {
94: return true;
95: }
96:
97: // If permissions are set to 'edit', it can be edited
98: if ($this->fieldPermissions[$field->fieldName] === 2) {
99: return true;
100: }
101:
102: // Otherwise, it cant be edited (permissions set to 0 or 1)
103: return false;
104: }
105:
106: public function canView($field) {
107: if(Yii::app()->params->isAdmin){
108: return true;
109: }
110:
111: // If permissions aren't set, it can be viewed
112: if (!isset($this->fieldPermissions[$field->fieldName])) {
113: return true;
114: }
115:
116: // If permissions are set to 'view', it can be viewed
117: if ($this->fieldPermissions[$field->fieldName] >= 1) {
118: return true;
119: }
120:
121: // Otherwise, it cant be viewed (permissions set to 0 )
122: return false;
123: }
124:
125: private $_modelName;
126: public function getModelName () {
127: if (!isset ($this->_modelName)) {
128: $this->_modelName = get_class ($this->model);
129: }
130: return $this->_modelName;
131: }
132:
133: public function renderLabel ($text) {
134: }
135:
136: public function renderValue ($fieldName, array $htmlOptions=array ()) {
137: $html = '';
138: $html .= CHtml::openTag (
139: 'div', X2Html::mergeHtmlOptions (array ('class' => 'field-value'), $htmlOptions));
140: $html .= $this->model->renderAttribute ($fieldName);
141: $html .= CHtml::closeTag ('div');
142: return $html;
143: }
144:
145: public function renderName () {
146: $nameField = $this->model->getField ('name');
147: $html = '';
148: if ($nameField) {
149: $html .= $this->renderField ($this->renderValue ('name'));
150: }
151:
152: return $html;
153: }
154:
155: public function renderField ($field, $inner, array $htmlOptions=array ()) {
156: $html = '';
157: if ($field->valueIsLink ()) {
158: $classes = 'ui-link field-container field-link-container';
159: if ($field->linkType === 'multiple')
160: $classes .= ' multiple-links';
161: $html .= CHtml::tag (
162: 'div', X2Html::mergeHtmlOptions (array (
163: 'class' => $classes,
164: ), $htmlOptions));
165: $html .= $inner;
166: $html .= CHtml::closeTag ('div');
167: } else {
168: $html .= CHtml::openTag (
169: 'div', X2Html::mergeHtmlOptions (
170: array ('class' => 'field-container'), $htmlOptions));
171: $html .= $inner;
172: $html .= CHtml::closeTag ('div');
173: }
174: return $html;
175: }
176:
177: public function getLayoutData () {
178: if (!$this->mobileLayout) {
179: // if there's no mobile layout, generate layout from default desktop app record layout
180: $layoutData = MobileLayouts::generateDefaultLayout (
181: $this->layoutType, $this->modelName);
182: } else {
183: $layoutData = $this->mobileLayout->layout;
184: }
185: return $layoutData;
186: }
187:
188: public function run () {
189: $ret = parent::run ();
190: echo $this->renderLayout ();
191: return $ret;
192: }
193:
194: }
195:
196: ?>
197: