Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dead_thinker

Zend Framework e SQL Server

Recommended Posts

Galera, alguem ai já colocou o Zend Framework pra funcionar legal com o SQL Server? To precisando passar uma app de Delphi e MSSQL pra php e queria usar o Zend, mas ta f*** de achar algo na net... :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza cara, agradeço a resposta.Mas eu ja fiz isso hehe, já penei na documentação, google, blogs, irc, etc.Mas resolvi fazer na marra, debuguei a fundo as classes do zend e verifiquei onde estava dando erro, infelizmente, pra resolver meu problema alterei diretamente as classes do Zend Framework.Depois vou elaborar um "tutorial" de como fazer isso e postar no meu blog :DObrigado de toda forma. :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

então,

o recomendado é, se a classe esta dando erro, ou voce queira adaptar a mesma para suas necessidades, voce deve criar a sua classe extendendo-a da classe que sofrerá a alteração, e salvar a sua classe dentro da sua lib.

 

por exemplo, eu quero modificar a classe de Action (Zend_Controller_Action)

Eu devo primeiramente criar uma pasta, dentro da pasta library.

Geralmente esta pasta recebe o nome da empresa ou qualquer outra identificacao

/Zend Zend.php /Advantage 'Nome ficticio da empresa em que trabalho

e dentro da Advantage utilizar a mesma estrutura de arquivos do esquema zend, ou seja, criar outra pasta chamada "controller". Então, teríamos

 

/Advantage  /Controller	Action.php

E por fim, criar a minha classe:

 

Advantage_Controller_Action extends Zend_Controller_Action

Compartilhar este post


Link para o post
Compartilhar em outros sites

É isso mesmo colega, essa é a forma ideal, mas como de certa forma as classes são "bem baixo nível", acho que não será tão fácil, mas vou tentar.Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, precisarei especializar/herdar a classe de conexão do MSSQL, o Db.php devido ao caminho fixo das classes de PDO que o zend colocou, e o Abstract.php hehe, do qual o MSSQL herda. Ainda não parei pra fazer mas quando tiver feito coloco aqui a resolução :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao, esse é o esquema de estrutura de arquivos da zend ...voce pode optar por fazer do jeito profiça e manter o esquema, ou pode fazer do jeito amador ..abrass!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpem a demora pra postar, já estou trabalhando com o Zend Framework e o MSSQL desde que postei a ultima vez, mas faltou um detalhe, que abaixo descrevo-lhes.

 

Cá estou eu novamente, eu ja tinha vontade, e com a força do amigo Void, decidi por herdar as classes do Zend e alterar para as minhas necessidades (Fazer do modo "certo" - fazer o ZendFramework funcionar com o MS SQL Server), mas surgiu um problema.

 

Identifiquei o problema, e as alterações necessárias se dariam em 3 classes:

- Zend_Db

- Zend_Db_Adapter_Pdo_Mssql

- Zend_Db_Adapter_Abstract

 

Criei minhas classes e fiz a herança das originais, até ai tudo bem, o problema foi que quando herdei o Zend_Db_Adapter_Abstract ocorria outro problema, cuja fonte não consegui identificar, e peço a ajuda de vocês. Abaixo seguem as alterações feitas nas classes especializadas e o que falta pra implementar as especializações da "forma correta" como o amigo Void sugeriu.

 

Classe Personalizadas_Db (especialização de Zend_Db)

