PHP týden PHP týden
Pouze tento týden až 80% sleva na PHP, Nette, Symfony!
Aprílový black friday tě nenechá v klidu! Až 80 % prémiového obsahu zdarma. Více informací
Avatar
pgarsky
Člen
Avatar
pgarsky:23.11.2018 14:48

Mám webovou stránku a na ní vypisuji do bootstrap modalu údaje ze dvou tabulek v databázi.
První tabulka je tabulka s názvama sportovních aktivit, ze které vypisuji pouze názvy těchto aktivit (řádek v tabulce = jedna aktivita.) a ze druhé tabulky vypisuji údaje o těch, kteří se zúčastní příštího termínu konání příslušné aktivity.
Každý modal patří příslušné aktivitě a jsou na něm v tabulce vypsáni účastníci příštího termínu aktivity.

Zkusil jsem: Zde jsou 2 funkce, které vypisuji pod sebe na stránku s jediným rozdílem - tu první vypisuji do tabulky, která se zobrazí a jejíž buňky si mohu kliknout a ta druhá obstarává výpis modalů s jednotlivými informacemi.

public function displayFreeSpaces() {
                // Vypíše názvy aktivit (sportovních) z databáze seznamu aktivit.
        $activityNamesQ = "SELECT activity FROM activities";
        $activityNamesR = mysqli_query($this->connection, $activityNamesQ);

                // Pomocná proměnná $i pro identifikaci příslušného modalu.
        $i = 1;
        echo('<thead>');
        while ($activityName = mysqli_fetch_assoc($activityNamesR))  {
                        // Výpis názvů z databáze
            echo('<th><a data-toggle="modal" data-target="#myModal' . $i . '" style="cursor: pointer;">' .              $activityName['activity'] . '</a></th>');
            $i++;
        }
        echo('</thead>');

    }
    public function displayFreeSpacesModal() {
        // Touto funkcí seřadím data z obří tabulky za pomoci SQL dotazu LEFT JOIN do jednoho pole,
        identifikovaného pomocí id aktivity.
        function groupArray($arr, $group, $preserveGroupKey = false, $preserveSubArrays = false) {
        $temp = array();
        foreach($arr as $key => $value) {
        $groupValue = $value[$group];
        if(!$preserveGroupKey)
        {
            unset($arr[$key][$group]);
        }
        if(!array_key_exists($groupValue, $temp)) {
            $temp[$groupValue] = array();
        }

        if(!$preserveSubArrays){
            $data = count($arr[$key]) == 1? array_pop($arr[$key]) : $arr[$key];
        } else {
            $data = $arr[$key];
        }
            $temp[$groupValue][] = $data;
        }
            return $temp;
        }

        // Zde se vytvoří výše zmíněna tabulka s názvama aktivit
        $displayQ = "SELECT * ";
        $displayQ .= "FROM activities ";
        $displayQ .= "INNER JOIN participants_of_activities ON activities.id = participants_of_activities.activityId";


        $displayR = mysqli_query($this->connection, $displayQ);

        $connectedActivities = mysqli_fetch_all($displayR, MYSQLI_ASSOC);

                // Vytvoří se multidimenzionální pole
        $activities = groupArray($connectedActivities, 'activityId');

        foreach ($activities as $activity) {
                // $j opět pro identifikaci modalu
        $j = 1;
            echo('
            <!-- The Modal -->
            <div class="modal" id="myModal' . $j . '">
            <div class="modal-dialog modal-dialog-centered">
            <div class="modal-content">

            <!-- Modal Header -->
            <div class="modal-header">
                        <!-- U výpisů s otazníkem místo názvu prvku nevím, co bych měl napsat -->
            <h4 class="modal-title">' . $activity[?]['activity'] . '</h4>
            <button type="button" class="close" data-dismiss="modal">&times;</button>
            </div>

            <!-- Modal body -->
            <div class="modal-body" style="overflow-x: auto;">
            <table class="table table-bordered">
            <thead>
            <th>Jméno</th>
            <th>Email</th>
            <th>Telefonní číslo</th>
            <th>Datum konání</th>
            </thead>
            <tbody>
            <tr>
            <td>' . $activity[?]['name'] . '</td>
            <td>' . $activity[?]['email'] . '</td>
            <td>' . $activity[?]['telNumber'] . '</td>
            <td>' . $activity[?]['dateOfEvent'] . '</td>
            </tr>
            </tbody>
            </table>
            </div>

            <!-- Modal footer -->
            <div class="modal-footer">
            <button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
            </div>

            </div>
            </div>
            </div>
            ');
            $j++;
      }
    }
Ještě výpis print_r($acti­vities)
V účastnících mám 3 účastníky, přičemž 1 z nich jde na aktivitu1 a další dva na aktivitu2. Na aktivitu3 nejde nikdo.

Array
(
[5] => Array
(
[0] => Array
(
[id] => 1
[activity] => 1. aktivita
[number_of_par­ticipants] => Neomezený
[price] => 0
[day] => Čtvrtek
[description] => egeg
[name] => 1. účastník
[email] => [email protected]
[telNumber] => 84564556456464564
[dateOfEvent] => 2018-11-24
)

)

[6] => Array
(
[0] => Array
(
[id] => 2
[activity] => 2. aktivita
[number_of_par­ticipants] => Neomezený
[price] => 0
[day] => Čtvrtek
[description] => egeg
[name] => 2. účastník
[email] => [email protected]
[telNumber] => 845645564564645642
[dateOfEvent] => 2018-11-24
)

[1] => Array
(
[id] => 3
[activity] => 2. aktivita
[number_of_par­ticipants] => Neomezený
[price] => 0
[day] => Čtvrtek
[description] => egeg
[name] => 3. účastník
[email] => [email protected]
[telNumber] => 845645564564645642
[dateOfEvent] => 2018-11-24
)

)

)

Chci docílit: * Momentálně * lze kliknout na stránce pouze na první modal, kde se zobrazí pouze jeden řádek.
Snažím se dosáhnout toho, aby se data z tabulek seřadila do příslušných modalů tak, jak tam patří.

Omlouvám se, možná jsem to špatně vysvětlil, ale nevím, jak bych to vysvětlil lépe. :( Cokoliv nebude jasné - hned vysvětlím. Děkuji za pochopení.

Editováno 23.11.2018 14:50
Odpovědět 23.11.2018 14:48
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:26.11.2018 8:30

Je to nesrozumitelne. Vynech slovo modal a jina, ktera v cestine neexistuji a zkus to znova. Bootstrap sice pouzivam, ale jen na zaklade znalosti html, css. Vzdycky si prislusne class a nazvy komponent vyhledavam pres okumentaci :) Takze, treba mi modal nic nerekne.
A dal teda neni vubec jasne, o co jde.

  • Co to vypise? html kod. Nebo, jak se to vypise.
  • A jak by se to vypsat melo? Opet nejlepe html kod.

Rekneme, ze mas nejakou tabulku. U ni zobrazujes zkracenou verzi pres php. A pak mas neco, co na onmouseover nebo onlick zobrazi podrobnosti. Tak to vubec netusim, jak se v bootstrapu dela :) Nejspis bych volal ajax.
Nebo bych se na moduly bootstrapu vykaslal a obe tabulky si nacetl do js a filtroval to v js. Neco jako tohle, netestovano, pseudokod

