Оставлю тут, может кому пригодится: Скачиваем библиотеку PHPExcel Я положил ее в assets/lib/ там внутри уже папка Classes из скачанного архива, в сниппете будет виден путь. Создал TV файл, назвал его xlsFile Создал сниппет showXls, в нем присутствует отладочная информация: <?php require_once 'assets/lib/Classes/PHPExcel/IOFactory.php'; // Подключаем библиотеку $xls = $modx->resource->getTVValue('xlsFile'); // Наш TV $objPHPExcel = PHPExcel_IOFactory::load($xls); // Скармливаем его библиотеке foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { $worksheetTitle = $worksheet->getTitle(); $highestRow = $worksheet->getHighestRow(); // Например, 10 $highestColumn = $worksheet->getHighestColumn(); // Например, 'F' $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); $nrColumns = ord($highestColumn) - 64; echo " В таблице ".$worksheetTitle." "; echo $nrColumns . ' колонок (A-' . $highestColumn . ') '; echo ' и ' . $highestRow . ' строк.'; echo ' Данные: <table border="0"><tr>'; for ($row = 1; $row <= $highestRow; ++ $row) { echo '<tr>'; for ($col = 0; $col < $highestColumnIndex; ++ $col) { $cell = $worksheet->getCellByColumnAndRow($col, $row); $val = $cell->getValue(); $dataType = PHPExcel_Cell_DataType::dataTypeForValue($val); echo '<td>' . $val . ' (Тип ' . $dataType . ')</td>'; } echo '</tr>'; } echo '</table>'; } И теперь в ресурсе, где надо вывести Excel и где мы загрузили в TV файлик, запускаем сниппет: [[showXls?]]
Ну, мы, собственно, и пытались заложить такую основу, чтобы при желании можно было сделать что угодно. Просто кому-то какие-то фишки нужны, а кому-то не нужны, поэтому не все в ядро сборки попадает.
крутотень, даже больше чем ожидал :-)
<< $c->innerJoin('ShopmodxProduct', 'Product');
Это не требуется, так как web/catalog/category/products/getdata расширяет web/catalog/products/getdata, в котором уже добавлено условие на таблицу. if($this->getProperty('sm_price')){ $params = $this->getProperty('sm_price'); Это тоже лучше упростить до if($params = $this->getProperty('sm_price')){ Итоговый код (без лишних else): if($params = $this->getProperty('sm_price')){
$q = array();
foreach($params as $key=>$p){
$q[] = 'Product.sm_price '.$key.' '.$p;
}
$query->where($q);
} Но это если рассматривать именно ваш код. А вообще правильней просто добавить $where еще перед вызовом процессора.
{$params.where[] = «sm_price between {$prices.0} and {$prices.1}»}
Не помню. Были разные по мере работ. Буквально час назад заработало. Поменял запись из примера: $objReader = PHPExcel_IOFactory::createReader('Excel2007'); // $objPHPExcel = $objReader->load($xls); На: $objPHPExcel = PHPExcel_IOFactory::load($xls); $xls — tv путь к файлику экселя. И сейчас всё работает.
не нашел решилось это или нет,
предлагаю свой вариант. if($this->getProperty('sm_price')){
$params = $this->getProperty('sm_price');
$q = array();
$q[] = "Product.resource_id = {$this->classKey}.id";
foreach($params as $key=>$p){
$q[] = 'Product.sm_price '.$key.' '.$p;
}
$c->innerJoin('ShopmodxProduct', 'Product', implode(' AND ',$q));
}else{ $c->innerJoin('ShopmodxProduct', 'Product'); } в процессоре web/catalog/category/products/getdata и до вызова процессора {$params["sm_price"] = [">=" => $prices.0, "<=" => $prices.1]}
Да, я так и получал TV, там у меня ошибки именно в PHPExcel. Спасибо.
Завтра у меня по плану немного отвлечься, так что я возьмусь сделать. Сумма не большая, но хочется немного отвлечься, неделя напряженная была. Завтра на почту напишу.