Подгрузка содержимого меню opencart/ocstore из Excel
Движок: Ocstore 2.3
Использовал библиотеки:PHPExcel
Затрагивал файлы: catalogcontrollercommonheader.php
Для кого решение
Кому нужно быстро сформировать готовое меню без установки доп.модулей и наполнения через админку, а хочется все пункты прописать в Excel файле, положить его на хостинге и чтобы всё заработало. 100% совместимость решения с вашим магазином не гарантирую. Возможно придётся мой код адаптировать под вашу вьюшку шапки.
Что делал
Я взял готовое меню, которое выводит категории с подкатегориями до 3-го уровня вложенности в интернет-магазине, и сделал подгрузку данных в него на свои пункты, которые прописал в отдельном экселевском файле. Разбор файла делал с помощью библиотеки PHPExcel в контроллере шапки. Прописал для этого в классе ControllerCommonHeader отдельную функцию getExcelData. В самом начале контроллера добавил подключение библиотеки
require_once(DIR_SYSTEM .'PHPExcel/Classes/PHPExcel.php');
Сама функция getExcelData
public function getExcelData($fileExcel)<br> {<br> $data['categories'] = array();<br> $alhabet =array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R');<br> $excelReader = PHPExcel_IOFactory::createReaderForFile($fileExcel);<br> $excelObj = $excelReader->load($fileExcel);<br> $this->log->write('there-1');<br> for ($i=0; $i < 5; $i++) { $worksheet = $excelObj->getSheet($i);<br> $column = 0;<br> $children=array();<br> $this->log->write('there1');<br> while ($worksheet->getCell($alhabet[$column].'18')->getValue() != ';') {<br> $row = 19;<br> $children_lv3=array();<br> $this->log->write('there2:'.$alhabet[$column]);<br> while ($worksheet->getCell($alhabet[$column].$row)->getValue() != ';') {<br> $children_lv3[] = array('name'=>$worksheet->getCell($alhabet[$column].$row)->getValue(),<br> 'href'=>$worksheet->getCell($alhabet[$column+1].$row)->getValue());<br> $row++;<br> $this->log->write('there3');<br> }<br> $children[] = array('name'=>$worksheet->getCell($alhabet[$column].'18')->getValue(),<br> 'href'=>'',<br> 'children_lv3'=>$children_lv3,<br> 'column'=>1);<br> $this->log->write('there4');<br> $column = $column+2;<br> }<br> $data['categories'][$i] = array('name'=>$worksheet->getCell('A16')->getValue(),<br> 'column'=>1,<br> 'children'=>$children,<br> 'href'=>$worksheet->getCell('B16')->getValue());<br> $this->log->write('there4');
} return $data['categories']; }
Вызов моей функции в методе index контроллера после кода, который наполняет элемент вьюшного массива $data[‘categories’]
$fileExcel = DIR_SYSTEM .'PHPExcel/Classes/menu.xlsx'; if(file_exists($fileExcel)) $data['deskcategories'] = $this->getExcelData($fileExcel);
Экселевский файл с меню положил в папку с библиотекой DIR_SYSTEM .’PHPExcel/Classes/menu.xlsx’
Ограничения и требования к экселевскому файлу
Посмотрите в примере, который прикладываю к статье.
У моего скрипта стоят ограничения на считывание: всего 4 листа пробегает, количество столбцов- до ‘R’, читает с 16-й строчки(тут категория 1-го уровня),через строчку читает категорию 2-го уровня вложенности, а затем 3-го уровня вложенности. Если скрипт натыкается на символ «;» , то он заканчивает дальнейшее считывание текущим столбцом или стройчкой