var tab1, tab2;
tab1 = [
  1, 3, 4
]
tab2 = [
  1, 5, 6, 7, 8
]
zobrazTab(id0, tab0) // kde do tr pridam data-id = tab1[i][0], id ve sloupci 0 stejne pro tab1 i tab2
id0.onmouseover = zobraz2;

function.zobraz2(event)
  {
    event = event ? event : window.event;
    el = event.target;
    el = el.nodeName == 'TR' ? el : el.parentNode;
    if (el.nodeName == 'TR' && typeof el.dataset.id != 'undefined') //https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset
    {
      zobrazTab(id1, tab1,
      {
        0: el.dataset.id
      })
    } // {cislo_sloupce: value, cislo_sloupce: value, cislo_sloupce: value}
    // a zobrazTab bude mit pak funkci na fitrovani, cyklus
    function zobrazTab(id, data, filter)
    var str, row, radky, i, j, bool;
    radky = [];
    // filter
    if (filter) cyklus(data) // for i=0; i<data.length; i++
      {
        row = data[i];
        bool = true;
        cyklus(filter) // for j in filter
          {
            bool &= filter[j] == row[j];
          } // true, kdyz se rovna, false, kdyz ne
        if (bool)
        {
          radky[radky.length] = row;
        }
      }
    else radky = data;
    // zobrazeni tab
    cyklus(radky)...generuj html kod / str = '<table><tr data...>...</table>';
    // document.getElementById(id).innerHTML = str;

A melo by to fungovat tak, ze si zobrazis tab 1. Do html kodu si budes pridavat <tr data-id=idecko>. Onmouseover nad tabulkou spusti js kod, ktery se pokusi to id vycist a na zaklade toho vyfiltruje druhou tabulku, kterou zobrazi treba vedle. Nebo ji nechas plovouci. To by mozna mohl umet uz bootstrap.

Ps. jeste mala uprava, formatovani :) https://www.danstools.com/…pt-beautify/

