Location: PHPKode > scripts > Zend Framework Data Grid > zend-framework-data-grid/Bvb/Grid/Deploy/Wordx.php
<?php



/**
 * Mascker
 *
 * LICENSE
 *
 * This source file is subject to the GNU General Public License 2.0
 * It is  available through the world-wide-web at this URL:
 * http://www.opensource.org/licenses/gpl-2.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to hide@address.com so we can send you a copy immediately.
 *
 * @package    Mascker_Grid
 * @copyright  Copyright (c) Mascker (http://www.petala-azul.com)
 * @license    http://www.opensource.org/licenses/gpl-2.0.php   GNU General Public License 2.0
 * @version    0.1  mascker 
 * @author     Mascker (Bento Vilas Boas) <hide@address.com > 
 */
class Bvb_Grid_Deploy_Wordx extends Bvb_Grid_DataGrid
{

    
    public $templateInfo;

    public $title;

    protected $options = array ();

    public $wordInfo;

    public $style;

    public $dir;

    private $inicialDir;

    protected $templateDir;

    protected $output = 'wordx';


    function __construct($db, $title, $dir, $options = array('download'))
    {

        
        if (! in_array ( 'wordx', $this->export ))
        {
            echo $this->__ ( "You dont' have permission to export the results to this format" );
            die ();
        }
        
        $this->dir = rtrim ( $dir, "/" ) . "/";
        $this->title = $title;
        $this->options = $options;
        $this->inicialDir = $this->dir;
        

        parent::__construct ( $db );
        
        if (! $this->temp ['wordx'] instanceof Bvb_Grid_Template_Wordx_Wordx)
        {
            $this->setTemplate ( 'wordx', 'wordx' );
        }
    
    }


    /**
     * [Para podemros utiliza]
     *
     * @param string $var
     * @param string $value
     */
    
    function __set($var, $value)
    {

        parent::__set ( $var, $value );
    }


    /**
     * [PT] Fazer o scan recursivo dos dir
     *
     * @param string $directory
     * @param unknown_type $filter
     * @return unknown
     */
    function scan_directory_recursively($directory, $filter = FALSE)
    {

        // if the path has a slash at the end we remove it here
        $directory = rtrim ( $directory, '/' );
        

        // if the path is not valid or is not a directory ...
        if (! file_exists ( $directory ) || ! is_dir ( $directory ))
        {
            // ... we return false and exit the function
            return FALSE;
            
        // ... else if the path is readable
        } elseif (is_readable ( $directory ))
        {
            // we open the directory
            $directory_list = opendir ( $directory );
            
            // and scan through the items inside
            while ( FALSE !== ($file = readdir ( $directory_list )) )
            {
                // if the filepointer is not the current directory
                // or the parent directory
                if ($file != '.' && $file != '..' && $file != '.DS_Store')
                {
                    // we build the new path to scan
                    $path = $directory . '/' . $file;
                    
                    // if the path is readable
                    if (is_readable ( $path ))
                    {
                        // we split the new path by directories
                        $subdirectories = explode ( '/', $path );
                        
                        // if the new path is a directory
                        if (is_dir ( $path ))
                        {
                            // add the directory details to the file list
                            $directory_tree [] = array ('path' => $path . '|', 

                            // we scan the new path by calling this function
                            'content' => $this->scan_directory_recursively ( $path, $filter ) );
                            
                        // if the new path is a file
                        } elseif (is_file ( $path ))
                        {
                            // get the file extension by taking everything after the last dot
                            $extension = end ( explode ( '.', end ( $subdirectories ) ) );
                            
                            // if there is no filter set or the filter is set and matches
                            if ($filter === FALSE || $filter == $extension)
                            {
                                // add the file details to the file list
                                $directory_tree [] = array ('path' => $path . '|', 'name' => end ( $subdirectories ) );
                            }
                        }
                    }
                }
            }
            // close the directory
            closedir ( $directory_list );
            
            // return file list
            return $directory_tree;
            
        // if the path is not readable ...
        } else
        {
            // ... we return false
            return FALSE;
        }
    }


    // ------------------------------------------------------------
    


    /**
     * [PT] Remove direcotiros e subdirectorios
     *
     * @param string $dir
     */
    
