Grido – DataGrid pro Nette

xxxmisko
Člen | 140
+
0
-

o5:

takisto používam dibi a postgres ako Kryšpin. Čo sa týka prekladov, používaš tam vlastný translator, nie všetky slovíčka mi chcelo preložiť s pomocou toho môjho.

o5
Člen | 416
+
0
-

@xxxmisko: Tyjo, to je ale diskuze :) Translátor co je součástí Grida se použije jen pokud není nastaveno jinak, viz. Která slova se ti nepodařilo přeložit? Ty které obsahují placeholdery?

Editoval o5 (22. 3. 2013 9:58)

xxxmisko
Člen | 140
+
0
-

o5:

nehnevaj sa na mňa, som nováčik :D

‚Môžete použiť <, <=, >, >=, <>. Napr.: „>= %d“‘ ⇒ ‚You can use <, <=, >, >=, <>. Např.: „>= %d“‘,
‚Vyberte riadok‘ ⇒ ‚Select some row‘,
‚Označené…‘ ⇒ ‚Selected…‘,
‚Reset‘ ⇒ ‚Reset‘,
‚Hľadať‘ ⇒ ‚Search‘,
‚Položiek na stránke‘ ⇒ ‚Items per page‘,
‚Tlačiť‘ ⇒ ‚Print‘,
‚Zmazať‘ ⇒ ‚Delete‘,
‚Ste si istý, že chcete zmazať túto položku?‘ ⇒ ‚Are you sure, you want to delete this item?‘,

tieto mi prekladač nezožral.

Kryšpin
Člen | 27
+
0
-

Tak jsem trošku opět narazil.

Testoval jste někdo filtr?

<?php
->setFilter(Grido\Components\Filters\Filter::TYPE_CHECK);
?>

Pokud jej použiji, tak generátor pro dibifluent vyplodí toto:

SELECT COUNT(*) FROM `view_temata WHERE (obhajeno IS NOT NULL ) 1 LIMIT 1`

Je tam navíc ta jednička za podmínkou.

o5
Člen | 416
+
0
-

Tu tecku si sem neposlal (nevidim ji)? Jinak nevim kde je problem, v demu checkbox filtr funguje.

Editoval o5 (25. 3. 2013 11:23)

Kryšpin
Člen | 27
+
0
-

Jakou tečku?

A v demu nemáš checkbox ve filtru. Tak oprava .. je tam. Ale to demo, asi nemáš přes dibifluent?

o5 napsal(a):

Tu tecku si sem neposlal (nevidim ji)? Jinak nevim kde je problem, v demu checkbox filtr funguje.

Editoval Kryšpin (25. 3. 2013 11:33)

o5
Člen | 416
+
0
-

Aha Pondeli! Jinak nevim, sry.

tomastomb
Člen | 9
+
0
-

