2010-09-28 30 views
0

我有渲染TableGear這樣的一個數組:使用Zend_Config INI或XML與動態數據

array(
      "database" => array(
       'username' => $this->config->resources->db->params->username, 
       'password' => $this->config->resources->db->params->password, 
       'name' => $this->config->resources->db->params->dbname, 
       'table' => "projetos", 
       'fields' => array(
        'pro_cliente', 
        'pro_area', 
        'pro_evento', 
        'estado', 
        'cidade', 
        'pro_mes', 
        'pro_montagem_inicio', 
        'pro_montagem_fim', 
        'pro_evento_inicio', 
        'pro_evento_fim', 
        'pro_desmontagem_inicio', 
        'pro_desmontagem_fim', 
        'pro_atendimento', 
        'pro_projeto', 
        'pro_situacao' 
       ) 
       //"noAutoQuery" => true 
      ), 
      "selects" => array(
       'pro_situacao' => array('Aberto', 'Em Andamento', 'Fechado', 'Cancelado'), 
       'estado' => $this->estados->getEstados() 
      ), 
      "formatting" => array(
       'pro_valor' => 'currency[prefix=R$ ,pad]', 
       'pro_montagem_inicio' => 'date[d/m]', 
       'pro_montagem_fim' => 'date[d/m]', 
       'pro_evento_inicio' => 'date[d/m]', 
       'pro_evento_fim' => 'date[d/m]', 
       'pro_desmontagem_inicio' => 'date[d/m]', 
       'pro_desmontagem_fim' => 'date[d/m]' 
      ), 
      'headers' => array(
       'pro_id' => 'ID', 
       'pro_cliente' => 'Cliente', 
       'pro_area' => 'Area', 
       'pro_evento' => 'Evento', 
       'estado' => 'UF', 
       'cidade' => 'Cidade', 
       'pro_mes' => 'Mes', 
       'pro_montagem_inicio' => 'Inicio Montagem', 
       'pro_montagem_fim' => 'Fim Montagem', 
       'pro_evento_inicio' => 'Inicio Evento', 
       'pro_evento_fim' => 'Fim Evento', 
       'pro_desmontagem_inicio' => 'Inicio Desmontagem', 
       'pro_desmontagem_fim' => 'Fim Desmontagem', 
       'pro_atendimento' => 'Atendimento', 
       'pro_projeto' => 'Projeto', 
       'pro_situacao' => 'Situacao', 
       'pro_valor' => 'Valor', 
       'DELETE' => 'Deletar' 
      ), 
      'columns' => array(
       'pro_montagem_inicio' => 'date-picker', 
       'pro_montagem_fim' => 'date-picker', 
       'pro_evento_inicio' => 'date-picker', 
       'pro_evento_fim' => 'date-picker', 
       'pro_desmontagem_inicio' => 'date-picker', 
       'pro_desmontagem_fim' => 'date-picker' 
      ), 
      'allowDelete' => false, 
      'editable' => 'none' 
     ); // End of Tablegear 

正如你所看到的。我使用動態數據$this->config->resources->db->params->username$this->estados->getEstados()(來自我的數據庫的數據),我只能以控制器的陣列形式獲取數據。

我發現這些選項太大,不必在控制器中。我想用INI或XML文件來使用Zend_Config。但是,如何檢索我使用的這些數據(即$this->estados->getEstados())?

+1

相信我,你不想這樣做。這樣離開它會快得多。 – 2010-09-28 22:26:52

回答

0

我設法創造Tablegear模型來處理這個問題

<?php 

