/** * Apply columns values to grid block * * @param Mage_Adminhtml_Block_Widget_Grid $grid Grid block instance * @param bool $applyFromCollection Whether values from collection columns should be applied * @return this */ public function applyColumnsToGridBlock(Mage_Adminhtml_Block_Widget_Grid $grid, $applyFromCollection) { $gridIds = array_keys($grid->getColumns()); $columnsOrders = array(); $columns = $this->getColumns(); uasort($columns, array($this, '_sortColumns')); $attributes = $this->getAvailableAttributes(); foreach ($columns as $column) { if (!in_array($column['id'], $gridIds)) { if ($column['is_visible'] && !$column['missing'] && (!$this->isCollectionColumnOrigin($column['origin']) || $applyFromCollection)) { // Add from collection/attribute visible and not missing columns $lockedValues = $this->getColumnLockedValues($column['id']); $data = array('header' => $column['header'], 'align' => $column['align'], 'width' => $column['width'], 'index' => $column['index']); $data = array_merge($data, array_intersect_key($lockedValues, $data)); if ($this->isCollectionColumnOrigin($column['origin'])) { if (isset($lockedValues['renderer']) || !is_null($column['renderer_type'])) { // Add collection specific column values if (isset($lockedValues['renderer'])) { $rendererType = $lockedValues['renderer']; $rendererParams = $rendererType == $column['renderer_type'] ? $column['renderer_params'] : array(); } else { $rendererType = $column['renderer_type']; $rendererParams = $column['renderer_params']; } $data = array_merge($data, $this->_getCollectionColumnGridValues($rendererType, $rendererParams, $column['index'], $grid->blcg_getStore())); } } elseif ($this->isAttributeColumnOrigin($column['origin'])) { if (!isset($attributes[$column['index']])) { // Unknown attribute continue; } if (is_null($column['store_id'])) { // Grid's store $store = $grid->blcg_getStore(); } else { // Specific store $store = Mage::app()->getStore($column['store_id']); } // Use auto-generated unique ID as index $alias = self::GRID_COLUMN_ATTRIBUTE_GRID_ALIAS . str_replace(self::GRID_COLUMN_ATTRIBUTE_ID_PREFIX, '', $column['id']); $data['index'] = $alias; // Tell grid to select current attribute $grid->blcg_addAdditionalAttribute(array('alias' => $alias, 'attribute' => $attributes[$column['index']], 'bind' => 'entity_id', 'filter' => null, 'join_type' => 'left', 'store_id' => $store->getId())); // Add attribute specific column values $data = array_merge($data, $this->_getAttributeColumnGridValues($attributes[$column['index']], $column['renderer_params'], $store)); } if (isset($lockedValues['config_values']) && is_array($lockedValues['config_values'])) { $data = array_merge($data, $lockedValues['config_values']); } $grid->addColumn($column['id'], $data); $columnsOrders[] = $column['id']; } } else { if ($column['is_visible']) { // Update visible columns $grid->getColumn($column['id'])->setWidth($column['width'])->setAlign($column['align'])->setHeader($column['header']); $columnsOrders[] = $column['id']; } else { // Remove not visible columns $grid->blcg_removeColumn($column['id']); } } } // Apply columns orders $grid->blcg_resetColumnsOrder(); $previousId = null; foreach ($columnsOrders as $columnId) { if (!is_null($previousId)) { $grid->addColumnsOrder($columnId, $previousId); } $previousId = $columnId; } $grid->sortColumnsByOrder(); return $this; }