<?php/** * Especialização da classe do Zend Framework, devido a um  * problema na sua utilização, foi-se feita essa especialização. *  * As alterações feitas foram: *      1 - No método "factory", no código da linha 167 (no arquivo original), * 			o "path" para a classe a ser criada estava fisicamente "amarrado", * 			alterei para poder ser usado o Mssql especializado. *  * @author Arian Maykon de Araújo Diógenes (arian.maykon at gmail dot com) * @since 1.0 - 06/05/2007 *//** * Carrega a classe a ser herdada, Zend_Db */Zend_Loader::loadClass('Zend_Db');/** * Class for connecting to SQL databases and performing common operations. * * @category   Zend * @package    Zend_Db * @copyright  Copyright © 2005-2007 Zend Technologies USA Inc. (http://www.zend.com) * @license    [url="http://framework.zend.com/license/new-bsd"]http://framework.zend.com/license/new-bsd[/url]     New BSD License */class Personalizadas_Db extends Zend_Db {    /**     * Factory for Zend_Db_Adapter_Abstract classes.     *     * Additional keys are processed as key-value pairs for the adapter config array.     *     * @param string $adapterName   Name of the adapter to return:     *                              'pdo_mysql' -> Zend_Db_Adapter_Pdo_Mysql     *     * @param array  $config        OPTIONAL; an array of adapter configuration keys.     *     * @return Zend_Db_Adapter_Abstract     * @throws Zend_Db_Exception     */    public static function factory($adapterName, $config = array())    {        if (!is_string($adapterName) or !strlen($adapterName)) {            throw new Zend_Db_Exception('Adapter name must be specified in a string.');        }        if (!is_array($config)) {            throw new Zend_Db_Exception('Configuration must be an array.');        }        $adapterName = strtolower($adapterName); // normalize input        // Código Original:$adapterName = 'Zend_Db_Adapter_' . str_replace(' ', '_' , ucwords(str_replace('_', ' ', $adapterName)));        $adapterName = str_replace(' ', '_' , ucwords(str_replace('_', ' ', $adapterName)));        Zend_Loader::loadClass($adapterName);        return new $adapterName($config);    }}

Classe Personalizadas_Mssql (especialização de Zend_Db_Adapter_Pdo_Mssql)

<?php/** * Especialização da classe de conexão com o MSSQL do Zend Framework, * devido a um problema na sua utilização, foi-se feita essa especialização. *  * As alterações feitas foram: *      1 - No método "describeTable", no if da linha 136 (no arquivo original,  * 			nesse arquivo, fica na linha 83)  * 			"if (array_key_exists($primaryKeyColumn, $row['column_name'])) {",  * 			a ordem dos parâmetros está errada, inverti, ficando  * 			"if (array_key_exists($row['column_name'], $primaryKeyColumn)) {". *      2 - No método "describeTable", as chaves do array $row, no método  * 			estavam minúsculo, quando colocadas em minúsculo alguns erros  * 			eram consertados. * 		3 - No método "limit", havia um erro no TOP (Melhorar essa descrição :D). *  * @author Arian Maykon de Araújo Diógenes (arian.maykon at gmail dot com) * @since 1.0 - 06/05/2007 *//** * Carrega a classe a ser herdada, Zend_Db_Adapter_Pdo_Mssql */Zend_Loader::loadClass('Zend_Db_Adapter_Pdo_Mssql');/** * Class for connecting to Microsoft SQL Server databases and performing common operations. * * @category   Zend * @package    Zend_Db * @subpackage Adapter * @copyright  Copyright © 2005-2007 Zend Technologies USA Inc. (http://www.zend.com) * @license    [url="http://framework.zend.com/license/new-bsd"]http://framework.zend.com/license/new-bsd[/url]     New BSD License */class Personalizadas_Mssql extends Zend_Db_Adapter_Pdo_Mssql{	/**     * Returns the column descriptions for a table.     *     * The return value is an associative array keyed by the column name,     * as returned by the RDBMS.     *     * The value of each array element is an associative array     * with the following keys:     *     * SCHEMA_NAME      => string; name of database or schema     * TABLE_NAME       => string;     * COLUMN_NAME      => string; column name     * COLUMN_POSITION  => number; ordinal position of column in table     * DATA_TYPE        => string; SQL datatype name of column     * DEFAULT          => string; default expression of column, null if none     * NULLABLE         => boolean; true if column can have nulls     * LENGTH           => number; length of CHAR/VARCHAR     * SCALE            => number; scale of NUMERIC/DECIMAL     * PRECISION        => number; precision of NUMERIC/DECIMAL     * UNSIGNED         => boolean; unsigned property of an integer type     * PRIMARY          => boolean; true if column is part of the primary key     * PRIMARY_POSITION => integer; position of column in primary key     *     * @todo Discover column position.     * @todo Discover integer unsigned property.     *     * @param string $tableName     * @param string $schemaName OPTIONAL     * @return array     */    public function describeTable($tableName, $schemaName = null)    {        $sql = "exec sp_columns @table_name = " . $this->quoteIdentifier($tableName);        $stmt = $this->query($sql);        $result = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);        $sql = "exec sp_pkeys @table_name = " . $this->quoteIdentifier($tableName);        $stmt = $this->query($sql);        $primaryKeysResult = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);        foreach ($primaryKeysResult as $row) {            $primaryKeyColumn[$row['COLUMN_NAME']] = true;        }        $desc = array();        foreach ($result as $key => $row) {            list($type, $rest) = explode(' ', $row['TYPE_NAME'], 2);            if (array_key_exists($row['COLUMN_NAME'], $primaryKeyColumn)) {                $row['IS_PRIMARY'] = true;            }            $desc[$row['COLUMN_NAME']] = array(                'SCHEMA_NAME'      => null,                'TABLE_NAME'       => $row['TABLE_NAME'],                'COLUMN_NAME'      => $row['COLUMN_NAME'],                'COLUMN_POSITION'  => null, // @todo                'DATA_TYPE'        => $type,                'DEFAULT'          => $row['COLUMN_DEF'],                'NULLABLE'         => (bool) $row['NULLABLE'],                'LENGTH'           => $row['LENGTH'],                'SCALE'            => $row['SCALE'],                'PRECISION'        => $row['PRECISION'],                'UNSIGNED'         => null, // @todo                'PRIMARY'          => (bool) $row['IS_PRIMARY'],                'PRIMARY_POSITION' => null // @todo            );        }        return $desc;    }    /**     * Adds an adapter-specific LIMIT clause to the SELECT statement.     *     * @link [url="http://lists.bestpractical.com/pipermail/rt-devel/2005-June/007339.html"]http://lists.bestpractical.com/pipermail/r...une/007339.html[/url]     *     * @param string $sql     * @param integer $count     * @param integer $offset OPTIONAL     * @return string     */     // TODO Maykon: Verificar o limit da nova versão (0.9.3), segundo o changelog foi corrigido     public function limit($sql, $count, $offset = 0)     {        $count = intval($count);        if ($count <= 0) {            throw new Zend_Db_Adapter_Exception("LIMIT argument count=$count is not valid");        }        $offset = intval($offset);        if ($offset < 0) {            throw new Zend_Db_Adapter_Exception("LIMIT argument offset=$offset is not valid");        }        $orderby = stristr($sql, 'ORDER BY');        if ($orderby !== false) {            $sort = (stripos($orderby, 'desc') !== false) ? 'desc' : 'asc';            $order = str_ireplace('ORDER BY', '', $orderby);            $order = trim(preg_replace('/ASC|DESC/i', '', $order));        }        //$sql = preg_replace('/^SELECT\s/i', 'SELECT TOP ' . ($count+$offset) . ' ', $sql);        $sql = preg_replace('/^SELECT DISTINCT\s/i', 'SELECT DISTINCT TOP ' . ($count+$offset) . ' ', $sql);        $sql = 'SELECT * FROM (SELECT TOP ' . $count . ' * FROM (' . $sql . ') AS inner_tbl';        if ($orderby !== false) {            $sql .= ' ORDER BY ' . $order . ' ';            $sql .= (stripos($sort, 'asc') !== false) ? 'DESC' : 'ASC';        }        $sql .= ') AS outer_tbl';        if ($orderby !== false) {            $sql .= ' ORDER BY ' . $order . ' ' . $sort;        }        return $sql;    }}
Essa última alteração é onde ocorre o erro, como não consegui especializar a classe Zend_Db_Adapter_Abstract, para alterar o método necessário (getQuoteIdentifierSymbol), alterei diretamente na classe, mas quero ver com vocês uma solução pra isso.

 

O método que preciso alterar é o "getQuoteIdentifierSymbol", que fica na classe Zend_Db_Adapter_Abstract, linha 589. Como poderei enfim fazer tudo do jeito "profissa"? hehe

Abraços...espero ter deixado bem claro! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esqueci de mencionar, estou utilizando o Zend Framework 0.9.2 Beta, atualmente () está na 0.9.3 Beta, verifiquei se tinha sido solucionado no novo release mas não foi.

 

Dica: quem topar o desafio de checar o problema, pra não ter que implementar tudo do zero, pode baixar o código-fonte de um tutorial e usar o MSSQL com ele, o código se encontra em http://akrabat.com/zend-framework-tutorial/.

 

Caso prefira, também posso passar as alterações que fiz. Pode me contactar nos IMs cadastrados aqui no meu profile :D

 

Vlw, bora galera, topem um desafiozinho ai eheh.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ninguem topa o desafio? :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.