Создание Excel отчетов из результатов поиска Seblod

Ширшов Александр
31.10.2012
4020

Недавно возник вопрос о возможности скачивания в виде Excel таблицы результатов поиска seblod. Функционал в принципе востребованный, выводим Seblod'ом список и под ним ссылку "Скачать в xls". Это может быть список недвижимости, либо товары определенной категории, либо любая иная информация. В этой статье мы рассмотрим нестандартный способ вывода результатов поиска Seblod в виде excel файла.

Для решения нам нужно создать библиотеку и шаблон, который эту библиотеку будет использовать. Создание библиотеки сводиться к скачиванию библиотеки PHPExcel и созданию xml файла (PHPExcel.xml), в котором перечислены все файлы которые нужно скопировать. Списочек получился весьма объемный (если кому интересно то получил я его с помощью небольшой функции: http://codepad.org/Glke3Ayx )

Для наглядности я создам несколько материалов ТК Article, ТК в данном случае значения не имеет. В xls у нас пойдут любые данные которые нам вернет поиск себлода.

Подготовка материалов Joomla для экспорта в файл excel xls

Создадим Тип Поиска, в который выберем все поля которые нужно экспортировать. Назовем его его xls_search.

Создание типа поиска, формирующего данные для экспорта в Excel

Ссылка на поиск выглядит так - /index.php?option=com_cck&view=list&search=xls_search&task=search&tmpl=raw . Параметр tmpl=raw добавлен для того чтобы исключить в шаблоне какой-либо другой вывод. К сожалению параметра tmpl в url не обойтись. Некоторый html код выводит шаблон list из компонента com_cck, поэтому его надо переопределить. Создаем файл /templates/__YOUR_TEMPLATE__/html/com_cck/list/default.php со следующим кодом:

    // No Direct Access
    defined( '_JEXEC' ) or die;
    $input = JFactory::getApplication()->input;
    //Если запрашивается результаты для ТП xls_search и шаблон назначен raw
    if (($input->getString('search', NULL) === 'xls_search') AND ($input->getString('tmpl', NULL) === 'raw')) 
    { // то подключаем наш шаблон xls.php
        include(__DIR__ . DS . 'xls.php');
    }
    else
    { // иначе шаблон из компонента
        include(JPATH_COMPONENT . DS . 'views' . DS . 'list' . DS . 'tmpl' . DS . 'default.php');
    }
// end of file

По комментариям должно быть всё понятно. Не исключаю что есть более правильные способы переопределения шаблонов, но я использовал этот как самый простой и эффективный.

В этой же папке где мы создали deafult.php создаем xls.php, собственно этот файл и будет генерировать xls. Я постарался снабдить код коментариями везде где можно поэтому трудностей в понимании возникнуть не должно.

 // No Direct Access
    defined( '_JEXEC' ) or die;
    // Объект seblod для рендера
    $cck    =    CCK_Rendering::getInstance();
    // Класс с данными о позиции mainbody, 
    // если у вас другая позиция, передавать нужно другое значение
    $mainbody = $cck->getPosition('mainbody');
    // Получаем результаты поиска
    $items = $cck->getItems();
    // Подключем библиотеку PHPExcel
    jimport('phpexcel.PHPExcel');
    // Если нет результатов то прекращаем работу скрипта. 
    // Если хотите можете сделать редирект куда либо
    if ($this->total == 0)
    {
        //JFactory::getApplication()->redirect($url);
        echo 'no result.';
        die();
    }
    // Создаем экземпляр класса для работы с excel файлами
    $excel = new PHPExcel();
    // Создаем экземпляр класса для работы с листами excel
    $excel->setActiveSheetIndex(0);
    // Получаем объект первого листа excel файла
    $sheet = $excel->getActiveSheet();
    // Получаем название поиска (label) и устанавлиаем его как заголовок листа
    $sheet->setTitle(@$this->search->title);
    // Создаем заголовки в первой строке листа
    $char = 'A';
    foreach (explode('/', $mainbody->legend2) as $legend)
    {
        // Задаем значения ячеек
        $sheet->setCellValue($char.'1', trim($legend));
        // Задаем оформление для ячеек
        $sheet->getStyle($char.'1')->applyFromArray(
            array(
                // шрифт
                'font'=>array(
                    'name'=>'Arial Cyr',
                    'size'=>'16',
                    'bold'=>true
                ),
                // выравнивание
                'alignment'=>array(
                    'horizontal'=>PHPExcel_Style_Alignment::HORIZONTAL_CENTER,
                    'vertical'=>PHPExcel_Style_Alignment::VERTICAL_TOP
                ),
                // цвет
                'color' => array(
                    'rgb' => 'FFDEAA'
                )
            )
        );
        $char++;
    }
    // Записываем данные
    $index = 2;
    foreach ($items as $item)
    {
        // Задаем значения ячеек
        foreach ($item as $fields)
        {
            $char = 'A';
            foreach ($item as $fields)
            {
                foreach ($fields as $field)
                {
                    $sheet->setCellValue($char.$index, $field->value);
                    $char++;
                }
            }
        }
        $index++;
    }
    // Создаем объект для вывода данных
    $excel_writer = new PHPExcel_Writer_Excel5($excel);
    // Посылаем заголовки браузеру о том что выводить будем Excel
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment;filename="'.$this->search->name.'.xls"');
    header('Cache-Control: max-age=0');
    // Выводим excel в браузер, если передать имя файла то вывод будет в файл
    $excel_writer->save('php://output');
    // Прекращаем программу
    die();
//end of file

Результаты вывода в xls

Остается открытым вопрос о размере ячеек (ширины и высоты) но тут возможны разные варианты, и пусть этот вопрос вам останеться на домашнее задание.

Источники

Для широты понимания темы:

Комментарии  

# kronos Не качает PHPExcel.xml

У Вас недостаточно прав для добавления комментариев. Для того, чтобы оставить свой комментарий необходимо зарегистрироваться на сайте.