Projekt

Obecné

Profil

Požadavek #403

uzavřený

Kompatibilita uložených filtrů s filtry

Přidáno uživatelem Ondřej Fibich před více než 11 roky(ů). Aktualizováno před více než 10 roky(ů).

Stav:
Uzavřený
Priorita:
Normální
Přiřazeno:
Kategorie:
-
Cílová verze:
Začátek:
2012-10-25
Uzavřít do:
% Hotovo:

100%

Odhadovaná doba:
2:00hod

Popis

Jak zajistit kompatibilitu uložených filtrů s aktuálními? Viz #395.

Aktualizováno uživatelem Michal Kliment před více než 11 roky(ů)

Neměnit názvy filtrů, případně to ošetřit, aby to neskončilo chybou (neexistující název filtru ignorovat).

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

No to je ta jednodušší část, ale co když s v některé tabulce změní třeba název sloupce?

Aktualizováno uživatelem Michal Kliment před více než 11 roky(ů)

Neměnit ani názvy sloupců :-)

Ne, vážně - je nutné udělat název sloupce nezávislý na názvu filtru - aktuálně nejde použít 2 filtry se stejně pojmenovanými sloupci.

Aktualizováno uživatelem Ondřej Fibich před více než 11 roky(ů)

Já zapomněl, že je tam vytvořeno mapování na sloupce DB tabulky..
Jak třeba ale vyřešíme, když se změní struktura SQL dotazu?

Aktualizováno uživatelem Ondřej Fibich před asi 11 roky(ů)

  • % Hotovo změněn z 0 na 20
  • Odhadovaná doba nastaven na 2:00hod

Ve třídě Filter_Form vytvořit metodu is_loaded_from_stored_filter(), která indikuje, zda li je filtr načten z uloženého filtru.
Každý SQL dotaz používající filtry obalit do try .. catch takto:

$f = new Filter_form();
try
{
    $model->get_all..();
}
catch (Exception $e)
{
    if ($f->is_loaded_from_stored_filter())
    {
        status::error('Incompatible stored filter');
        url::redirect(url::base().url_lang::current());
    }
    throw $e;
}

Aby to nebylo moc práce, tak bych tak v budoucnu činil jen u SQL dotazů, které se změnily.

Aktualizováno uživatelem Ondřej Fibich před asi 11 roky(ů)

  • Přiřazeno změněn z Michal Kliment na Ondřej Fibich

Hotovo, aplikováno na Members_Controller#show_all, příklad (kde bude nastávat problém s kompatibilitou aplikuje se podobný úsek kódu):

try
{
    $total_members = $model_members->count_all_members($filter_form->as_sql());
    // ... some other SQL queries
}
catch (Exception $e)
{
    if ($filter_form->is_loaded_from_saved_query())
    {
        status::error('Invalid saved query');
        // disable default query (loop protection)
        if ($filter_form->is_loaded_from_default_saved_query())
        {
            ORM::factory('filter_query')->remove_default($filter_form->get_base_url());
        }
        $this->redirect(url_lang::current());
    }
    throw $e;
}

Aktualizováno uživatelem Ondřej Fibich před asi 11 roky(ů)

  • Stav změněn z Nový na Uzavřený
  • % Hotovo změněn z 20 na 100

Také k dispozici: Atom PDF