    function deldir($dir)
    {

        $current_dir = @opendir ( $dir );
        while ( $entryname = @readdir ( $current_dir ) )
        {
            if (is_dir ( $dir . '/' . $entryname ) and ($entryname != "." and $entryname != ".."))
            {
                $this->deldir ( $dir . '/' . $entryname );
            } elseif ($entryname != "." and $entryname != "..")
            {
                @unlink ( $dir . '/' . $entryname );
            }
        }
        @closedir ( $current_dir );
        @rmdir ( $dir );
    }


    /**
     * [PT] Ir buscar os caminhos para depois zipar
     *
     * @param unknown_type $dirs
     * @return unknown
     */
    function zipPaths($dirs)
    {

        foreach ( $dirs as $key => $value )
        {
            if (! is_array ( @$value ['content'] ))
            {
                @$file .= $value ['path'];
            } else
            {
                @$file .= $this->zipPaths ( $value ['content'] );
            }
        }
        return $file;
    }


    /**
     * [PT] TEMOS que copiar os directórtio para a  loalização final
     *
     * @param unknown_type $source
     * @param unknown_type $dest
     * @return unknown
     */
    function copyDir($source, $dest)
    {

        // Se for ficheiro
        if (is_file ( $source ))
        {
            $c = copy ( $source, $dest );
            chmod ( $dest, 0777 );
            return $c;
        }
        
        // criar directorio de destino
        if (! is_dir ( $dest ))
        {
            mkdir ( $dest, 0777, 1 );
        }
        
        // Loop
        $dir = dir ( $source );
        while ( false !== $entry = $dir->read () )
        {
            
            if ($entry == '.' || $entry == '..' || $entry == '.svn')
            {
                continue;
            }
            
            // copiar directorios
            if ($dest !== "$source/$entry")
            {
                $this->copyDir ( "$source/$entry", "$dest/$entry" );
            }
        }
        
        // sair
        $dir->close ();
        return true;
    
    }


