Пример #1
0
 /**
  * Write slide relationships to XML format
  *
  * @param  PHPPowerPoint_Slide $pSlide
  * @return string              XML Output
  * @throws Exception
  */
 public function writeSlideRelationships(PHPPowerPoint_Slide $pSlide = null)
 {
     // Create XML writer
     $objWriter = null;
     if ($this->getParentWriter()->getUseDiskCaching()) {
         $objWriter = new PHPPowerPoint_Shared_XMLWriter(PHPPowerPoint_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
     } else {
         $objWriter = new PHPPowerPoint_Shared_XMLWriter(PHPPowerPoint_Shared_XMLWriter::STORAGE_MEMORY);
     }
     // XML header
     $objWriter->startDocument('1.0', 'UTF-8', 'yes');
     // Relationships
     $objWriter->startElement('Relationships');
     $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/package/2006/relationships');
     // Starting relation id
     $relId = 1;
     // Write slideLayout relationship
     $layoutPack = $this->getParentWriter()->getLayoutPack();
     $layoutIndex = $layoutPack->findlayoutIndex($pSlide->getSlideLayout(), $pSlide->getSlideMasterId());
     $this->_writeRelationship($objWriter, $relId++, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout', '../slideLayouts/slideLayout' . ($layoutIndex + 1) . '.xml');
     // Write drawing relationships?
     if ($pSlide->getShapeCollection()->count() > 0) {
         // Loop trough images and write relationships
         $iterator = $pSlide->getShapeCollection()->getIterator();
         while ($iterator->valid()) {
             if ($iterator->current() instanceof PHPPowerPoint_Shape_Drawing || $iterator->current() instanceof PHPPowerPoint_Shape_MemoryDrawing) {
                 // Write relationship for image drawing
                 $this->_writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/image', '../media/' . str_replace(' ', '_', $iterator->current()->getIndexedFilename()));
                 $iterator->current()->__relationId = 'rId' . $relId;
                 ++$relId;
             } elseif ($iterator->current() instanceof PHPPowerPoint_Shape_Chart) {
                 // Write relationship for chart drawing
                 $this->_writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart', '../charts/' . $iterator->current()->getIndexedFilename());
                 $iterator->current()->__relationId = 'rId' . $relId;
                 ++$relId;
             }
             $iterator->next();
         }
     }
     // Write hyperlink relationships?
     if ($pSlide->getShapeCollection()->count() > 0) {
         // Loop trough hyperlinks and write relationships
         $iterator = $pSlide->getShapeCollection()->getIterator();
         while ($iterator->valid()) {
             // Hyperlink on shape
             if ($iterator->current()->hasHyperlink()) {
                 // Write relationship for hyperlink
                 $hyperlink = $iterator->current()->getHyperlink();
                 $hyperlink->__relationId = 'rId' . $relId;
                 if (!$hyperlink->isInternal()) {
                     $this->_writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', $hyperlink->getUrl(), 'External');
                 } else {
                     $this->_writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide', 'slide' . $hyperlink->getSlideNumber() . '.xml');
                 }
                 ++$relId;
             }
             // Hyperlink on rich text run
             if ($iterator->current() instanceof PHPPowerPoint_Shape_RichText) {
                 foreach ($iterator->current()->getParagraphs() as $paragraph) {
                     foreach ($paragraph->getRichTextElements() as $element) {
                         if ($element instanceof PHPPowerPoint_Shape_RichText_Run || $element instanceof PHPPowerPoint_Shape_RichText_TextElement) {
                             if ($element->hasHyperlink()) {
                                 // Write relationship for hyperlink
                                 $hyperlink = $element->getHyperlink();
                                 $hyperlink->__relationId = 'rId' . $relId;
                                 if (!$hyperlink->isInternal()) {
                                     $this->_writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', $hyperlink->getUrl(), 'External');
                                 } else {
                                     $this->_writeRelationship($objWriter, $relId, 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide', 'slide' . $hyperlink->getSlideNumber() . '.xml');
                                 }
                                 ++$relId;
                             }
                         }
                     }
                 }
             }
             $iterator->next();
         }
     }
     $objWriter->endElement();
     // Return
     return $objWriter->getData();
 }