server-side stránka a vkládání šablon
- Webster.K
- Člen | 212
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
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 | 212
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
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 | 212
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
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 | 212
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 :)