class Application_Model_Tablegear 
{ 
protected $_name = null; 
protected $_username = null; 
protected $_password = null; 
protected $_estados = null; 
protected $_allowDelete = false; 
protected $_editable = 'all'; 

public function allowDelete() { 
    $this->_allowDelete = true; 
    return $this; 
} 

public function setEditable($fields) { 
    $this->_editable = $fields; 
    return $this; 
} 

public function setEstados($estados) { 
    $this->_estados = $estados; 
    return $this; 
} 

public function setDatabase($params) { 
    $this->_username = $params->username; 
    $this->_password = $params->password; 
    $this->_name = $params->dbname; 
    return $this; 
} 

public function getOptions() { 
    return array(
      "database" => array(
       'username' => $this->_username, 
       'password' => $this->_password, 
       'name' => $this->_name, 
       'table' => "projetos", 
       'fields' => array(
        'pro_cliente', 
        'pro_area', 
        'pro_evento', 
        'estado', 
        'cidade', 
        'pro_mes', 
        'pro_montagem_inicio', 
        'pro_montagem_fim', 
        'pro_evento_inicio', 
        'pro_evento_fim', 
        'pro_desmontagem_inicio', 
        'pro_desmontagem_fim', 
        'pro_atendimento', 
        'pro_projeto', 
        'pro_situacao' 
       ) 
       //"noAutoQuery" => true 
      ), 
       "selects" => array(
        'pro_situacao' => array('Aberto', 'Em Andamento', 'Fechado', 'Cancelado'), 
        'estado' => $this->_estados 
       ), 
       "formatting" => array(
        'pro_valor' => 'currency[prefix=R$ ,pad]', 
        'pro_montagem_inicio' => 'date[d/m]', 
        'pro_montagem_fim' => 'date[d/m]', 
        'pro_evento_inicio' => 'date[d/m]', 
        'pro_evento_fim' => 'date[d/m]', 
        'pro_desmontagem_inicio' => 'date[d/m]', 
        'pro_desmontagem_fim' => 'date[d/m]' 
       ), 
       'headers' => array(
        'pro_id' => 'ID', 
        'pro_cliente' => 'Cliente', 
        'pro_area' => 'Area', 
        'pro_evento' => 'Evento', 
        'estado' => 'UF', 
        'cidade' => 'Cidade', 
        'pro_mes' => 'Mes', 
        'pro_montagem_inicio' => 'Inicio Montagem', 
        'pro_montagem_fim' => 'Fim Montagem', 
        'pro_evento_inicio' => 'Inicio Evento', 
        'pro_evento_fim' => 'Fim Evento', 
        'pro_desmontagem_inicio' => 'Inicio Desmontagem', 
        'pro_desmontagem_fim' => 'Fim Desmontagem', 
        'pro_atendimento' => 'Atendimento', 
        'pro_projeto' => 'Projeto', 
        'pro_situacao' => 'Situacao', 
        'pro_valor' => 'Valor', 
        'DELETE' => 'Deletar' 
       ), 
       'columns' => array(
        'pro_montagem_inicio' => 'date-picker', 
        'pro_montagem_fim' => 'date-picker', 
        'pro_evento_inicio' => 'date-picker', 
        'pro_evento_fim' => 'date-picker', 
        'pro_desmontagem_inicio' => 'date-picker', 
        'pro_desmontagem_fim' => 'date-picker' 
       ), 
       'allowDelete' => $this->_allowDelete, 
       'editable' => $this->_editable 
      ); 
    } 
} 

然後我設置的方法在我的控制器

$this->tgOptions = new Application_Model_Tablegear(); 
$this->tgOptions->setDatabase($this->config->resources->db->params) 
      ->setEstados($this->estados->getEstados()); 
0

那麼你可以簡單地合併的事情......比如可以說你的大部分配置的模塊或應用程序配置中你可以做一個方法叫做configureTableGearRendering

protected function configureTableGearRendering(array $selects, $database = array(), $formatting = array(), $headers = array(), $allowDelete = null, $editable = null) 
{ 
    $config = $this->config->tableGear; 
    $config['selects'] = array_merge($config, $selects); 
    $config['database'] = array_merge($config, $database); 
    $config['fromatting'] = array_merge($config, $formatting); 

    if(null !== $allowDelete) 
    { 
    $config['allowDelete'] = $allowDelete; 
    } 

    if(null !== $editable) 
    { 
    $config['editable'] = $editable; 
    } 

    return $config; 
} 

當然,如果你不需要選擇所有這些東西oyu可以調整,因爲你認爲合適。但是這可以讓你傳入一個數組來添加或覆蓋所有頂級密鑰的選項。你也可以寫一個遞歸合併函數來允許你爲任何級別的鍵提供選項,儘管結構必須是相同的。或者,如果您只需要覆蓋selects鍵,則只能做到這一點。

你可以做的是簡單地定義某一件事罪的配置爲回調和假設,在配置的關鍵是連接到控制器和回調值的變量名的另一件事是例如方法名稱:

<selects> 
    <estados> 
    <callback>getEstados</callback> 
    </estados> 
</select> 

然後在您的控制器中,您可以掃描陣列中的回撥鍵,然後使用call_user_funccall_user_func_array ...或使用直接動態方法應用回撥。

但是:爲什麼你不創建TABLE CLASSES!?

+0

其實我是,但我發現這個TableGear自動從數據庫中檢索。 – 2010-09-28 23:42:10