2010-09-28 1 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() (данные из моей базы данных), которые я могу получить только внутри контроллера в данных массива.

Я нашел эти опции слишком большими и ненужными для того, чтобы быть в контроллере. Я хотел бы использовать Zend_Config с INI или XML-файлом. Но как я могу получить эти данные, которые я использую (т. Е. $this->estados->getEstados())?

+1

доверие мне, что ты не хочешь этого делать. оставьте так, что это будет намного быстрее. –

ответ

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; 
} 

Конечно, если вам не нужно вариант все эти вещи, которые можно настроить, как вы сочтете нужным. Но это позволяет вам передать массив для добавления или переопределения параметров для всех ваших клавиш верхнего уровня. Вы могли бы написать рекурсивную функцию слияния, чтобы позволить вам предоставлять опции для ключа на любом уровне, хотя структуры должны быть одинаковыми. Или, если вам нужно только переопределить ключ selects, вы можете сделать только тот.

Другая вещь, которую вы могли бы сделать, это просто определить наверняка, что грешить конфигурацию, как обратные вызовы и предположим, что ключ в конфигурации является имя переменной, подключенного к контроллеру, и что значение обратного вызова является имя метода, например:

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

Затем в вашем контроллере вы можете сканировать ключи обратного вызова в массиве и применять обратный вызов с помощью call_user_func или call_user_func_array ... или с динамическими методами прямого действия.

Однако: ПОЧЕМУ ВЫ НЕ СОЗДАТЬ ТАБЛИЧНЫЕ КЛАССЫ !?

+0

На самом деле я, но я узнал эту TableGear, которая автоматически извлекает из базы данных. –

 Смежные вопросы

  • Нет связанных вопросов^_^