DataTables a ukladani stavu na serveru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Glottis
Člen | 129
+
0
-

cao, mam takovy problemek nebo spis potrebuju jen tak nakopnout. pouzivam datatables. ty maji ukladani stavu kamsi ale ja chci stav ukladat na serveru k profilu uzivatele.

planuju si na ty datatables udelat komponentu ale prave zatim premyslim jak to uchopit, aby to bylo univerzalni. kam a jak nejlepe to uchopit? jak propasovat do komponenty „neco“ kam pujde stav ulozit? a pritom tam potrebju vazby na uzivatele. nejak bych to samozrejme dokazal sprasit :) ale rad bych to mel ciste :)

dik za podnety :)

Glo

vvoody
Člen | 910
+
0
-

Vela sme sa toho teba nedozvedeli ;) nvm co to je datatables (google mi napovedal toto) takze ak chces realnu radu tak proste zacni a ked ti bude nieco nejasne tak nevahaj a pytaj sa ;) alebo proste predhod realne vstupy systemu (nejake vzorove data a ich zdroj/struktura) a ako si predstavujes vystup.

Glottis
Člen | 129
+
0
-

no jak to tak ctu po sobe tak je to asi trosku zmatene :)

je to to co si poslal.

tak ja neco splacam a pak to sem kdyz tak hodim. ale v prvotni fazi me hlavne zajima, kam je vhodne si stav komponent ukladat? do mysql? nebo sqlite nekam do tempu? nebo ma na to nette neco jineho? do sessen se mi to nelibi, protoze to neni zas tak trvale jak bych chtel

vvoody
Člen | 910
+
0
-

Mozes si to ukladat kamkolvek chces, komponente mozes predat akukolvek sluzbu cez ktoru to budes ukladat a vyberat. Zase ti neporadi s tym kam ukladat „stav“ komponenty ked nemam ponatia o co ide, to je individualne.

Glottis
Člen | 129
+
0
-

tak jsem dal neco dohromady. funguje to tak jen jestli to je z pohledu nette tak jak by asi melo?

neon

<?php
	services:
		database: @nette.database.default
		dataTableState: DataTableState\DataTableState(@database::table(datatable_state))
?>

sluzba pro ukladani a nacitani

<?php
class DataTableState {

	/** var Nette\Database\Connection $connection */
	private $connection;

	function __construct(\Nette\Database\Table\Selection $connection)
    {
        $this->connection = $connection;
    }

	public function saveState($name, $id, $data) {
		$this->connection->where(array("table" => $name, "user_id" => $id))->delete();
		$this->connection->insert(array('table' => $name, 'user_id' => $id, 'data' => $data));

	}

	public function loadState($name, $id) {
		$tmp = $this->connection->where(array("table" => $name, "user_id" => $id))->select('data')->fetch()->data;
		return $tmp;
	}
}
?>

komponenta

<?php
class DataTable  extends Control {
	/** var DataTablesState\DataTablesState $state */
	private $state;
	private $user_id = null;

	function __construct(DataTableState\DataTableState $state)
    {
        $this->state = $state;
    }

	protected function createTemplate($class = NULL) {
		$template = parent::createTemplate();
		$template->setFile(dirname(__FILE__) . '/DataTable.latte');
		return $template;
	}

	public function setUid($uid) {
		$this->user_id = $uid;
	}

	public function render() {
		$this->template->name = $this->name;
		return $this->template->render();
	}

	public function handleSaveState() {
		$tmp = $this->presenter->request->getPost();
		$this->state->saveState($this->name, $this->user_id, $tmp['jsonData']);
		$this->presenter->sendResponse(new \Nette\Application\Responses\JsonResponse(array()));
	}

	public function handleLoadState() {
		$data = $this->state->loadState($this->name, $this->user_id);
		$this->presenter->sendResponse(new \Nette\Application\Responses\JsonResponse(array($data)));
	}
}
?>

kousek z presenteru a sablonu sem nedavam, je to jeden radek

<?php
	public function createComponentTabulka($name) {
		$t = new DataTable\DataTable($this->context->getService('dataTableState'));
		$t->setUid($this->user->id);
		return $t;
	}
?>

dik :)

vvoody
Člen | 910
+
0
-

Z pohladu nette tam nevidim ziadny problem, len neviem ci je vnodne pre kazdu komponentu mat vlastnu tabulku. Ak chces dodrzovat DI tak by si nemal pristupovat ku contextu, cize sluzby by si mal ziskat cez constructor presenteru.

Glottis
Člen | 129
+
0
-

ted nevim jestli uplne chapu. takhle si to myslel?

<?php
class nejakyPresenter extends BasePresenter
{
	/** var DataTablesState\DataTablesState $saver */
	private $saver;

	function __construct(Nette\DI\Container $context) {
		parent::__construct($context);

		$this->saver = $context->getService('dataTableState');
	}



public function createComponentTableCdr($name) {
		$t = new DataTable\DataTable($this->saver);
		$t->setUid($this->user->id);
		$t->filter(false);
?>
vvoody
Člen | 910
+
0
-
<?php
class nejakyPresenter extends BasePresenter
{
	/** var DataTablesState\DataTablesState $saver */
	private $saver;

	function __construct(Nette\DI\Container $context, DataTableState $saver) {
		parent::__construct($context);

		$this->saver = $saver;
	}



public function createComponentTableCdr($name) {
		$t = new DataTable\DataTable($this->saver);
		$t->setUid($this->user->id);
		$t->filter(false);
?>

Takto. Jednoducho podla DI by zavislosti (npr tvoj saver) mal zabezpecovat vzdy nadradeny objekt a nie si ich ziskavat zo vzduchu (z contextu) pocass behu presenteru.

Preco sa potom predava context v konstruktore? Kvoli spatnej kompatibilite :)

edit: teraz pozeram aka je vlastne cesta k tej triede DataTableState, vsade pouzivas DataTableState\DataTableState celkom nechapem :) namespace sa vola tak isto ako trieda?

Editoval vvoody (17. 5. 2012 12:40)

Glottis
Člen | 129
+
0
-

aha, no me prave matlo to ze tam stejne ten context ( klavir? :) ) dat musim protoze ho potrebuje baseprasenter. tak mi prislo zbytecne to tam davat jeste jednou ale je to takhle jasnejsi to jo.

jj namespace sejmenuje stejne jako trida ale to si jen tak hraju, to pak nejak prejmenuju. se s temahle novotama zatim spis tak seznamuju :)