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: