server-side stránka a vkládání šablon

Webster.K
Člen | 192
+
0
-

Zdravím všechny, konečně se mi povedlo rozchodit server-side stránku. Jde o bootstrap doplněk datatables. Mám tabulku, kde načtu všechny její řádky přesně tak jak potřebuji, tedy toto je všechno v pořádku, bohužel poslední sloupeček byl button, na který když se kliklo, otevřel se bootstrap modal s „rozšiřujícími“ informacemi k danému řádku. Přes loader, který plní data do tabulky tam sice dokáži v řetězci vložit HTML kód (a i funguje, např otevření daného modalu), ale už tam nedostanu další věci.

Jde o to, že původně se to vše generovalo tak, že existovala jedna hlavní šablona (jakoby na kartu toho celého řádku), tedy na každém řádku byla includovaná stejná šablona, která od cyklu dostala parametry, které se do vložené šablony propsaly. Problém ale je ten, že když vkládám jako řetězec v tom loaderu (render funkce v presenteru), tak se uvnitř toho modalu, místo těla šablony vypíše jen

{include _karta.latte,param=>$param}

Nenapadá někoho, jak to vyřešit?

Editoval Webster.K (24. 9. 2018 16:50)

David Matějka
Moderator | 6445
+
0
-

Problém ale je ten, že když vkládám jako řetězec v tom loaderu (render funkce v presenteru),

ukaz prosim kod

Webster.K
Člen | 192
+
0
-

V presenteru je:

public function renderDefaultServerSide() {

    }

pro zobrazení tý stránky, do který se bude načítat ta část z renderLoad.
šablona renderDefaultServerSide() je:

{block content}
<div class="row">
    <div class="col-lg-6">
        <h1 class="page-header">test server-side</h1>
    </div>
</div>
<div class="row">
    <div class="col-lg-12">
        <div class="panel panel-default">
            <div class="panel-heading">
                Seznam knih
            </div>
            <div class="panel-body">
                <table width="100%" class="table table-striped table-bordered table-hover" id="dataTables-serverside">
                    <thead>
                        <tr>
                            <th>Jméno knihy</th>
                            <th>Autor knihy</th>
                            <th></th>
                        </tr>
                    </thead>
                </table>
            </div>
        </div>
    </div>
</div>
{/block}

{block scripts}
<script type="text/javascript" language="javascript" >
    $(document).ready(function () {
        var dataTable = $('#dataTables-serverside').DataTable({
            "processing": true,
            "serverSide": true,
            "ajax": {
                url: "load", // json datasource
                type: "post", // method  , by default get
                error: function () {  // error handling
                    $(".employee-grid-error").html("");
                    $("#employee-grid").append('<tbody class="employee-grid-error"><tr><th colspan="3">Data na serveru nenalezena</th></tr></tbody>');
                    $("#employee-grid_processing").css("display", "none");

                }
            }
        });
    });
</script>
{/block}

Pak v tom samém presenteru mám onu funkci renderLoad – je volána právě z toho scriptu v šabloně:

public function renderLoad() {
        $requestData = $_REQUEST;
        $columns = array(
            0 => 'nazev_knihy',
            1 => 'autor_knihy',
            2 => 'info'
        );

        $sql = $this->database->query("SELECT * FROM knihy");
        $totalData = $sql->getRowCount();
        $totalFiltered = $totalData;

        $sql = "SELECT * FROM knihy WHERE 1=1 ";
        if (!empty($requestData['search']['value'])) {
            $sql .= " AND ( autor_knihy LIKE '%" . $requestData['search']['value'] . "%' ";
            $sql .= " OR nazev_knihy LIKE '%" . $requestData['search']['value'] . "%' )";
        }
        $query = $this->database->query($sql);

        $totalFiltered = $query->getRowCount();

        $sql .= " ORDER BY " . $columns[$requestData['order'][0]['column']] . " " . $requestData['order'][0]['dir'] . " LIMIT " . $requestData['start'] . " ," . $requestData['length'] . "   ";

        $query = $this->database->query($sql);

        $data = array();
        foreach ($query as $row) {  // preparing an array
            $nestedData = array();

            $nestedData[] = $row["nazev_knihy"];
            $nestedData[] = $row["autor_knihy"];


            $karta = '<button type="button" class="" data-toggle="modal" data-target="#myModal-' . $row['id_knihy'] . '"><span class="fa fa-info-circle"></span></button>
                                        <div id="myModal-' . $row['id_knihy'] . '" class="modal fade text-left" role="dialog">
                                            <div class="modal-dialog modal-lg">
                                                <div class="modal-content">
                                                    <div class="modal-header">
                                                        <button type="button" class="close" data-dismiss="modal">×</button>
                                                        <h4 class="modal-title">' . $row['nazev_knihy'] . '</h4>
                                                    </div>
                                                    <div class="modal-body">
                                                        {include '.'_kartaKnihy.latte'.',kniha=>$row}
                                                    </div>
                                                    <div class="modal-footer">
                                                        <button type="button" class="btn btn-default" data-dismiss="modal">Zavřít</button>
                                                    </div>
                                                </div>
                                            </div>
                                        </div>';
            $nestedData[] = $karta;
            $data[] = $nestedData;
        }

        $json_data = array(
            "draw" => intval($requestData['draw']),
            "recordsTotal" => intval($totalData),
            "recordsFiltered" => intval($totalFiltered),
            "data" => $data   // total data array
        );

        $data = json_encode($json_data);
        //$data = Json::encode($data);
        $this->template->data = $data;
    }

a toto vykresluje šablona, ve které je:

{$data|noescape}

mělo by to takhle být vše, vše funguje, jen ten include dalších podšablon ne

David Matějka
Moderator | 6445
+
+1
-

promin, ale ten kod je straslivy.

prvne, to {include '.'_kartaKnihy.latte'.',kniha=>$row} v promenne opravdu fungovat nemuze, jelikoz to neni soucasti sablony, ale soucasti promenne, kterou vypisujes v sablone. budes to muset predelat, napriklad to dat do sablony a tu vykreslovat pres renderToString

a jinak tam mas sql injections, xss a dost mozna dalsi bezpecnostni diry

Webster.K
Člen | 192
+
0
-

ano, o bezpečnostních dírách vím, například: $requestData = $_REQUEST; není úplně ok, je to první verze, kterou jsem právě rozchodil.
jinak to {include ‚.‘_kartaKnihy.latte'.',kniha=>$row} mělo být {include _kartaKnihy.latte,kniha=>$row}, měl jsem meziverzi ve které byla proměnná a tento bordel tam zůstal. Potřeboval bych pravděpodobně totiž do proměnné vložit obsah šablony a to sem vložit, aby to fungovalo, ale to už se mi nepovedlo, proto založení tohoto vlákna

David Matějka
Moderator | 6445
+
0
-

hlavne neni ok to, jak skladas SQL dotaz :)

umist ten html kod do latte sablony, predej si jako zavislost https://api.nette.org/…Factory.html, vytvor si latte engine a vykresli sablonu pres renderToString:

/** @var \Nette\Bridges\ApplicationLatte\ILatteFactory @inject */
public $latteFactory;
....

$latte = $this->latteFactory->create();
$karta = $latte->renderToString(__DIR__ . '/karta.latte', ['row => $row]);
Webster.K
Člen | 192
+
0
-

jsem jel podle: https://coderexample.com/…lumn-search/ :) takže jsem to zatím, jestli je to ok, nebo není moc neřešil :) šlo o to to vůbec rozchodit, ale určitě si nechám poradit lepší řešení :) je to zatím jen verze, kterou jsem rozchodil pod nette :)

Ok, na toto mrknu :)