+1

Ampliando as possibilidades do PHP com componentes COM

criado por Daniel Melo em 29/09/2002 11:15pm
No exemplo anterior utilizamos serviços do componene ADO DB. Isto aconteceu porque o componente estava instalado e registrado no computador do servidor web. O componente ADO DB acompanha softwares como Microsoft Access, NT Option Pack, PWs (Personal Web Server), IIS 5.0 e talvez outros softwares. Se você não tiver instalado algum destes softwares no computador do servidor web, o exemplo anterior não vai funcionar!

Nota : Você pode baixar o componente ADO DB separadamente no site da Microsoft.

Provavelmente existem dezenas de componentes COM instalados em seu computador, prontos para serem utilizados. Se voce tem o Microsoft Office, voce pode utilizar muitas funcionalidades do Word, Excel, PowerPoint & Cia.

Vamos examinar um exemplo em que utilizamos o componente ADO DB e o componente Word. Lembrando que você precisa ter o Microsoft Word instalado no computador do servidor web, para este exemplo funcionar.

<?php
$Conexao = new COM("ADODB.Connection"); // Instância do componente ADO
$appWord = new COM("Word.Application"); // Instância do componente Word

$Conexao->Open("testecom"); // Abre conexao com o alias ODBC 

$RecordSet = $Conexao->execute("SELECT * FROM exemplo");

$appWord->Visible = 0; // Diz que o Word deve fazer o trabalho dele sem estar visível
$appWord->Documents->Add(); // Adiciona um documento

$appWord->Selection->Font->Size = 14;
$appWord->Selection->Font->Name = "Verdana"; // Seta propriedades de um trecho de texto

$appWord->Selection->InsertAfter("Conteúdo da Tabela Exemplo".Chr(13)); // Adiciona um texto, a função Chr() do PHP retorna o caractere número 13, que é o caractere "enter".

while (!$RecordSet->EOF) {
    $linha = $RecordSet->fields['nome']->value;
    $appWord->Selection->InsertAfter($linha.Chr(13)); // Corre a tabela adicionando o campo nome no documento Word
    $RecordSet->movenext();
}

$Conexao->Close(); // Fecha a conexão ADO
  
$appWord->Documents[1]->SaveAs("c:\\diretorio\\teste.doc"); // Salva o documento.

$appWord->Quit(); // Encerra a atividade do Word
?>

Este exemplo gera um documento Word chamado teste.doc, com os dados do campo "nome" da tabela "exemplo". Note que quem gera o documento é o próprio software Word, que foi contruído como um executável ActiveX ou COM. O componente Word oferece MUITOS serviços. Para saber quais classes e métodos o Word oferece em sua Type Library, faça o seguinte : Abra o Editor Visual Basic dentro do Word com ALT-F11. Neste editor abra o Object Inspector com F2. Você vai poder ver todas classes e métodos que ele oferece para outras aplicações.

Realmente a gama de serviços que pode ser adicionada a scripts PHP é muito grande. Que tal gerar páginas HTML com o conteúdo de documentos Word dinâmicamente? Possível. Que tal gerar uma planilha Excel com gráficos dinâmicamente e mostrar no Browser do usuário? Possível.

Outra grande extensão que podemos dar a aplicações PHP é a possibilidade de construir componentes COM de negócio, e organizar nosso projeto.

Comentários:

Mostrando 1 - 10 de 18 comentários
Tenho uma aplicação em PHP rodando em servidor linux, entretanto preciso em determinado momento, fazer um upload de um MDB, direto da maquina do usuario que esta em ambiente windows e inseri-lo no mysql que esta em servidor linux. É possivel fazer isso?
13/03/2006 4:09am (~18 anos atrás)

José Walter disse:
Tenho lido diversos artigos de exportação de dados do MySql+PHP para aplicativos Microsoft... alguém pode me informar como fazer esta exportação para planilhas e textos do OpenOffice?
05/02/2005 11:45pm (~19 anos atrás)

O PHP4 suporta CORBA, basta baixar a extensão Universe em http://universe-phpext.sourceforge.net. Esta extensão funciona muito bem.
O PHP5 ainda não suporta CORBA, mas estou criando uma extensão CORBA para PHP5. Você pode verificar em http://phporb.sourceforge.net.
17/01/2005 6:50am (~19 anos atrás)

Valmirez disse:
Acho que o ASP é 100% compatível
ao suporte COM porque é nativo da plataforma
17/10/2003 5:31am (~20 anos atrás)

