/** * Определяем массив модулей и дергаем родительский конструктор * * @param mixed $spec * @param array $options */ public function __construct($spec, $options = null) { require_once 'Phorm/Resource.php'; $Resource = new Phorm_Resource(); $pairs = isset($options['multioptions']) && is_array($options['multioptions']) ? $options['multioptions'] : array(); $options['multioptions'] = $pairs + $Resource->getModulesListAsPairs(); parent::__construct($spec, $options); }
/** * Готовим данные для подгрузки в таблицу Datagrid * * @param array $data * @param Zend_Paginator $paginator * @param mixed $params */ public static function data(array $data, $paginator, $params = array()) { if ($params instanceof Zend_Config) { $params = $params->toArray(); } $front = Zend_Controller_Front::getInstance(); $boot = $front->getParam('bootstrap'); $view = $boot->getResource('View'); $translate = $boot->getResource('Translate'); $rows = array(); foreach ($data as $key => $row) { foreach ($row as $field => $value) { // Перевод $value = $translate->_($value); // Простые значения $rows[$key][$field] = $value; // Пустые значения if ($value == '' || is_null($value)) { $rows[$key][$field] = '—'; } // Заменяем url if (isset($params['headings'][$field]['url'])) { $url = self::replaceField($params['headings'][$field]['url'], $data[$key]); $rows[$key][$field] = '<a class="ui-phorm-grid-label" href="' . $view->getSiteUrl() . urldecode($url) . '">' . $value . '</a>'; } // Картинка if (isset($params['headings'][$field]['image'])) { $url = self::replaceField($params['headings'][$field]['image'], $data[$key]); //$data[$key][$field] = '<img src="'.$front->getBaseUrl().$url.'" align="left" hspace="4" /> ' . $value; $rows[$key][$field] = '<img src="' . $front->getBaseUrl() . $url . '" align="left" hspace="4" title="' . $value . '" /> '; } // Чекбоксы if (isset($params['headings'][$field]['checkbox'])) { $rows[$key][$field] = '<input type="checkbox" name="' . $field . '[]" class="' . $field . '" value="' . $row[$params['headings'][$field]['checkbox']] . '" />'; } // Заменяем действия if (isset($params['headings'][$field]['actions'])) { $rows[$key][$field] = ''; foreach ($params['headings'][$field]['actions'] as $action => $opts) { if (!empty($opts)) { $url = isset($opts['url']) ? self::replaceField($view->getSiteUrl() . $opts['url'], $data[$key]) : '#'; $title = isset($opts['title']) ? $translate->_($opts['title']) : ''; $icon = isset($opts['icon']) ? '<span class="ui-icon ui-icon-' . $opts['icon'] . '"></span>' : ''; $text = isset($opts['text']) ? '<span class="ui-button-text">' . $opts['text'] . '</span>' : ''; $iconclass = isset($opts['text']) ? 'ui-button-text-icons' : ''; $class = isset($opts['class']) ? $opts['class'] . ' ' : ''; $rows[$key][$field] .= ' <a href="' . $url . '" class="' . $class . $action . ' ui-corner-all ui-button ' . $iconclass . ' ui-state-default" title="' . $translate->_($title) . '">' . $icon . $translate->_($text) . '</a>'; } } } // Замена подстрок if (isset($params['headings'][$field]['replace'])) { $search = $params['headings'][$field]['replace']['search']; $replace = $params['headings'][$field]['replace']['replace']; if (is_array($replace)) { foreach ($replace as $k => $v) { $replace[$k] = $translate->_($v); } } else { $replace = $translate->_($replace); } $rows[$key][$field] = str_replace($search, $replace, $data[$key][$field]); } // Форматирование даты if (isset($params['headings'][$field]['dateformat'])) { $rows[$key][$field] = $data[$key][$field] > 0 ? date($params['headings'][$field]['dateformat'], $data[$key][$field]) : '—'; } // Фильтры (простые функции с одним параметром в виде текущего значения) if (isset($params['headings'][$field]['filters']) && is_array($params['headings'][$field]['filters'])) { foreach ($params['headings'][$field]['filters'] as $filter) { if (function_exists($filter)) { $rows[$key][$field] = call_user_func($filter, $data[$key][$field]); } } } } } // @todo Здесь нам надо отловить поля, которые есть в headings, но нет в списке данных и убрать actions в запросах // $headings = array(); $position = 0; foreach ($params['headings'] as $id => $val) { if (isset($val['label'])) { /** * Пропускаем невидимые столбцы */ if (isset($val['visible']) && (bool) $val['visible'] === false) { continue; } /** * Устанавливаем заголовок столбца */ $val['label'] = $translate->_($val['label']); $val['id'] = $id; /** * Чекбоксы */ if (isset($val['checkbox'])) { $val['label'] = '<input type="checkbox" name="' . $id . '_all" class="' . $id . '_all" title="' . $translate->_($val['label']) . '" />'; } /** * Порядок сортировки */ if (isset($val['position'])) { $position = $val['position']; foreach ($headings as $y => $z) { if ($y >= $position) { unset($headings[$y]); $headings[++$y] = $z; } } } else { $position++; } $headings[$position] = $val; } } ksort($headings); $headings = array_values($headings); /** * Накидываем справочники на поисковые формы */ $search = array(); if (isset($params['search']) && is_array($params['search'])) { foreach ($params['search'] as $id => $val) { // Переводчик if (isset($val['label']) && trim($val['label']) != '') { $val['label'] = $translate->_($val['label']); } // Список модулей if ($val['type'] == 'SelectModule') { $Resource = new Phorm_Resource(); $val['optiondata'] = $Resource->getModulesListAsPairs(); // Список разделов } elseif ($val['type'] == 'SelectCategory') { $Categories = new Phorm_Categories(); if (isset($params['moduleid'])) { $val['optiondata'] = $Categories->getCategoriesPathsByModule($params['moduleid']); } else { $val['optiondata'] = $Categories->getList(); } } // Перевод справочников if (isset($val['optiondata']) && is_array($val['optiondata'])) { foreach ($val['optiondata'] as $k => $v) { if (is_string($v)) { $val['optiondata'][$k] = $translate->_($v); } } } $val['id'] = $id; $search[] = $val; } } return array("pager" => array("page" => $paginator->current, "pages" => $paginator->pageCount, "found" => $paginator->totalItemCount, "displayingStart" => $paginator->firstItemNumber, "displayingEnd" => $paginator->lastItemNumber, "perPage" => $paginator->itemCountPerPage), "headings" => $headings, "search" => empty($search) ? null : $search, "rows" => $rows); }