Ahoj,
chtěl bych poprosit o opravu exportu do CSV.
Již zde zmiňovaná chyba:
Illegal offset type in isset or empty
se u mě projevuje i při exportu tabulek, které nejsou joinované a obsahují sloupec datum ve formátu: „rrrr-dd-mm hh:ii:ss“.
Chyba je v souboru: Column.php v místě:
277: protected function applyReplacement($value)
278: {
279: return isset($this->replacements[$value])
po kliknutí na tlačítko export.

Existuje nějaké řešení, jak to opravit? Moc děkuji

o5
Člen | 416
+
0
-

@tomastomb: mas aktualni verzi Grida? (ty radky co jsi uvedl nesedi na aktualni verzi) ladenka? definice gridu?

Editoval o5 (25. 3. 2013 12:43)

xxxmisko
Člen | 140
+
0
-

ahoj!

dnes som skúšal nahodiť najnovšiu verziu grido, po nahratí nového grida a zmazaní cache mi hodila ladenka fatal error.

Keby ste mali podobný problém, treba zmeniť use na začiatku skriptu.

Ďakujem

Editoval xxxmisko (25. 3. 2013 13:45)

Kryšpin
Člen | 27
+
0
-

Tak jsem laboroval na tím jak jsem psal výše:

<?php
	//Sloupec
	$grid->addColumn('obsazeno2', 'Obsazeno', Grido\Components\Columns\Boolean::TYPE_BOOLEAN)
		->setSortable()
		->setFilter(Grido\Components\Filters\Filter::TYPE_CHECK);
?>

Filter není vůbec použitelný. V DEMU je ukázka pouze pro použití vlastní podmínky:

<?php
	//Sloupec
	$grid->addColumn('obsazeno2', 'Obsazeno', Grido\Components\Columns\Boolean::TYPE_BOOLEAN)
		->setSortable();

	//Filtry
	$grid->addFilter('obsazeno2', 'Obsazeno:', Grido\Components\Filters\Filter::TYPE_CHECK)
		->setCondition(Grido\Components\Filters\Filter::CONDITION_CUSTOM, array(
		TRUE => '[obsazeno2] > 0'
?>

Ten samozřejmě funguje, protože se řídí podmínkou uvedenou v setCondition.

Očekával bych při nedodání vlastní podmínky, že to bude fungovat také, ale nefunguje. Generuje to pak nesmyslný SQL dotaz (a není to chyba dibifluent, ale už základu).

SELECT COUNT(*) FROM `view_temata WHERE (obsazeno2 IS NOT NULL ) 1 LIMIT 1

Chybná je funkce makeFilter a proměnná $conditionCheck.php. Tento filtr jak je napsán nemůže fungovat a ztrácí smysl. Předává totiž v poli 2 proměnné ((obsazeno2 IS NOT NULL ) a 1), ale v $condition není pro ni připravená substituce a tak se přiřadí nakonec za závorku.

Pro svoji potřebu jsem si vytvořil fungující filtr Check2.php a přidal do Filter.php.

<?php
namespace Grido\Components\Filters;

/**
 * Check2 box filter.
 *
 * @package     Grido
 * @subpackage  Components\Filters
 * @author      Pavel Kryštůfek
 */
class Check2 extends Filter
{
	/* representation TRUE in URI */
	const TRUE = '✓';

	/** @var string for ->where('<column> > 0) */
	protected $condition = '>';

	/**
	 * @return \Nette\Forms\Controls\Checkbox
	 */
	protected function getFormControl()
	{
		return new \Nette\Forms\Controls\Checkbox($this->label);
	}

	/**
	 * @param string $column
	 * @param string $value
	 * @return array condition|value
	 */
	public function _makeFilter($column, $value)
	{
		$condition = array(
			"[$column] ".$this->condition." %i", 0
		);
		return $condition;
	}

	/**
	 * @internal
	 * @param bool $value
	 * @return string
	 */
	public function changeValue($value)
	{
		return $value === TRUE ? self::TRUE : $value;
	}
}
?>

Uvažuji správně?

tomastomb
Člen | 9
+
0
-

o5 napsal(a):

@tomastomb: mas aktualni verzi Grida? (ty radky co jsi uvedl nesedi na aktualni verzi) ladenka? definice gridu?

Aktuální verzi jsem neměl, provedl jsem update a chyba zůstala. Hlášení laděnky je nyní toto:

Warning
Illegal offset type in isset or empty

Source file ▼

File: …/home/libs/Grido/Components/Columns/Column.php Line: 284

274: return $row->$column;
275: } elseif (is_callable($column)) {
276: return callback($column)->invokeArgs(array($row));
277: } else {
278: throw new \Nette\InvalidArgumentException(‚Column must be string or callback.‘);
279: }
280: }
281:
282: protected function applyReplacement($value)
283: {
284: return isset($this->replacements[$value])
285: ? str_replace(self::VALUE_IDENTIFIER, $value, $this->replacements[$value])
286: : $value;

Definice Gridu – presenter:

<?php
    protected function createComponentZobraz($name) {
        $grid = new Grid($this, $name);
        $grid->setTranslator(new \Grido\Translations\FileTranslator("cs"));

        $fluent = $this->getTableService()->vypis();

        $grid->setModel($fluent);

        $grid->addColumn('id', 'id')
                ->setSortable()
                ->setFilter();

        $grid->addColumn('stav', 'stav')
                ->setSortable()
                ->setFilter()
                ->setSuggestion();

        $grid->addColumn('platnost_do', 'platnost do')
                ->setSortable()
                ->setFilter()
                ->setSuggestion();

        $grid->addAction('editovat', 'Edituj')
                ->setIcon('pencil');

        $grid->addAction('dataGridSmaz', 'Smaž')
                ->setIcon('trash')
                ->setConfirm('Opravdu chcete tuto položku vymazat?');

        $operations = array('dataGridSmaz' => 'Delete');
        $grid->setOperations($operations, callback($this, 'gridOperationsHandler'))
                ->setConfirm('dataGridSmaz', 'Opravdu chcete vymazat %i položek?');

        $grid->setExporting();
        $grid->setRememberState(true);
    }
?>

model:

<?php
    public function vypis() {
        $rows = $this->connection->table($this->getTable());
        return $rows;
    }
?>

Zde si myslím, že je chyba:

Variables ▼

$value
Nette\DateTime(3) ▼ {
date ⇒ „2013–04–21 16:22:38“ (19)
timezone_type ⇒ 3
timezone ⇒ „Europe/Prague“ (13)
}

Stačí tyto informace? Děkuju

o5
Člen | 416
+
0
-

@Kryšpin: opraveno

o5
Člen | 416
+
0
-

@tomastomb: Ve verzi Grida co máš, je potřeba pro export specifikovat, že se jedná o TYPE_DATE. Takto:

$grid->addColumn('platnost_do', 'platnost do', Column::TYPE_DATE);

Přidal jsem ale raději podmínku i do Column, pokud by tam někdo chtěl posílat něco jiného než string. Takže si stáhni aktuální verzi Grida pokud nechceš specifikovat typ.

TIP: ta česká mutace tam jde nastavit i jednodušeji ;)

$grid->translator->lang = 'cs';
lubos.bajkai
Člen | 6
+
0
-

Dobrý den,

rád bych Vás požádal o radu, datagrid je super ale aktualně řešíme problem kdy v datagridu mame tlačítka VIEW / EDIT / DELETE. Jedna se o seznam uživatelu a chceme znepřístupnit nekteré tlačítka pro EDITACI a MAZANI pro nekteré položky v gridu dle opravnení. V podstate to znamena že když se někdo s opravnením ADMIN podívá do teto tabulky tak bude mít možnost smazat a editovat uživatele se stejným nebo nižším opravněním ale u žádku s uživatelem SUPERVISOR by neměl vidět tlačítka EDIT / DELETE popřípadě by měli být neaktivní. Popravdě nemame moc zkušeností s použitím datagridu a popřebujeme jen trošičku nasměrovat.

o5
Člen | 416
+
0
-

@lubos.bajkai: Je to v dokumentaci

$grid->addAction('edit', 'Edit')
	->setDisable(function($item) {
		return $item->gender == 'male';
});

Editoval o5 (27. 3. 2013 11:50)

lubos.bajkai
Člen | 6
+
0
-

děkuji :-D

tomastomb
Člen | 9
+
0
-

o5 napsal(a):

@tomastomb: Ve verzi Grida co máš, je potřeba pro export specifikovat, že se jedná o TYPE_DATE. Takto:

$grid->addColumn('platnost_do', 'platnost do', Column::TYPE_DATE);

Přidal jsem ale raději podmínku i do Column, pokud by tam někdo chtěl posílat něco jiného než string. Takže si stáhni aktuální verzi Grida pokud nechceš specifikovat typ.

TIP: ta česká mutace tam jde nastavit i jednodušeji ;)

$grid->translator->lang = 'cs';

Stáhnul jsem si aktuální verzi a export funguje perfektně.
Děkuju za opravu, jsem spokojený :-)
A definice translatoru je taky fajn, měl jsem to poněkud kostrbaté :-)

Btw: Nešlo by založit nějaký version log, kde by se vedly verze s popisem, co je nového či opraveného a případně s ukázkou použití? Vím, že je to vidět na Githubu, ale pokud kódu úplně nerozumím, je těžké pochopit, o co ve změnách jde.

o5
Člen | 416
+
0
-

@tomastomb: zatim jsem tam neposlal nic prevratneho, takze na chanchelog to neni :] ale tak sleduj ten github a hod tam comment cemu nerozumis, rad odpovim.

edit: changelog je tady

Editoval o5 (3. 4. 2014 11:49)

cujan
Člen | 410
+
0
-

ako tam dostanem tie pekne tlacitka v pripade napr. edit…ak zadat setIcon(‚pencil‘) tak sa nic neudeje

vdaka

cujan
Člen | 410
+
0
-

Caute potrebujem do grido zobrazit udaje prepojene s inej tabulky cudzim klucom..
proste mam tabulku vychovavatel(meno, priezvisko, idSkupina) Skupina(id,nazov)
a proste vo vypise potrebujem zobrazit meno, priezvisko, Nazov skupiny

Vdaka

o5
Člen | 416
+
0
-

@cujan: na ten předchozí dotaz jsem nereagoval, protože to že ti něco nejde je fakt málo na odpověd..oboje je zmíněné v examplu, tak to zkus okoukat tam.

cujan
Člen | 410
+
0
-

no model som nastavil takto

<?php
$grid->setModel($this->context->vychovavateliaRepository->findAll());
?>

ale zrejme som nastavil iba pohlad na tabulku vychovavatel

lebo skusil som nastavit stlpec takto

<?php
$grid->addColumn('skupina', 'Skupina')->setColumn('skupina->nazov');
?>

ale to mi akosi nefunguje…

o5
Člen | 416
+
0
-

cujan napsal(a):

no model som nastavil takto

<?php
$grid->setModel($this->context->vychovavateliaRepository->findAll());
?>

ale zrejme som nastavil iba pohlad na tabulku vychovavatel

lebo skusil som nastavit stlpec takto

<?php
$grid->addColumn('skupina', 'Skupina')->setColumn('skupina->nazov');
?>

ale to mi akosi nefunguje…

Něco podobného se tu nedávno řešilo.

EDIT: do dokumentace jsem to zapomněl dát, přidám

Editoval o5 (3. 4. 2013 14:02)

tomastomb
Člen | 9
+
0
-

Měl bych zase jednu otázečku: jak nastavit jiný styl tlačítku delete?
Konkrétně bych chtěl ke class btn-mini (generovaný Grido) doplnit ještě class btn-danger.
Nejspíš se jedná o použití metody getElementPrototype(), ale nevím jak.
Moc děkuju

tomastomb
Člen | 9
+
0
-

tomastomb napsal(a):

Měl bych zase jednu otázečku: jak nastavit jiný styl tlačítku delete?
Konkrétně bych chtěl ke class btn-mini (generovaný Grido) doplnit ještě class btn-danger.
Nejspíš se jedná o použití metody getElementPrototype(), ale nevím jak.
Moc děkuju

Nakonec jsem na to přišel sám pokusem :-), tak kdyby to někdo řešil taky:

<?php
        $grid->addAction('dataGridSmaz', 'Smaž')
                ->setIcon('trash')
                ->setConfirm('Opravdu chcete tuto položku vymazat?')
                ->getElementPrototype()->class[] = 'btn-warning';
?>
cujan
Člen | 410
+
0
-

o5 napsal(a):

cujan napsal(a):

no model som nastavil takto

<?php
$grid->setModel($this->context->vychovavateliaRepository->findAll());
?>

ale zrejme som nastavil iba pohlad na tabulku vychovavatel

lebo skusil som nastavit stlpec takto

<?php
$grid->addColumn('skupina', 'Skupina')->setColumn('skupina->nazov');
?>

ale to mi akosi nefunguje…

Něco podobného se tu nedávno řešilo.

EDIT: do dokumentace jsem to zapomněl dát, přidám

no pridal som tam nieco take

<?php
$grid->addColumn('skupina', 'Skupina')->setColumn(function($item){
                        return $item->skupina->nazov;
?>

a zatial to nefacha…

o5
Člen | 416
+
0
-

cujan napsal(a):

no pridal som tam nieco take

<?php
$grid->addColumn('skupina', 'Skupina')->setColumn(function($item){
                        return $item->skupina->nazov;
?>

a zatial to nefacha…

Těžko říct z jakého důvodu ti to nefachá, tipuju že tam nebudeš mít správně nastavené primární klíče v tabulce…

cujan
Člen | 410
+
0
-

ono jak tak nato pozeram…tak model mam nastaveny tabulku vychovavatel, cize ako ono pozna tabulku skupina?

moj cely presenter vyzera takto

<?php
<?php
use Grido\Grid,
    Grido\Components\Filters\Filter,
    Grido\Components\Columns\Column,
    Nette\Utils\Html,
    Nette\Application\UI\Form;
/**
 * Description of VychovavateliaPresenter
 *
 * @author cujan
 */
class VychovavateliaPresenter extends BasePresenter {

    /**
     * (non-phpDoc)
     *
     * @see Nette\Application\Presenter#startup()
     */
    private $vychovavateliaRepository;
    private $skupinaRepository;

    protected function startup() {
	parent::startup();
	$this->vychovavateliaRepository = $this->context->vychovavateliaRepository;
	$this->skupinaRepository = $this->context->skupinaRepository;

    }

    public function actionDefault() {

    }

    public function renderDefault() {

    }

    /************** edit ****************************/
    public function renderEdit($id = 0)
	{
		$form = $this['vychovavateliaForm'];
		if (!$form->isSubmitted()) {
			$vychovavatel = $this->vychovavateliaRepository->findById($id);
			if (!$vychovavatel) {
				$this->error('Zaznam nenajdeny');
			}
			$form->setDefaults($vychovavatel);
		}
	}

   /********************* view delete *********************/



	public function renderDelete($id = 0)
	{
		$this->template->vychovavatelia = $this->vychovavateliaRepository->findById($id);
		if (!$this->template->vychovavatelia) {
			$this->error('Record not found');
		}
	}


    //grid udajjov o vychovavateloch
    protected function createComponentGridVychovavatelia($name)
    {
	$grid = new Grid($this, $name);
	$grid->translator->lang = 'cs';
	$grid->setModel($this->context->vychovavateliaRepository->findAll());
	$grid->addColumn('priezvisko', 'Priezvisko')->setSortable()->setFilter();
	$grid->addColumn('meno', 'Meno')->setSortable()->setFilter();
	$grid->addColumn('skupina', 'Skupina')->setColumn(function($item){
                        return $item->skupina->nazov;
                    });
	$grid->addAction('edit', 'Edit')->setIcon('pencil');
	$grid->addAction('delete', 'Delete')->setIcon('pencil');
	//$grid->setOperations(array('delete' ⇒ 'Delete'), function($operation, $id)  );
    }

    protected function createComponentVychovavateliaForm() {
	$form = new Form;
	$form->addText('priezvisko', 'Priezvisko');
	$form->addText('meno', 'Meno');
	$form->addSubmit('save', 'Uloz')->onClick[] = $this->albumFormSucceeded;
	$form->addSubmit('cancel', 'Cancel')->setValidationScope(NULL)->onClick[] = $this->formCancelled;

	return $form;
    }

    public function albumFormSucceeded($button)
	{
		$values = $button->getForm()->getValues();
		$id = (int) $this->getParameter('id');
		if ($id) {
			$this->vychovavateliaRepository->findById($id)->update($values);
			$this->flashMessage('The album has been updated.');
		} else {
			$this->vychovavateliaRepository->insert($values);
			$this->flashMessage('The album has been added.');
		}
		$this->redirect('default');
	}


    public function formCancelled()
	{
		$this->redirect('default');
	}

	/**
	 * Delete form factory.
	 * @return Form
	 */
	protected function createComponentDeleteForm()
	{
		$form = new Form;
		$form->addSubmit('cancel', 'Cancel')
			->onClick[] = $this->formCancelled;

		$form->addSubmit('delete', 'Zmaž')
			->setAttribute('class', 'default')
			->onClick[] = $this->deleteFormSucceeded;

		$form->addProtection();
		return $form;
	}

	public function deleteFormSucceeded()
	{
		$this->vychovavateliaRepository->findById($this->getParameter('id'))->delete();
		$this->flashMessage('Vzychovávateľ bol úspešne vymazaný.');
		$this->redirect('default');
	}



//koncova zatvorka
}
?>
o5
Člen | 416
+
0
-

@cujan: Tady ale vůbec nejde o Grido ale o joinování v Nette\Database…Zkus pohledat jak se to má řešit. Tohle už je starší vlákno, ale mohlo by ti pomoci.

Znovu i pro ostatní, nevkládejte sem posty typu „nejde mi to“, fakt neznám lidi co umí věštit!

Editoval o5 (4. 4. 2013 15:17)

quiced
Člen | 85
+
0
-

Zdravím,

snažím se vyřešit menší problém. Potřebuju Grido použít pro různé kategorie, které rozpoznávám přes ID přenášené přes Get. Problém je v tom, že nevím jak nastavit filter u Grida tak, aby počítal s tímto ID a tudíž mi filtrovat z dat v té jedné kategorii.

V dokumentaci jsem narazil na setCondition, což by mělo moje potíže vyřešit, bohužel se mi tuto funkci nepodařilo rozchodit. Snažil jsem se to použít takto

$grid->addColumn('title', 'Název')
        ->setFilter()
        ->setSuggestion()
        ->setDefaultValue($url)
        ->setCondition(Filter::CONDITION_CUSTOM, array('catid' => $catid));

Dokázal by mi někdo poradit? Díky.

tomastomb
Člen | 9
+
0
-

Jen zasílám zjištěnou vlastnost ukládání stavu Grido, funkce $grid->setRememberState().
Měl jsem konstrukci:

<?php
class UzivatelePresenter {
    protected function createComponentZobraz($name) {
    ...
    }
}
?>

a následně třeba:

<?php
class AktivityPresenter {
    protected function createComponentZobraz($name) {
    ...
    }
}
?>

Pokud v obou komponentách použiju funkci setRememberState, tak se uložený stav přepisuje. Nejspíše se do sessions ukládá jméno komponenty, které je v obou případech stejné. Řešením je mít každou komponentu pojmenovanou jinak.

o5
Člen | 416
+
0
-

@tomastomb: to bude bug, každopádně příště prosím rovnou do issues :)

tomastomb
Člen | 9
+
0
-

Znovu bych potřeboval otevřít diskuzi k tématu spojování tabulek.
Proč nemůžu používat tečkový zápis při definici Grida?

<?php
        $grid->addColumn('inzeraty.id', 'id');
?>

Mám dvě tabulky propojené cizím klíčem a pokud použiji filtr, definovaný takto:

<?php
        $grid->addColumn('id', 'id')
                ->setSortable()
                ->setFilter();
?>

dostanu chybu:
SQLSTATE[23000]: Integrity constraint violation: 1052 Column ‚id‘ in where clause is ambiguous

Pokud filtr nepoužiji, data se zobrazí.
Jak Gridu říct, že potřebuju sestavit where podmínku podle inzeraty.id nikoliv jen podle id?
Zkoušel jsem řešení i přes view, a zde zase dostávám chybu:
Filter with name ‚id‘ does not exist.

Děkuju

Petr Bugyík
Člen | 4
+
0
-

tomastomb napsal(a):

Proč nemůžu používat tečkový zápis při definici Grida?

Protoze je to proste nazev komponenty,stejne jako je tomu napr. u formularu. Zkus pouzit za tim setFilter() metodu setColumn()..

Editoval Petr Bugyík (10. 4. 2013 16:23)

tomastomb
Člen | 9
+
0
-

Nemohl bych poprosit o ukázku funkčního spojení dvou tabulek, kde by fungovalo filtrování dle stejného sloupce (id)?
Pokud použiji setColumn, takto:

<?php
        $grid->addColumn('id', 'id')
                ->setSortable()
                ->setFilter()
                ->setColumn(function($item){
                    return $item->inzeraty->id;
                });
?>

Dostávám chybu:
Warning

Illegal offset type

Source file ▼
File: …/home/libs/Grido/Components/Filters/Filter.php Line: 100

98: public function setColumn($column, $operator = self::OPERATOR_AND)
99: {
100: $this->columns[$column] = $operator;
101: return $this;
102: }

Data získávám takto:

<?php
          $fluent = \dibi::select('inzeraty.*')
          ->select('uzivatele.uzivatelske_jmeno')
          ->from('inzeraty')
          ->leftJoin('uzivatele')->on('uzivatele.id = inzeraty.uzivatele_id')
          ;
?>

Děkuju

Petr Bugyík napsal(a):

tomastomb napsal(a):

Proč nemůžu používat tečkový zápis při definici Grida?

Protoze je to proste nazev komponenty,stejne jako je tomu napr. u formularu. Zkus pouzit za tim setFilter() metodu setColumn()..

xxxmisko
Člen | 140
+
0
-

Ahoj!

pro použití mssql a dibifluent sa vyskytuje chybka v DibiFluent.php, kedy sa nevie urobiť count(), ale musí tam byť count() as nieco, potom to ide. Neviem, či je to správne riešenie, ale funguje :D

dibiFluent.php

public function getCount()
{
	$fluent = clone $this->fluent;
	return $fluent->removeClause('ORDER BY')->removeClause('SELECT')->select('COUNT(*) as pocet')->fetchSingle();
	//return $fluent->removeClause('ORDER BY')->removeClause('SELECT')->select('COUNT(*)')->fetchSingle();
}

Editoval xxxmisko (11. 4. 2013 12:25)

Kryšpin
Člen | 27
+
0
-

o5 vrátil předhozí změnu nazpět v tomto commitu:

https://github.com/…3ada5406cbd5

takže nyní je v master opět

<?php
public function getCount()
     {
         $fluent = clone $this->fluent;
         return $fluent->count();
     }
?>

xxxmisko napsal(a):

Ahoj!

pro použití mssql a dibifluent sa vyskytuje chybka v DibiFluent.php, kedy sa nevie urobiť count(), ale musí tam byť count() as nieco, potom to ide. Neviem, či je to správne riešenie, ale funguje :D

dibiFluent.php

public function getCount()
{
	$fluent = clone $this->fluent;
	return $fluent->removeClause('ORDER BY')->removeClause('SELECT')->select('COUNT(*) as pocet')->fetchSingle();
	//return $fluent->removeClause('ORDER BY')->removeClause('SELECT')->select('COUNT(*)')->fetchSingle();
}
xxxmisko
Člen | 140
+
0
-

aha, to som si nevšimol, idem nahodiť najnovšiu verziu grido, uvidím

tomastomb
Člen | 9
+
0
-

Díky Kryšpinovi je můj dotaz vyřešen. Tímto mu velmi děkuji za záchranu.
Při získávání dat u tabulky s joinovaným spojením stačí vytvořit VIEW a tento view jde následně získat takto:

<?php
$fluent = \dibi::select('*')
              ->from('view...');
?>

případně v ORM:

<?php
$fluent = ...->connection->table('view...')->select('*');
?>

Důvod, proč se mi Grido nenačetlo, byl chybějící příkaz select(‚*‘).

tomastomb napsal(a):

Nemohl bych poprosit o ukázku funkčního spojení dvou tabulek, kde by fungovalo filtrování dle stejného sloupce (id)?
Pokud použiji setColumn, takto:

<?php
        $grid->addColumn('id', 'id')
                ->setSortable()
                ->setFilter()
                ->setColumn(function($item){
                    return $item->inzeraty->id;
                });
?>

Dostávám chybu:
Warning

Illegal offset type

Source file ▼
File: …/home/libs/Grido/Components/Filters/Filter.php Line: 100

98: public function setColumn($column, $operator = self::OPERATOR_AND)
99: {
100: $this->columns[$column] = $operator;
101: return $this;
102: }

Data získávám takto:

<?php
          $fluent = \dibi::select('inzeraty.*')
          ->select('uzivatele.uzivatelske_jmeno')
          ->from('inzeraty')
          ->leftJoin('uzivatele')->on('uzivatele.id = inzeraty.uzivatele_id')
          ;
?>

Děkuju

Petr Bugyík napsal(a):

tomastomb napsal(a):

Proč nemůžu používat tečkový zápis při definici Grida?

Protoze je to proste nazev komponenty,stejne jako je tomu napr. u formularu. Zkus pouzit za tim setFilter() metodu setColumn()..

xxxmisko
Člen | 140
+
0
-

Ahojte!

chcem, aby sa v operations dalo presmerovať na inú stránku, resp. nejaký formulár.

$operations = array('print' => 'Tlačiť', 'delete' => 'Zmazať');
       $grid->setOperations($operations, callback($this, 'gridOperationsHandler'))
           ->setConfirm('delete', $this->translator->translate('Chcete zmazať %i položiek?'));

Momentálne sa spúšťa funkcia gridOperationsHandler, ktorá spúšťa ďalšiu funkciu na základe názvu operácie. Otázka je, ako by som vedel urobiť presmerovanie na formulár, ktorého parametrami by bolo pole vybraných id-čiek, aby som im vedel nastaviť nejaké hromadné hodnoty? Napríklad 5-tim ľuďom by som nastavil výšku 180cm, iba 1× a naraz.

Dúfam, že ste ma pochopili, ďakujem

o5
Člen | 416
+
0
-

@xxxmisko: ten dotaz vůbec nesouvisí s Grido…prostě ten gridOperationsHandler tě přesměruje na akci a tam si uděláš sám co chceš ty, teda klidně i další redirect.

tomhrb
Člen | 23
+
0
-

ahojte.
muze me prosim nekdo nasmerovat jak efektivne na EXPORT VSECH SLOUPCU dat (predava se nekolik spojenych tabulek, pouzivam dibiFluent) s ohledem na aktualni filtry, ale bez ohledu na sloupce, ktere se prave zobrazuji?

dekuji za pomoc.

o5
Člen | 416
+
0
-

@tomhrb: to Grido neumí, ale neměl by být problém si to dopsat.

class MyExport extends \Grido\Components\Export
{
	protected function generateCsv($data, $columns)
	{
		//...
	}
}

//a pak...
$grid->setExporting(NULL, 'MyExport');

Editoval o5 (16. 4. 2013 11:26)

tomhrb
Člen | 23
+
0
-

Diky Petre!
dekuju

factor
Člen | 28
+
0
-

Dobrý podvečer,
chtěl bych se zeptat, grido nepodporuje multiselect ve filtrech?

Díky

o5
Člen | 416
+
0
-

@factor: Multiselect Grido neumí, nikdy sem ho nepotřeboval. Ale tak zkus otevřít na GitHubu issue s popiskem, jak by to mělo fungovat – default condition by mohla být IN operátor ne?

pjoter
Člen | 118
+
0
-

Opět jsem se vrátil ke svému starému problému pro vlastní confirm dialog v hromadných operacích. Neporadil by mě prosím někdo jak na to?

pjoter napsal(a):

Zdarec,

nejprve bych chtěl poděkovat za výborný grid. Seznamujeme se a potřeboval bych trochu popostrčit. Řeším vlastní confirm dialogy (konkrétně bootstrap), chcu se optat – u akci pro jednotlivy radek je to easy preventnu default a tlacitku v dialogu pridam href akce.

Jak je to ale u hromadne akce?

Zkousim neco takoveho ale bez sance.

<script>
...
            onSubmit: function(e)
            {
                var itemsCount = $($.grido.operations.selector + ':checked', $.grido.$element).length,
                    hasConfirm = $.grido.operations.getSelect().attr(
                        'data-grido-' + $.grido.operations.getSelect().val()
                    );

                if(hasConfirm)
                {
                    e.preventDefault();
                }
                return hasConfirm
                    ? showDialog(hasConfirm.replace(/%i/g, itemsCount),0,$(this).parent('form'))
                    : true;
            },

...

function showDialog(message,href,form)
{
    $('#formConfirmModal .modal-body').html('<p>' + message + '</p>');
    $('#formConfirmModal').modal('show');
    if(href) {
        $('#formConfirmModal .modal-footer a.yes').attr('href',href);
    }
    else {
        $('#formConfirmModal .modal-footer a.yes').on('click',function() { form.submit(); });
    }


}
</script>

Predem diky za tipy.

o5
Člen | 416
+
0
-

pjoter napsal(a):

Zkousim neco takoveho ale bez sance.

S tímto popisem seš opravdu bez šance, že ti někdo poradí.

ladan
Člen | 4
+
0
-

Zdravím,

chtěl bych se zeptat, zdali lze nějakým elegantním a rychlým způsobem vytvořit grid (setModel()) z dvourozměrného pole.
Resp. mám dvourozměrné pole a rád bych ho zobrazil uživateli pomocí Gridu.

Děkuji za nápady či řešení.