/** * Generate PDF book by category * * @param Zend_Db_Table_Row $category Category * @param int $page Start page number * * @return Zend_Pdf Generated book * * @api */ public function byCategory($category, $page = 1, $except = null, $secondTime = 0, $return_categories = array()) { $this->logger->log('Start to generate new pdf', Zend_Log::INFO); $this->category_page = $page; // переопределяем номер страницы $categories = $this->categoryChilds($category); if ($except) { foreach ($except as $exceptId) { foreach ($categories as $key => $category) { if ($category->id == $exceptId) { unset($categories[$key]); } } } } if ($this->format == 'A4' && $this->print) { $this->margins = array('top' => 49, 'right' => 54, 'bottom' => 34, 'left' => 44); } else { $this->margins = array('top' => 35, 'right' => 40, 'bottom' => 20, 'left' => 30); } if ($page % 2 == 0) { $this->margins = $this->swapMargins($this->margins); } $this->createBook($this->category_page); $this->addPage(false); $productIndexModel = new Model_DbTable_ProductIndex(); $this->sideIconActive = $category->findTopParent()->id; $i = 0; //счетчик категорий $count_category = 0; //счетчик категорий в которых есть товары $flag = 0; $old_category = array(); //списко категорий которые уже были отрендарины $pat = 0; //счетчик частей категорий foreach ($categories as $category) { $continue = false; $this->logger->log('$return_categories =' . count($return_categories), Zend_Log::INFO); foreach ($return_categories as $cat) { if ($category->id == $cat) { //проверка на то что категория уже была $continue = true; break; } } if ($continue) { //если категория уже была проскакиваем ее continue; } $this->logger->log('Generate subcategory (id:' . $category->id . ', ' . $i . ' from ' . count($categories) . ')', Zend_Log::INFO); $products = $category->findManyToManyRowset("Model_DbTable_Products", "Model_DbTable_CategoryXref"); $firstCPage = array(); $count_exceptions = 0; foreach ($products as $key => $product) { $exceptIt = false; if (!is_null($this->exceptionProductList)) { foreach ($this->exceptionProductList as $exceptProduct) { if ($product->id === $exceptProduct) { $count_exceptions++; $exceptIt = true; break; } } } if (!$exceptIt && !is_null($product)) { $this->logger->log('Generate product (' . $product->id . ')', Zend_Log::INFO); $this->byProduct($product, true); // add product index $row = $productIndexModel->createRow(); $row->product_id = $product->id; $row->page = $this->product_page; $firstCPage[] = $this->product_page; $row->save(); } } if (count($products) <= $count_exceptions || count($products) == 0) { $this->logger->log('Not products in ' . $category->id . ' categories', Zend_Log::INFO); //если товаров в категории нет пропускаем ее счет } else { $curCategory = $category->getParent(2); if (isset($curCategory->id)) { $this->addCategoryToIndex($curCategory->id, $firstCPage[0], 2); } $count_category++; $old_category[] = $category->id; //записываем id категории которую мы уже отрисовали } ++$i; //проверяем на то что это не счет страниц и разделяем информацию на части, по 10 категорий if ($count_category != $flag && $count_category % 20 == 0 && $secondTime == 1) { $flag = $count_category; $this->logger->log('Save pat - ' . $pat, Zend_Log::INFO); $pat++; $this->finishBook(); $saveFilename = str_repeat("0", 4 - strlen($this->category_page)) . $this->category_page . '-' . ($this->category_page + count($this->book->pages) - 1) . '.pdf'; $this->logger->log($saveFilename, Zend_Log::INFO); $this->book->save(APPLICATION_ROOT . '/files/pdf/book/' . $saveFilename); $this->byCategory($category, count($this->book->pages) + $this->category_page, $except, 1, $old_category); } } //если прошли все интерации и $i равна количеству категорий то возвращаем категорию. if ($i == count($categories)) { $this->logger->log('Finishing...', Zend_Log::INFO); $this->finishBook(); $this->book->end_pages = $this->category_page; return $this->book; } }