Пример #1
0
 protected function renderDataCellContent($row, $data)
 {
     if (!$this->isEditable($data)) {
         parent::renderDataCellContent($row, $data);
         return;
     }
     $options = CMap::mergeArray($this->editable, array('model' => $data, 'attribute' => $this->name));
     //if value defined for column --> use it as element text
     if (strlen($this->value)) {
         ob_start();
         parent::renderDataCellContent($row, $data);
         $text = ob_get_clean();
         $options['text'] = $text;
         $options['encode'] = false;
     }
     $editable = $this->grid->controller->createWidget('TbEditableField', $options);
     //manually make selector non unique to match all cells in column
     $selector = get_class($editable->model) . '_' . $editable->attribute;
     $editable->htmlOptions['rel'] = $selector;
     $editable->renderLink();
     //manually render client script (one for all cells in column)
     if (!$this->isScriptRendered) {
         $script = $editable->registerClientScript();
         Yii::app()->getClientScript()->registerScript(__CLASS__ . '#' . $selector . '-event', '
             $("#' . $this->grid->id . '").parent().on("ajaxUpdate.yiiGridView", "#' . $this->grid->id . '", function() {' . $script . '});
         ');
         $this->isScriptRendered = true;
     }
 }
Пример #2
0
 protected function renderDataCellContent($row, $data)
 {
     if (!$this->visible) {
         return $this->grid->nullDisplay;
     } else {
         return parent::renderDataCellContent($row, $data);
     }
 }
Пример #3
0
 public function renderDataCellContent($row, $data)
 {
     $isModel = $data instanceof CModel;
     if ($isModel) {
         $widgetClass = 'EditableField';
         $attribute = empty($this->editable['attribute']) ? $this->name : $this->editable['attribute'];
         $options = array('model' => $data, 'attribute' => $attribute);
         //if value defined in column config --> we should evaluate it
         //and pass to widget via `text` option: set flag `passText` = true
         $passText = !empty($this->value);
     } else {
         $widgetClass = 'Editable';
         $options = array('pk' => $data[$this->grid->dataProvider->keyField], 'name' => empty($this->editable['name']) ? $this->name : $this->editable['name']);
         $passText = true;
         //if autotext will be applied, do not pass `text` option (pass `value` instead)
         if (empty($this->value) && Editable::isAutotext($this->editable, isset($this->editable['type']) ? $this->editable['type'] : '')) {
             $options['value'] = $data[$this->name];
             $passText = false;
         }
     }
     //for live update
     $options['liveTarget'] = $this->grid->id;
     $options = CMap::mergeArray($this->editable, $options);
     //get text for element
     $ctext = CHtml::value($data, $attribute);
     //if value defined for column --> use it as element text
     if ($passText) {
         ob_start();
         parent::renderDataCellContent($row, $data);
         $text = ob_get_clean();
         $ctext = $text;
         $options['text'] = $text;
         $options['encode'] = false;
     }
     //apply may be a string expression, see https://github.com/vitalets/x-editable-yii/issues/33
     if (isset($options['apply']) && is_string($options['apply'])) {
         $options['apply'] = $this->evaluateExpression($options['apply'], array('data' => $data, 'row' => $row));
     }
     //evaluate htmlOptions inside editable config as they can depend on $data
     //see https://github.com/vitalets/x-editable-yii/issues/40
     if (isset($options['htmlOptions']) && is_array($options['htmlOptions'])) {
         foreach ($options['htmlOptions'] as $k => $v) {
             if (is_string($v) && (strpos($v, '$data') !== false || strpos($v, '$row') !== false)) {
                 $options['htmlOptions'][$k] = $this->evaluateExpression($v, array('data' => $data, 'row' => $row));
             }
         }
     }
     $this->grid->controller->widget($widgetClass, $options);
     //Added to support creating models on the fly
     //$ctext = CHtml::value($data, $attribute);
     $mClass = empty($this->modelName) ? get_class($data) : $this->modelName;
     if (empty($this->parentModel)) {
         echo cHtml::openTag('input', array('type' => 'hidden', 'class' => "optvalinput{$attribute}", 'id' => "{$mClass}_{$row}_{$attribute}", 'name' => "{$mClass}[{$row}][{$attribute}]", 'value' => $ctext));
     } else {
         echo cHtml::openTag('input', array('type' => 'hidden', 'class' => "optvalinput{$attribute}", 'id' => "{$this->parentModel[1]}_{$this->parentModel[0]}_{$mClass}_{$row}_{$attribute}", 'name' => "{$this->parentModel[1]}[{$this->parentModel[0]}][{$mClass}][{$row}][{$attribute}]", 'value' => $ctext));
     }
     echo cHtml::closeTag('input');
 }
Пример #4
0
 public function renderDataCellContent($row, $data)
 {
     $isModel = $data instanceof CModel;
     if ($isModel) {
         $widgetClass = 'EditableField';
         $options = array('model' => $data, 'attribute' => empty($this->editable['attribute']) ? $this->name : $this->editable['attribute']);
         //if value defined in column config --> we should evaluate it
         //and pass to widget via `text` option: set flag `passText` = true
         $passText = !empty($this->value);
     } else {
         $widgetClass = 'Editable';
         $options = array('pk' => $data[$this->grid->dataProvider->keyField], 'name' => empty($this->editable['name']) ? $this->name : $this->editable['name']);
         $passText = true;
         //if autotext will be applied, do not pass `text` option (pass `value` instead)
         if (empty($this->value) && Editable::isAutotext($this->editable, isset($this->editable['type']) ? $this->editable['type'] : '')) {
             $options['value'] = $data[$this->name];
             $passText = false;
         }
     }
     //for live update
     $options['liveTarget'] = $this->grid->id;
     $options = CMap::mergeArray($this->editable, $options);
     //if value defined for column --> use it as element text
     if ($passText) {
         ob_start();
         parent::renderDataCellContent($row, $data);
         $text = ob_get_clean();
         $options['text'] = $text;
         $options['encode'] = false;
     }
     //apply may be a string expression, see https://github.com/vitalets/x-editable-yii/issues/33
     if (isset($options['apply']) && is_string($options['apply'])) {
         $options['apply'] = $this->evaluateExpression($options['apply'], array('data' => $data, 'row' => $row));
     }
     //evaluate htmlOptions inside editable config as they can depend on $data
     //see https://github.com/vitalets/x-editable-yii/issues/40
     if (isset($options['htmlOptions']) && is_array($options['htmlOptions'])) {
         foreach ($options['htmlOptions'] as $k => $v) {
             if (is_string($v) && (strpos($v, '$data') !== false || strpos($v, '$row') !== false)) {
                 $options['htmlOptions'][$k] = $this->evaluateExpression($v, array('data' => $data, 'row' => $row));
             }
         }
     }
     //evaluate `params` as they can depend on $data
     //see https://github.com/vitalets/x-editable-yii/issues/65
     if (isset($options['params']) && is_array($options['params'])) {
         foreach ($options['params'] as $k => $v) {
             if (is_string($v) && (strpos($v, '$data') !== false || strpos($v, '$row') !== false)) {
                 $options['params'][$k] = $this->evaluateExpression($v, array('data' => $data, 'row' => $row));
             }
         }
     }
     $this->grid->controller->widget($widgetClass, $options);
 }
Пример #5
0
 protected function renderDataCellContent($row, $data)
 {
     if ($this->isSpan && $this->_conditionResult) {
         $value = null;
         if ($this->spanValue !== null) {
             $value = $this->evaluateExpression($this->spanValue, array('data' => $data, 'row' => $row));
         }
         echo is_null($value) ? $this->grid->nullDisplay : $this->grid->getFormatter()->format($value, $this->type);
     }
     //		else
     //		{
     parent::renderDataCellContent($row, $data);
     //		}
 }
Пример #6
0
 protected function renderDataCellContent($row, $data)
 {
     ob_start();
     parent::renderDataCellContent($row, $data);
     $label = ob_get_clean();
     if ($this->urlExpression !== null) {
         $url = $this->evaluateExpression($this->urlExpression, array('data' => $data, 'row' => $row));
     } else {
         $url = $this->url;
     }
     $options = $this->linkHtmlOptions;
     if (is_string($this->imageUrl)) {
         echo CHtml::link(CHtml::image($this->imageUrl, $label), $url, $options);
     } else {
         echo CHtml::link($label, $url, $options);
     }
 }
Пример #7
0
 protected function renderDataCellContent($row, $data)
 {
     $options = CMap::mergeArray($this->editable, array('model' => $data, 'attribute' => $this->name));
     //if value defined for column --> use it as element text
     if (strlen($this->value)) {
         ob_start();
         parent::renderDataCellContent($row, $data);
         $text = ob_get_clean();
         $options['text'] = $text;
         $options['encode'] = false;
     }
     $widget = $this->grid->controller->createWidget('EditableField', $options);
     //if editable not applied --> render original text
     if (!$widget->apply) {
         if (isset($text)) {
             echo $text;
         } else {
             parent::renderDataCellContent($row, $data);
         }
         return;
     }
     //manually make selector non unique to match all cells in column
     $selector = get_class($widget->model) . '_' . $widget->attribute;
     $widget->htmlOptions['rel'] = $selector;
     //can't call run() as it registers clientScript
     $widget->renderLink();
     //manually render client script (one for all cells in column)
     if (!$this->_isScriptRendered) {
         $script = $widget->registerClientScript();
         //use parent() as grid is totally replaced by new content
         Yii::app()->getClientScript()->registerScript(__CLASS__ . '#' . $selector . '-event', '
             $("#' . $this->grid->id . '").parent().on("ajaxUpdate.yiiGridView", "#' . $this->grid->id . '", function() {' . $script . '});
         ');
         $this->_isScriptRendered = true;
     }
 }
 protected function renderDataCellContent($row, $data)
 {
     $isModel = $data instanceof CModel;
     if ($isModel) {
         $widgetClass = 'EditableField';
         $options = array('model' => $data, 'attribute' => $this->name);
         //manually make selector non unique to match all cells in column
         $selector = $this->grid->id . '_' . str_replace('\\', '_', get_class($data)) . '_' . $this->name;
         //flag to pass text to widget
         $passText = strlen($this->value);
     } else {
         $widgetClass = 'Editable';
         $options = array('pk' => $data[$this->grid->dataProvider->keyField], 'name' => $this->name);
         //manually make selector non unique to match all cells in column
         $selector = $this->grid->id . '_' . $this->name;
         $passText = true;
         //if autotext will be applied, do not pass text param
         if (!strlen($this->value) && Editable::isAutotext($this->editable, isset($this->editable['type']) ? $this->editable['type'] : '')) {
             $options['value'] = $data[$this->name];
             $passText = false;
         }
     }
     $options = CMap::mergeArray($this->editable, $options);
     //if value defined for column --> use it as element text
     if ($passText) {
         ob_start();
         parent::renderDataCellContent($row, $data);
         $text = ob_get_clean();
         $options['text'] = $text;
         $options['encode'] = false;
     }
     //apply may be a string expression, see https://github.com/vitalets/x-editable-yii/issues/33
     if (isset($options['apply']) && is_string($options['apply'])) {
         $options['apply'] = $this->evaluateExpression($options['apply'], array('data' => $data, 'row' => $row));
     }
     $widget = $this->grid->controller->createWidget($widgetClass, $options);
     //if editable not applied --> render original text
     if ($widget->apply === false) {
         if (isset($text)) {
             echo $text;
         } else {
             parent::renderDataCellContent($row, $data);
         }
         return;
     }
     //call these methods manually as we don't call run()
     $widget->buildHtmlOptions();
     $widget->buildJsOptions();
     $widget->registerAssets();
     //manually make selector non unique to match all cells in column
     //model class may be namespaced, see https://github.com/vitalets/x-editable-yii/issues/9
     $widget->htmlOptions['rel'] = $selector;
     //can't call run() as it registers clientScript
     $widget->renderLink();
     //manually render client script (one for all cells in column)
     if (!$this->_isScriptRendered) {
         $script = $widget->registerClientScript();
         //use parent() as grid is totally replaced by new content
         Yii::app()->getClientScript()->registerScript(__CLASS__ . '#' . $selector . '-event', '
             $("#' . $this->grid->id . '").parent().on("ajaxUpdate.yiiGridView", "#' . $this->grid->id . '", function() {' . $script . '});
         ');
         $this->_isScriptRendered = true;
     }
 }
 /**
  * Renders the data cell content and adds the cell value to the total.
  * This method evaluates value or name to obtain the data cell value and adds
  * it to the current total. If set, output is evaluated to determine the
  * rendering result; if not the cell value is rendered.
  * @param integer the row number (zero-based)
  * @param mixed the data associated with the row
  */
 protected function renderDataCellContent($row, $data)
 {
     parent::renderDataCellContent($row, $data);
     /*if($this->value!==null)
     			$value=$this->evaluateExpression($this->value,compact('data','row'));
     		else if($this->name!==null)
     			$value=CHtml::value($data,$this->name);
     		else
     			$value=0;*/
     $this->_total += 1;
     /*if($value==0&&$this->nullOnZero)
     			$value=null;
     
     		if($this->output!==null&&$value!==null)
     			$value=$this->evaluateExpression($this->output,compact('data','row','value'));
     		echo $value===null
     			?$this->grid->nullDisplay
     			:$this->grid->getFormatter()->format($value,$this->type);*/
 }