Autor Zpráva
PepaZDepa
Profil *
Ahoj,

chci se poradit. Potřebuji fci, která by mi vracela první nenulový argument funkce, tak jsem napsal něco takového:
function value()
{
	$arg_list = func_get_args();
	for ($i = 0; $i < func_num_args(); $i++)
	{
		if($arg_list[$i])
		{
			return $arg_list[$i];
		}
	}
}


Ale nejsem si jistý, zda to není nějaká velká prasárna a nebo by nebylo vhodné to řešit jinak.

Fci poté volám takto:
$a = '';
$b = 'test';
$c = 'neco';
echo value($a, $b, $c); //vypise mi 'test'


Funguje to tedy správně, chci se tedy jen zeptat, zda ta fce není napsaná nějak prasácky a nebo by to nešlo řešit elegantněji nebo bez použítí for cyklu.

Děkuji Vám
Jozin
Profil
Zdravím,

no jestli je to prasárna, to nevím. Nějak nechápu, k čemu by šla tato funkce využít.

Nějaké vylepšení by bylo, použít foreach místo for což ale nevím, jestli je rychlejší nebo lepší řešení, jen nebudu potřebovat proměnné arg_list a i a nevím jak přes podmínku projde například argument, který se bude rovnat nule. No opravdu nevím. Je hodně možností hodnot, dá se to vyzkoušet. Moje předělávka této funkce by tedy vypadala takto

function first_value() {
  foreach(func_get_args() as $arg) {
    if(!empty($arg)) return $arg;
  }
}
PepaZDepa
Profil *
Díky za názor,

jinak k čemu by taková fce byla dobrá? Zmíním např konkrétní příklad z eshopu co dělám:
jsem v detailu produktu a chci vypsat do hlavičky meta description nějaký popisek. A je několik možností. Každý produkt má v databázi uloženo:
head_descirption (popisek, který když je vyplněn, tak se bude zobrazovat v <meta name="description". Jinde se nepoužije>
description (klasický popisek každého zboží v eshopu. Pokud není vpylněn head_description, do <meta name="description"> použiji toto)

a pak je v databázi uložen univerzální description, který se použije když jsou dva zmiňované výše prázdné. tomu říkejme např default_description.

A já poté v šabloně použiji něco takového:
<meta name="description" content="{value($head_description, $description, $default_description)}" />


Těch možností využití je opravdu mnoho, hlavně v případech, kdy se kodér nemůže spoléhat na to, že daná proměná je naplněna.

Napadá mě ještě jeden přiklad u zmiňovaného eshopu. Každý produkt má určitě cenu, ale některé produkty mají Akční cenu, kterou zobrazíme místo klasické (pokud je vyplněna). Řešit to takto:
if($akcni_cena){
echo $akcni_cena;
}else{
echo $klasicka_cena;
}

mi příjde hrozně nepřehledné a zdlouhavé na psaní, elegantnější je:
echo value($akcni_cena, $klasicka_cena);
Jozin
Profil
PepaZDepa:
Druhý problém mi příjde trošku jen dodělaný, vždyť pokud nepíšu informaci, že tato cena je akční, tak mohu mít proměnnou $cena a je mi jedno, jestli je to akční nebo klasická, což by vyřešilo tento problém.

První problém se dá vyřešit nutným vyplněním description. Při vkládání pak vkládací script vyhodnocuje, zda je description vyplněn nebo ne, pokud není a zároveň neexistuje popisek zboží. Vloží se defaultní, který je někde uložen. Pokud však existuje popisek zboží, ale description ne, tak se do description vyplní popisek zboží. Poté je tato funkce naprosto k ničemu. Myslím si, že je lepší si lámat hlavu nad řešením u databáze, než mít sloupec, který prostě potřebuji, nastavený na null, tedy, že může být nulový, což tento by být neměl. Pokud bude not null, tak si kodér může být jistý, že hodnota tam bude.

Jinak tento problém bych raději už řešil šablonovacím systémem. Nemusí být nijak složitý, já jsem si napsal takový opravdu jednoduchý, který mi právě prázdné proměnné ošetřuje.

Jinak asi tedy bude tato funkce pracovat, ale asi bych spíš zauvažoval nad opravou backendu aplikace.
PepaZDepa
Profil *
- To s tou cenou byl jen příklad. Zrovna mě to napadlo.. asi lepší příklad bude u webu, který publikuje jen články. Mám např článek, který nemá vyplněného autora a klient by po mě chtěl aby se vypsal autor a pokud autor není vyplněn, tak aby se vypsal text "za článek zodpovídá portal xxx.cz". Než dělat neelegantní if podmínku, tak by stačilo jen jednoduché:
{value($author, "za článek zodpovídá portal xxx.cz")}


Já nechtěl vést diskuzi o tom, zda zrovna meta popisek řeším vhodně, jsou situace, kdy klient chce mít extra popisek v hlavičce a extra ve viditelném detailu produktu.. To je jeho požadavek, a takovéto řešení mi přišlo nejvhodnější.. ale já tuto fci budu jistě využívat na více místech, příjde mi opravdu šikovná a teď zmiňovaný příklad s autorem je podle mě daleko elegantnější řešit pomocí zmiňované fce.
Jozin
Profil
PepaZDepa:
Opět je to špatným návrhem databáze.

Hádat se nebudu. Vím, jak to je s požadavky od klientů. Sám tyto problémy řeším dnes a denně. Pokud ovšem mám možnost navrhovat systém od začátku, tak tuto funkci bych rozhodně nepoužil.
PepaZDepa
Profil *
Ach jo :o) nevím tady ten příklad je podle mě jednodužší řešit v šabloně. Když si klient zamane, tak jednoduše změním text na něco jiného a může to udělat kodér. Nehledě na to, že když tyto data budou uložená v databázi (ať u každého článku nebo v nějaké jiné tabulce aby se neduplikovala), tak už úpravu musí provádět programátor, a to podle mě není vhodné řešení.

Příjde mi lepší, navrhnout systém daleko univerzálněji (nebo lépe řečeno volněji a ne tak striktně vůči zadávaným datům) a případná ošetření řešit až v šabloně. Osobně si myslím, že je lepší naprogramovat něco univerzálněji a dávat více možností jak dané věci využít a je poté už na kodérovi, jak web sestaví.

Ještě mě napadá jeden příklad, kde mi už snad musíš dát zapravdu, že využít tuto fci je vhodné.
<img src="{$image}" alt="{value($image->title, "ilustracni obrazek")}" />

Jde o to, že každá nahraný obrázek může mít nějaký titulek, ale ze zkušenosti vím, že uživatelé obrázky nahrají, lae pak jsou líní u nich vypisovat titulky.. z toho důvodu nějaké takovéto řešení (to jestli je to dobře z hlediska přístupnosti teď neřešme)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0