| Autor | Zpráva | ||
|---|---|---|---|
| Obr_na Profil * |
#1 · Zasláno: 20. 7. 2015, 16:29:55
Nějak nemůžu přijit na kloub, jak bych mohl vypsat stejné položky a udělat z toho select - option.
V mySQL mám v tabulce atributy ... id, typ, nazev TYP: NAZEV: Délka kabelu 5 metrů Délka kabelu 10 metrů Délka kabelu 2 metry Délka kabelu 1 metr Napájecí zdroj bez napájecího adaptéru Napájecí zdroj adaptér 230V-50Hz/12Vdc Napájecí zdroj bez napájecího adaptéru Napájecí zdroj adaptér 230V-50Hz/12Vdc Jde mně o to, udělat z toho: <p>Délka kabelu: <select name="nazev[]"><option value="">5 metrů</option><option value="">10 metrů</option><option value="">2 metry</option><option value="">1 metr</option></select></p> <p>Napájecí zdroj: <select name="nazev[]"><option value="">bez napájecího adaptéru</option><option value="">adaptér 230V-50Hz/12Vdc</option><option value="">bez napájecího adaptéru</option><option value="">adaptér 230V-50Hz/12Vdc</option></select></p> Moc díky za pomoc. |
||
| juriad Profil |
#2 · Zasláno: 20. 7. 2015, 16:34:21
|
||
| Obr_na Profil * |
#3 · Zasláno: 20. 7. 2015, 20:27:50
juriad díky moc. Maximálně přišlo vhod a pomohlo. Ještě malý detail ..., když script bude na konci stejného výpisu, jak tam vůbec vložím ukončení "</select></p>"? Napadlo mně vložit počítání, ale nevím kolik stejných tam je. Pak mně napadlo vložit to hned na začátek, kdy dám </select></p> a hned <select> .... první bude špatně ... druhý, třetí OK, ale u posledního by to taky chybělo.
Ještě jednou díkec za radu. |
||
| Keeehi Profil |
#4 · Zasláno: 20. 7. 2015, 20:46:28
<p><select> před cyklus
</select></p><p><select> do ifu
</select></p> za cyklus
|
||
| Obr_na Profil * |
#5 · Zasláno: 20. 7. 2015, 22:06:56
Keeehi: před cyklus to dát nemohu
<p><select>, protože tam potřebuji vložit už název, který se nachází v IFu :(
|
||
| Taps Profil |
#6 · Zasláno: 20. 7. 2015, 22:18:33
Obr_na:
určitě to nějak půjde:-) Tak select musí být mimo cyklus |
||
| Alphard_ Profil * |
#7 · Zasláno: 20. 7. 2015, 22:35:45
U složitějších konstrukcí může být přímé použití uvedeného algoritmu zbytečně nepřehledné.
Zmíněný postup lze použít pro předpřipravení asociativního pole (nebo i složitější objektové struktury) a teprve to pak vypisovat. Tím se dá vyhnout strukturám jako [#4], přepíší se na vnořené cykly foreach ($groups as $group) {
echo '<p>'. $group->name;
echo '<select>';
foreach ($group->options as $option) {
echo '<option />';
}
echo '</select>';
echo '</p>';
} |
||
| Keeehi Profil |
#8 · Zasláno: 20. 7. 2015, 23:28:33
$pamet = null;
while ($line = …) {
if ($line['typ'] !== $pamet) {
if($pamet !== null) {
echo "</select></p>";
}
$pamet = $line['typ'];
echo "<p>$line[typ]: <select name=\"nazev[]\">";
}
echo "<option value=\"\">$line[nazev]</option>";
}
echo "</select></p>"; |
||
| Alphard Profil |
[#8] tohle je určitě možné, ale je to přesně ta nepřehledná kontrukce, kterou jsem měl na mysli. Editor v tom nezobrazí párové tagy, nezkontroluje syntaxi, kdyby to bylo v šabloně, nefungují tam pokročilejší prvky vyžadující přehledný DOM.
Kdysi jsem např. do šablon přepsal generování menu v tomto stylu. Dnes už bych, pokud by nebyl dobrý důvod dělat to jinak, v šablonách použil rekurzivně volané makro {% macro menu_level(levelItem) %}
<li>
<a href=""><span>{{levelItem.name|e}}</span></a>
{% if levelItem.hasSubitems %}
<ul>
{% for item in ... %}
{{menu_level(item)}}
{% endfor %}
</ul>
{% endif %}
</li>
{% endmacro %}Zde řešený problém by šel snad obejít nějak takto, aby se šetřil procesor, paměť a finální výpis zůstal přehledný. $input = [
['key' => 'Arabske', 'val' => '1'],
['key' => 'Arabske', 'val' => '2'],
['key' => 'Arabske', 'val' => '3'],
['key' => 'Arabske', 'val' => '4'],
['key' => 'Rimske', 'val' => 'I'],
['key' => 'Rimske', 'val' => 'II'],
['key' => 'Abeceda', 'val' => 'a'],
['key' => 'Abeceda', 'val' => 'b'],
['key' => 'Abeceda', 'val' => 'c'],
];
function iterateGroup($iter) {
$line = each($iter);
while ($line) {
$val = $line[1];
yield $val['key'] => function() use ($val, &$iter, &$line) {
yield $val['val'];
while (($line = each($iter)) && ($line[1]['key'] === $val['key'])) {
yield $line[1]['val'];
}
};
}
}
foreach (iterateGroup($input) as $name => $group) {
echo $name, ':', PHP_EOL;
foreach ($group() as $item) {
echo '- ', $item, PHP_EOL;
}
echo PHP_EOL;
}Finální výpis Arabske: - 1 - 2 - 3 - 4 Rimske: - I - II Abeceda: - a - b - c Záměrně jsem při procházení pole všude používal výhradně while a each, aby to bylo nahraditelné za databázove fetch(). Teď jsem si všiml, že když se nezavolá iterace zanořené skupiny, tak se to zacyklí. To není ideální :-), psal jsem to v rychlosti jen jako demonstraci. Jestli to někdo chcete použít, tak to upravte. |
||
| Keeehi Profil |
Ano není to hezké. S šablonami bych to napsal asi nějak takto:
{var $it = new ArrayIterator($options);}
<p n:while="$it->valid()">
{var $pamet = $it->current()['typ']}
{$pamet}
<select name="nazev[]" n:inner-while="$it->valid() && $it->current()['typ'] === $pamet">
<option value="">{$it->current()['nazev']}</option>
{? $it->next();}
</select>
</p>Ale já bych se k takovému problému nedostal. Neboť data bych v databázi měl ve dvou tabulkách a ptal bych se zvlášť na kategorie a zvlášť na produkty. |
||
|
Časová prodleva: 11 let
|
|||
0