paginator : ltrim() expects parameter 1 to be string, object given

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

Dobrý den, vypsal jsem si z databáze inzeráty a rozhodl jsem se, že k výpisu přidám VisualPaginator.

Zkusil jsem to sepsat, ale debugger mi vypisuje chybovou hlášku.. ikdyž je to jenom warning tak to neprojde :-)

Warning
ltrim() expects parameter 1 to be string, object given

moje databázová vrstva je v samostatném modelu

class InzeratyModel {

   public static function insert($data){
        dibi::query('INSERT INTO [inzeraty]', $data);
    }

    public static function showAll(){
        $result = dibi::query('SELECT * FROM inzeraty');
        return $result->fetchAll();
    }
}

potom asi nejdůležitější, presenter.

class ZobrazitInzeratyPresenter extends BasePresenter {

    public function renderDefault(){
        /* paginator */
        //do promenne $conn se vlozi aktualni spojeni
        $conn = dibi::getConnection();
        //do dataSource vlozim resultset z databaze
        $dataSource = $conn->dataSource(InzeratyModel::showAll());
        //dataSource a paginator pak upravuji dle potreb
        $dataSource->orderBy('datumVlozeni', dibi::DESC);
        $paginator = $this['paginator']->getPaginator(); //$this['paginator'] mi není uplně jasné
        $paginator->itemCount = $dataSource->getTotalCount();
        $dataSource->applyLimit($paginator->itemsPerPage, $paginator->offset);
        //do entries vlozim upraveny dataSource(resultset)
        //s entries pak mohu pracovat v sablone
        $this->template->entries = $dataSource;
    }

    protected function createComponentPaginator(){
        $visualPaginator = new VisualPaginator();
        $visualPaginator->paginator->itemsPerPage = 10; /*tohle by možná v rámci lepší logiky,
	mělo být ve funkci renderDefault() */
        return $visualPaginator;
    }
}

a nakonec šablona, ve které vypisuji inzeráty

{block content}

seznam inzerátů

{if count($entries) > 0}
    {control paginator}
    {foreach $entries as $entry}
    <div class="entry">
        <div class="nadpis">{$entry->nadpis}</div>
        <div class="html">{!$entry->html|escape|nl2br}</div>
        <div class="email">{$entry->email}</div>
    </div>
    {/foreach}
    {control paginator}
{else}
    <div class="flash info">Zatím tu nejsou žádné inzeráty.</div>
{/if}

pokusil jsem se to trochu okomentovat a není mi úplně jasná konstrukce
$this['paginator']->getPaginator();
název paginator a ta metoda se automaticky vytvoří pomocí továrničky createComponentPaginator()?

potom, což na funkčnost asi nemá takový vliv, když definuji a inicializuji vpaginator, tak bych tam asi už v té metodě(továrničce) createComponentPaginator() neměl nastavovat nějaké další nastavení? Pokuď mám v šabloně paginator pouze jeden tak to asi nevadí, ale jen by mě to zajímalo.

děkuji

edit:
zapoměl jsem napsat, že chybu mi to hodí v dibi/libs/DibiTranslator.php na řádce 148

147:     if ($commandIns === NULL) {
148:         $commandIns = strtoupper(substr(ltrim($this->args[0]), 0, 6));
149:         $commandIns = $commandIns === 'INSERT' || $commandIns === 'REPLAC';
150:         $sql[] = $this->formatValue($arg, $commandIns ? 'v' : 'a');
151:     } else {

Editoval muflix (7. 2. 2011 21:21)

muflix
Člen | 92
+
0
-

tak jsem přepsal metodu

public static function showAll(){
        $result = dibi::query('SELECT * FROM inzeraty');
        return $result;
        //return $result->fetchAll();
}

a prošlo to na další řádek, ale teď mi to hází

Fatal Error
Class 'Control' not found

v

30:    class VisualPaginator extends Control
31:    {

doplňek VisualPaginator jsem vložil do složky app/components/
a to je jediné co jsem s tím dělal.. pravděpodobně se tu třídu povedlo načíst přes robotLoader, který prohledává automaticky všechny složky v app/ řekl bych. To se mi líbí :-)

edit: neuvedomil jsem si ze pro php5.3 musim ve VisualPaginator.php odkomentovat namespacy

use Nette\Application\Control;
use Nette\Paginator;

teď už to běží, jen mi debugger napsal nějakou další chybu, tak se na ní podívám chjo ;p

Editoval muflix (8. 2. 2011 0:50)

muflix
Člen | 92
+
0
-

tak sem na to nepřišel.. debugger mi vyhazuje

DibiDriverException #1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1', 'inzerát 1', 'žluťoučký kůň pěl ďábelské ódy атцйтфаб?*' at line 1

na řádce 163 v dibi/drivers/mysqli.php

162:            if (mysqli_errno($this->connection)) {
163:                throw new DibiDriverException(mysqli_error($this->connection), mysqli_errno($this->connection), $sql);

a Call stack vrací něco takového

libs/DibiConnection.php (345) source ►  DibiMySqliDriver-> query (arguments ▼)
$sql
"SELECT COUNT(*) FROM ('1', 'inzerát 1', 'žluťoučký kůň pěl ďábelské ódy атцйтфаб?*( \' \'´ ´ /', 'muj@email.cz', '2011-02-07', ' ... " (2441)

nevím proč po zavolání $paginator->itemCount = $dataSource->getTotalCount(); mi to jako název tabulky bere první řádek tabulky.

muflix
Člen | 92
+
0
-

tak už to funguje :-)
stačilo upravit metodu showAll() na

 public static function showAll(){
        $result = dibi::dataSource('SELECT * FROM inzeraty');
        return $result;
}

Editoval muflix (8. 2. 2011 1:54)