代码之家  ›  专栏  ›  技术社区  ›  Rodrigo Souza

对动态数据使用Zend\u Config INI或XML

  •  0
  • Rodrigo Souza  · 技术社区  · 15 年前

    我有这样一个数组来渲染 餐具 :

    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\u Config。但是如何检索我使用的这些数据(即。 )?

    2 回复  |  直到 13 年前
        1
  •  0
  •   prodigitalson    15 年前

    好吧,你可以简单地合并一些东西。。。例如,假设您在模块或应用程序配置中使用了大部分配置,您可以创建一个名为 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;
    }
    

    当然,如果你不需要选择所有这些东西,你可以调整,因为你认为合适。但这允许您传入一个数组来添加或覆盖所有顶级键的选项。您可以编写一个递归合并函数,允许您在任何级别为键提供选项,尽管结构必须相同。或者,如果你只需要覆盖 selects 你只能做那一个。

    您可以做的另一件事是简单地将配置中的某些事情定义为回调,并假设config中的键是附加到控制器的变量名,回调值是方法名,例如:

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

    call_user_func call_user_func_array

    然而: 为什么不创建表类!?

        2
  •  0
  •   Rodrigo Souza    15 年前

    我设法创建了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());
    
    推荐文章