    function deploy()
    {

        $this->setPagination ( 0 );
        
        parent::deploy ();
        

        if (! $this->temp ['wordx'] instanceof Bvb_Grid_Template_Wordx_Wordx)
        {
            $this->setTemplate ( 'wordx', 'wordx' );
        }
        
        $this->templateInfo = $this->temp ['wordx']->templateInfo;
        
        $this->templateDir = explode ( '/', $this->templateInfo ['dir'] );
        array_pop ( $this->templateDir );
        
        $this->templateDir = ucfirst ( end ( $this->templateDir ) );
        
        $this->wordInfo = $this->temp ['wordx']->info ();
        
        $this->dir = rtrim ( $this->dir, '/' ) . '/' . ucfirst ( $this->templateInfo ['name'] ) . '/';
        
        $pathTemplate = rtrim ( $this->libraryDir, '/' ) . '/' . substr ( $this->templateInfo ['dir'], 0, - 4 ) . '/';
        

        $this->deldir ( $this->dir );
        
        $this->copyDir ( $pathTemplate, $this->dir );
        
        $xml = $this->temp ['wordx']->globalStart ();
        

        $titles = parent::buildTitles ();
        
        #$nome = reset ( $titles );
        $wsData = parent::buildGrid ();
        $sql = parent::buildSqlExp ();
        

        /////////////////////////
        /////////////////////////
        


        #O HEADER
        


        if (file_exists ( $this->wordInfo ['logo'] ))
        {
            
            copy ( $this->wordInfo ['logo'], $this->dir . 'word/media/' . end ( explode ( "/", $this->wordInfo ['logo'] ) ) );
            

            $logo = $this->temp ['wordx']->logo ();
            

            file_put_contents ( $this->dir . "word/_rels/header1.xml.rels", $logo );
            

            $header = str_replace ( array ('{{title}}', '{{subtitle}}' ), array ($this->wordInfo ['title'], $this->wordInfo ['subtitle'] ), $this->temp ['wordx']->header () );
        

        } else
        {
            
            $header = str_replace ( array ('{{title}}', '{{subtitle}}' ), array ($this->wordInfo ['title'], $this->wordInfo ['subtitle'] ), $this->temp ['wordx']->header () );
        
        }
        
        file_put_contents ( $this->dir . "word/header1.xml", $header );
        

        /////////////////////////
        /////////////////////////
        


        #END HEADER
        


        #BEGIN FOOTER
        $footer = str_replace ( "{{value}}", $this->wordInfo ['footer'], $this->temp ['wordx']->footer () );
        

        file_put_contents ( $this->dir . "word/footer2.xml", $footer );
        
        #END footer
        


        #START DOCUMENT.XML
        


        $xml = $this->temp ['wordx']->globalStart ();
        
        $xml .= $this->temp ['wordx']->titlesStart ();
        
        foreach ( $titles as $value )
        {
            
            if ((@$value ['field'] != @$this->info ['hRow'] ['field'] && @$this->info ['hRow'] ['title'] != '') || @$this->info ['hRow'] ['title'] == '')
            {
                

                $xml .= str_replace ( "{{value}}", $value ['value'], $this->temp ['wordx']->titlesLoop () );
            
            }
        }
        $xml .= $this->temp ['wordx']->titlesEnd ();
        
        if (is_array ( $wsData ))
        {
            
            /////////////////
            /////////////////
            /////////////////
            if (@$this->info ['hRow'] ['title'] != '')
            {
                $bar = $wsData;
                
                $hbar = trim ( $this->info ['hRow'] ['field'] );
                
                $p = 0;
                foreach ( $wsData [0] as $value )
                {
                    if ($value ['field'] == $hbar)
                    {
                        $hRowIndex = $p;
                    }
                    
                    $p ++;
                }
                $aa = 0;
            }
            
            //////////////
            //////////////
            //////////////
            


            $i = 1;
            $aa = 0;
            foreach ( $wsData as $row )
            {
                
                ////////////
                ////////////
                //A linha horizontal
                if (@$this->info ['hRow'] ['title'] != '')
                {
                    
                    if (@$bar [$aa] [$hRowIndex] ['value'] != @$bar [$aa - 1] [$hRowIndex] ['value'])
                    {
                        
                        $xml .= str_replace ( "{{value}}", @$bar [$aa] [$hRowIndex] ['value'], $this->temp ['wordx']->hRow () );
                    
                    }
                }
                
                ////////////
                ////////////
                


                $xml .= $this->temp ['wordx']->loopStart ();
                
                $a = 1;
                
                foreach ( $row as $value )
                {
                    
                    $value ['value'] = strip_tags ( $value ['value'] );
                    
                    if ((@$value ['field'] != @$this->info ['hRow'] ['field'] && @$this->info ['hRow'] ['title'] != '') || @$this->info ['hRow'] ['title'] == '')
                    {
                        
                        $xml .= str_replace ( "{{value}}", $value ['value'], $this->temp ['wordx']->loopLoop () );
                    
                    }
                    $a ++;
                
                }
                $xml .= $this->temp ['wordx']->loopEnd ();
                $aa ++;
                $i ++;
            }
        }
        

        if (is_array ( $sql ))
        {
            $xml .= $this->temp ['wordx']->sqlExpStart ();
            foreach ( $sql as $value )
            {
                $xml .= str_replace ( "{{value}}", $value ['value'], $this->temp ['wordx']->sqlExpLoop () );
            }
            $xml .= $this->temp ['wordx']->sqlExpEnd ();
        }
        
        $xml .= $this->temp ['wordx']->globalEnd ();
        

        file_put_contents ( $this->dir . "word/document.xml", $xml );
        
        $final = $this->scan_directory_recursively ( $this->dir );
        $f = explode ( '|', $this->zipPaths ( $final ) );
        array_pop ( $f );
        

        $this->title = strlen ( $this->title ) > 0 ? $this->title : 'Word Document';
        
        $zip = new ZipArchive ( );
        $filename = $this->dir . $this->title . ".zip";
        
        if ($zip->open ( $filename, ZIPARCHIVE::CREATE ) !== TRUE)
        {
            exit ( "cannot open <$filename>\n" );
        }
        
        foreach ( $f as $value )
        {
            $zip->addFile ( $value, str_replace ( $this->dir, '', $value ) );
        }
        
        $zip->close ();
        

        rename ( $filename, $this->inicialDir . $this->title . '.docx' );
        

        if (in_array ( 'download', $this->options ))
        {
            header ( 'Content-type: application/word' );
            header ( 'Content-Disposition: attachment; filename="' . $this->title . '.docx"' );
            readfile ( $this->inicialDir . $this->title . '.docx' );
        }
        
        if (! in_array ( 'save', $this->options ))
        {
            unlink ( $this->inicialDir . $this->title . '.docx' );
        }
        
        $this->deldir ( $this->dir );
        
        die ();
    }

}




Return current item: Zend Framework Data Grid