Editováno 26.11.2018 8:32
 
Nahoru Odpovědět 26.11.2018 8:30
Avatar
pgarsky
Člen
Avatar
Odpovídá na Peter Mlich
pgarsky:27.11.2018 22:43

Je to úplně jednoduchý.
Představ si multidimenzionální pole a když ho zobrazíš funkcí print_r(), tak dostaneš tohle:

Array
(
[5] => Array
(
[0] => Array
(
[id] => 1
[activity] => 1. aktivita
[number_of_participants] => Neomezený
[price] => 0
[day] => Čtvrtek
[description] => egeg
[name] => 1. účastník
[email] => [email protected]
[telNumber] => 84564556456464564
[dateOfEvent] => 2018-11-24
)

)

[6] => Array
(
[0] => Array
(
[id] => 2
[activity] => 2. aktivita
[number_of_participants] => Neomezený
[price] => 0
[day] => Čtvrtek
[description] => egeg
[name] => 2. účastník
[email] => [email protected]
[telNumber] => 845645564564645642
[dateOfEvent] => 2018-11-24
)

[1] => Array
(
[id] => 3
[activity] => 2. aktivita
[number_of_participants] => Neomezený
[price] => 0
[day] => Čtvrtek
[description] => egeg
[name] => 3. účastník
[email] => [email protected]
[telNumber] => 845645564564645642
[dateOfEvent] => 2018-11-24
)

)

)

Takže to vypisuje array se třema dimenzema.
Kdybych chtěl toto multidimenzionální pole vypsat do tabulek, byly by 2. A v jedné tabulce by byl pouze jeden řádek a ve druhé dva. A v těch by byly údaje jako ID, activity, day, apod.
Už je to jasnější?

Nahoru Odpovědět 27.11.2018 22:43
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Václav Methez:28.11.2018 0:49

Možná to nevyřeší tvůj problém, ale můžu se zeptat proč máš v metodě displsyfreespa­cemodals funkci groupArray? Není to náhodou porušení principu OOP?

 
Nahoru Odpovědět 28.11.2018 0:49
Avatar
pgarsky
Člen
Avatar
Odpovídá na Václav Methez
pgarsky:28.11.2018 6:25

Ve skutečnosti ji tam nemám, tady jí mám jen pro větší přehlednost.

Editováno 28.11.2018 6:25
Nahoru Odpovědět  +1 28.11.2018 6:25
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.