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');
}