darksaj disse:
assim... eu to migrando um site d asp para php.
para fazer a conecção com o banco de dados eu preciso usar o php d um servidor linux, mas o banco de dados é access.
eu usava a classe COM, mas n estava dando certo pq essa classe soh funciona em servidores windows!
será q alguem sabe com incluir essa classe no linux, ou c ha alguma outra classe para que eu possa usar???

obrigado!!!
24/07/2003 1:16pm (~21 anos atrás)

Bem,
finalmente consegui!!! Caminhei pelas dicas do Daniel sobre a Classe VARIANT, e após cansativos teste... consegui capturar um valor passado por referencia.
Exemplo: (copie e cole ...)

<?
$Comp = new COM("MeuComponente");

/* Metodo SOMAR

Parametros INPUT: value1, value2: Integer
PArametros OUTPUT: soma: OLEVARIANT; */

/* Sua implementação (em Delphi) segue abaixo:
Soma := 'O valor da soma é : IntToStr((Value1 + Value2)); */

/* Podemos passar os parametros de input tanto desta forma: */
$Value1 = new Variant(8, VT_INT);
$Value2 = new Variant(1000, VT_INT);
/* Como desta: */
$Value1 = 8;
$Value2 = 1000;
/* Que Funciona corretamente; */

/* Passa-se o Parametro de OUTPUT assim: */
$soma = new Variant;

/* Simplesmente isso... vc pode colocar um tipo para este VARIANT como VT_INT,
VT_BSTR, VT_VARIANT e funciona também. Por isso, realizei o teste sem passar
nenhum tipo e funcionou tb! ;) */

/* Feito isso, é só executar o método */

$Comp->Somar($Value1, $Value2, $soma);

/* E escrever na tela o valor de $soma...*/

echo $soma->value;

/* O Resultado mostrado na tela é :

O valor da soma é : 1008 */
?>

Prontinho... A grande sacada é o configurar o parametro de OUTPUT no seu componente como:
"OLEVARIANT".

Espero que seja util pra vcs...

Obrigado!!! Valeu a "luz" do Daniel e muito!!!! ehehehehe

Falow!!!

João Paulo Souza (JPSouza) - "A perfeição pode ser utópica, porém, deve ser uma tendência."
09/01/2003 3:35pm (~21 anos atrás)

Daniel,
valeu a dica... Mas até agora só o que recebo é "Warning: Invoke() failed: Tipo não correspondente". E olha que já fiz diversos testes alterando o tipo do VARIANT tanto no PHP como no componente COM. E sempre é isso... :(
Vou tentar mais... se conhecer alguem que já tenha passado por isso e conseguiu solução... me avise por favor...
E para outros que queiram me ajudar... agradeco desde já... Esta parece ser uma questao complicada... nao???

Falow
09/01/2003 1:21pm (~21 anos atrás)

Daniel Melo disse:
Eu já li que existe uma forma, mas eu confesso que pessoalmente nunca testei.

Se funcionar poste uma mensagem...

Se voce quiser passar um parametro por referencia para um componente COM, e necessario que a variavel seja do tipo Variant.

Como nao existe este tipo no PHP, existe uma classe Variant, para representar este tipo de dado.

O exemplo seria o seguinte:

$soma = new VARIANT(0, VI_4|VT_BYREF);
...
$comp->Somar(1,2,$soma);

O resultado estaria em : $soma->value;

VI_4 é uma constante que diz que a variável espera um inteiro de 4 bytes. Voce tem que ver na interface de seu componente, qual o tipo de dado que ele vai retornar e usar a constante adequada, senao pode dar type mismatch.

A lista das constantes voce encontra no manual PHP :

http://www.php.net/manual/en/class.variant.php

Saudacoes,

Daniel
03/01/2003 8:08pm (~21 anos atrás)

Valeu, então meus planos acho que foram por água abaixo...hehe...

Mas olha só, agora não tem muito a ver com o PHP, o excel consegue se conectar em um servidor com MySQL usando VB? Acho que sim né...

Não tem jeito mesmo, vou ter que aprender um pouco de VB.
28/11/2002 8:53pm (~21 anos atrás)

Daniel Melo disse:
A maquina que é o servidor WEB tem que SER obrigatoriamente Windows e ter o Excel instalado.

A maquina quem tem o arquivo Excel pode ser ate Linux. Basta o servidor Windows acessar uma pasta compartilhada no servidor Linux.
26/11/2002 3:40pm (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)