0

TableGearをレンダリングするためのそのような配列があります:

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())?

4

2 に答える 2

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キーだけを実行できます。

もう1つの方法は、構成内の特定のものをコールバックとして定義し、構成内のキーがコントローラーに付加された変数名であり、コールバック値がメソッド名であると想定することです。たとえば、次のようになります。

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

次に、コントローラーで、配列内のコールバックキーをスキャンし、call_user_funcまたはcall_user_func_array...またはストレートアップダイナミックメソッドを使用してコールバックを適用できます。

ただし、なぜテーブルクラスを作成しないのですか?

于 2010-09-28T22:29:49.583 に答える
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());
于 2010-09-28T23:44:40.660 に答える