1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
36:
37: Yii::import('zii.widgets.grid.CGridView');
38: Yii::import('X2GridViewBase');
39:
40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
52: class X2GridView extends X2ActiveGridView {
53: public $viewName;
54: public $fieldFormatter = 'X2GridViewFieldFormatter';
55:
56: 57: 58:
59: public $dataColumnClass = 'X2DataColumn';
60:
61: public $allFields = array ();
62:
63: 64: 65:
66: public $enableTags = false;
67:
68: protected $_fieldModels;
69: protected $_isAdmin;
70:
71: public function __construct($owner = null){
72: X2Model::$autoPopulateFields = false;
73: parent::__construct($owner);
74: }
75:
76:
77:
78: protected function addSpecialFieldNames () {
79: parent::addSpecialFieldNames ();
80:
81:
82: if($this->model->asa ('TagBehavior'))
83: $this->allFieldNames['tags'] = Yii::t('app','Tags');
84: }
85:
86: protected function addFieldNames () {
87: $this->addSpecialFieldNames ();
88:
89: foreach($this->allFields as $fieldName=>&$field) {
90: $this->allFieldNames[$fieldName] =
91: X2Model::model($this->modelName)->getAttributeLabel($field->fieldName);
92: }
93: }
94:
95: protected $_model;
96: public function getModel ($row=null, $data=null) {
97: if (!isset ($this->_model)) {
98: $this->_model = X2Model::model ($this->modelName);
99: }
100: return $this->_model;
101: }
102:
103: protected function handleFields () {
104: $fields = X2Model::model($this->modelName)->getFields();
105:
106: $fieldPermissions = array();
107: if(!$this->isAdmin && !empty(Yii::app()->params->roles)) {
108: $rolePermissions = Yii::app()->db->createCommand()
109: ->select('fieldId, permission')
110: ->from('x2_role_to_permission')
111: ->join('x2_fields','x2_fields.modelName="'.$this->modelName.
112: '" AND x2_fields.id=fieldId AND roleId IN ('.
113: implode(',',Yii::app()->params->roles).')')
114: ->queryAll();
115:
116: foreach($rolePermissions as &$permission) {
117: if(!isset($fieldPermissions[$permission['fieldId']]) ||
118: $fieldPermissions[$permission['fieldId']] < (int)$permission['permission']) {
119:
120: $fieldPermissions[$permission['fieldId']] = (int)$permission['permission'];
121: }
122: }
123: }
124:
125:
126: $excludedColumns = array_flip ($this->excludedColumns ? $this->excludedColumns : array ());
127: foreach($fields as $field) {
128: if (isset($excludedColumns[$field->fieldName]))
129: continue;
130: if((!isset($fieldPermissions[$field->id]) || $fieldPermissions[$field->id] > 0))
131: $this->allFields[$field->fieldName] = $field;
132: }
133: }
134:
135: protected function createDefaultStyleColumn ($columnName, $width) {
136: $isCurrency = in_array($columnName,array('annualRevenue','quoteAmount'));
137: $newColumn = array();
138:
139: if ((array_key_exists($columnName, $this->allFields))) {
140:
141: $newColumn['name'] = $columnName;
142: $newColumn['id'] = $this->namespacePrefix.'C_'.$columnName;
143: $newColumn['header'] = X2Model::model($this->modelName)
144: ->getAttributeLabel($columnName);
145: $newColumn['fieldModel'] = isset($this->fieldModels[$columnName]) ?
146: $this->fieldModels[$columnName]->attributes : array();
147: $newColumn['headerHtmlOptions'] = array(
148: 'style'=>'width:'.$this->formatWidth ($width).';');
149:
150: $makeLinks = in_array (
151: $this->allFields[$columnName]->type, array ('phone', 'link', 'assignment'));
152:
153: $newColumn['value'] =
154: '$this->grid->setFormatter ($data)
155: ->renderAttribute ("'.$columnName.'", '.($makeLinks ? 'true' : 'false').');';
156: } else if($columnName == 'tags') {
157: $newColumn['id'] = $this->namespacePrefix.'C_'.'tags';
158: $newColumn['header'] = Yii::t('app','Tags');
159: $newColumn['headerHtmlOptions'] = array('style'=>'width:'.$width.'px;');
160: $newColumn['value'] = 'Tags::getTagLinks("'.$this->modelName.'",$data->id)';
161: $newColumn['type'] = 'raw';
162: $newColumn['filter'] = $this->filter->renderTagInput ();
163: }
164: return $newColumn;
165: }
166:
167: public function getFieldModels() {
168: if(!isset($this->_fieldModels)) {
169: $this->_fieldModels = X2Model::model($this->modelName)->getFields(true);
170: }
171: return $this->_fieldModels;
172: }
173:
174: public function getIsAdmin() {
175: if(!isset($this->_isAdmin)) {
176: $this->_isAdmin =
177: (bool) Yii::app()->user->checkAccess(ucfirst($this->moduleName).'AdminAccess');
178: }
179: return $this->_isAdmin;
180: }
181:
182: public function init () {
183: $this->calculateChecksum = filter_input (INPUT_GET, 'calculateGridViewChecksum');
184: $this->handleFields ();
185: if ($this->enableSelectAllOnAllPages &&
186: $this->calculateChecksum) {
187:
188: $this->dataProvider->calculateChecksum = true;
189: }
190: parent::init ();
191: }
192:
193: public function setModuleName($value) {
194: $this->_moduleName = $value;
195: }
196:
197: protected function () {
198: if ($this->enableSelectAllOnAllPages) {
199: $this->renderSelectAllRecordsOnAllPagesStrip ();
200: }
201: }
202:
203: private function renderSelectAllRecordsOnAllPagesStrip () {
204: echo
205: '<div class="select-all-records-on-all-pages-strip-container" style="display: none;">
206: <div class="select-all-notice">
207: '.Yii::t('app', 'All {count} {recordType} on this page have been selected. '.
208: '{clickHereLink} to select all {recordType} on all pages.', array (
209: '{count}' => '<b>'.$this->dataProvider->itemCount.'</b>',
210: '{clickHereLink}' =>
211: '<a class="select-all-records-on-all-pages" href="#">'.
212: Yii::t('app', 'Click here').
213: '</a>',
214: '{recordType}' => X2Model::getRecordName ($this->modelName, true),
215: )).'
216: </div>
217: <div class="all-selected-notice" style="display: none;">
218: '.Yii::t(
219: 'app',
220: 'All {recordType} on all pages have been selected ({count} in total). '.
221: '{clickHereLink} to clear your selection.',
222: array (
223: '{count}' => '<b>'.$this->dataProvider->totalItemCount.'</b>',
224: '{clickHereLink}' =>
225: '<a class="unselect-all-records-on-all-pages" href="#">'.
226: Yii::t('app', 'Click here').
227: '</a>',
228: '{recordType}' => X2Model::getRecordName ($this->modelName, true),
229: )).'
230: </div>
231: </div>';
232: }
233:
234: }
235: ?>
236: