Separating the controller and the view

Nov 26, 2013 at 9:45 AM
Hi there,

I am using CodeIgnitor and PHPWord for an application that outputs a few reports.

Everything is working well but I realise that I am not strictly following the MVC pattern as when I am using PHPWord to output a report, the content of the word document is being added in the controller when it should be the view.

Here is the code for the function outputting the word report. It is within the reports controller fiel: reports.php

So if I understand correctly all the calls to the addText() function should be made from the view file, is that correct? Any tips on how to move these calls into a "view"?
function print_inspection_word() {
                $this->load->model('report_model');
                $data['buildingdetails'] = $this->report_model->getBuildingDetails($this->uri->segment(3),$this->uri->segment(4),$this->uri->segment(5),$this->uri->segment(6));
                $data['buildinghazards'] = $this->report_model->getBuildingHazards($this->uri->segment(5));
                $companyName = "";
                foreach($data['buildingdetails'] as $detail){
                    $companyName = $detail->company;
                }

                $this->load->model('group_model');
                $data['company_types'] = $this->group_model->getCompany_type();
                $data['countries'] = $this->group_model->getCountries();
                
                $this->load->model('hazard_model');
                $data['hazard_levels'] = $this->hazard_model->getHazardLevels();
                
                $data['load_header'] = false;
                $data['load_footer'] = false;
                $data['main_content'] = 'print_inspection';
                $data['message'] = "";
                $data['message_type'] = "";
                $data['page_title'] = "Building Inspection Report";
                $data['body_class'] = "reports";

                //our docx will have 'lanscape' paper orientation
                $section = $this->word->createSection(array('orientation'=>'portrait'));
                // Add text elements
                $section->addText("");
                // Define table style arrays
                //$styleTable = array('borderSize'=>0, 'borderColor'=>'000000', 'cellMargin'=>80);
                $styleTable = array();
                //$styleFirstRow = array('borderBottomSize'=>18, 'borderBottomColor'=>'0000FF', 'bgColor'=>'66BBFF');
                
                // Define cell style arrays
                $styleCell = array('valign'=>'center');
                $styleCellBTLR = array('valign'=>'center', 'textDirection'=>PHPWord_Style_Cell::TEXT_DIR_BTLR);
 
                // Define font style for first row
                $fontStyle = array('bold'=>true, 'align'=>'center');
                $frontPageFontStyle = array('bold'=>false, 'size'=>18, 'align'=>'center');
                $headingFontStyle = array('bold'=>true, 'size'=>18, 'align'=>'center');
                $subHeadingFontStyle = array('bold'=>true, 'underline'=> PHPWord_Style_Font::UNDERLINE_SINGLE, 'align'=>'center');
                // Add table style
                $this->word->addTableStyle('myOwnTableStyle', $styleTable);
                foreach($data['buildingdetails'] as $detail){
                    $companyType = '';
                    foreach($data['company_types'] as $type) {
                        if($type->id == $detail->company_type) {
                            $companyType =  $type->company_type;
                        }
                    }
                    $countryName = '';
                    foreach($data['countries'] as $country) {
                        if($country->id == $detail->country) {
                            $countryName =  $country->name;
                        }
                    }
                    $constructionDate = date( 'F', mktime(0, 0, 0, $detail->month_contructed) )." ".$detail->year_constructed;
                    $inspectionResult = '';
                    if($detail->status == 1) {
                         $inspectionResult =  "Pass";
                    } 
                    else {
                         $inspectionResult =  "Fail";
                    }
                    
                    $section->addText($detail->buildingname, $headingFontStyle);
                    $section->addText("",$fontStyle);
                    $section->addText("Company Details",$subHeadingFontStyle);
                    $section->addText('Company/Owner Name: ', $fontStyle);
                    $section->addText($detail->company);
                    $section->addText('Company Type: ', $fontStyle);
                    $section->addText($companyType);
                    $section->addText('Address: ', $fontStyle);
                    $section->addText($detail->address_line_1);
                    if($detail->address_line_2 != ""){
                        $section->addText($detail->address_line_2);
                    }
                    $section->addText('Suburb: ', $fontStyle);
                    $section->addText($detail->suburb);
                    $section->addText('City: ', $fontStyle);
                    $section->addText($detail->city);
                    $section->addText('Country: ', $fontStyle);
                    $section->addText($countryName); 
                    $section->addText('Phone: ', $fontStyle);
                    $section->addText($detail->phone);
                    $section->addText('E Mail: ', $fontStyle);
                    $section->addText($detail->email);
                    $section->addText("",$fontStyle);
$filename='report.docx'; //save our document as this file name
                header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); //mime type
                header('Content-Disposition: attachment;filename="'.$filename.'"'); //tell browser what's the file name
                header('Cache-Control: max-age=0'); //no cache
                $objWriter = PHPWord_IOFactory::createWriter($this->word, 'Word2007');
                $objWriter->save('php://output');

                exit;
}