Dva dotazy: přepsání sql + placeholder form

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

Ahoj,
už druhý den sedím, googlím a nevím, a proto bych se na vás rád obrátil s prosbou o pomoc. Mám zrovna dvě věci k řešení:

Problém č. 1:
Vytvořím si komponentu formulář, který později použiju v latte.

public function createComponentForumNewCommentForm(){
  $form = new Form;

  $form->addText('name', '')
        ->setAttribute('placeholder', 'Tvoje jméno');

  $form->addText('email', '')
        ->setAttribute('placeholder', 'Tvůj e-mail')
        ->setType('email');

  $form->addTextarea('message', '')
        ->setAttribute('placeholder', 'Napiš komentář...');

  $form->addSubmit('send', 'Vložit');

  return $form;
  }

Formulář se vykreslí v šabloně normálně, ale bez atributu placeholder. Když totéž udělám u přihlašovacího formuláře, který se zobrazí v zápatí stránky, placeholder se vykreslí. Nějaký nápad, pro si to takhle vymýšlí?

Problém č. 2:
Nějakou dobu už se peru s tvorbou SQL dotazů přes Nette\Database. Skripty v jednom kole vrací laděnku, ale stále se mi nedaří nějak proniknout do tý logiky myšlení (nevěděli byste třeba o linku, kde by to bylo líp popsaný? Dokumentace je tady hodně chudá…). Proč třeba záleží na pořadí: $this->connection->table("forum")->select("*") a nefunguje $this->connection->select("*")->table("forum")? Tohle mi přijde logičtější, když mám na mysli výsledný SQL „SELECT * FROM forum“, ne?

Pomohli byste mi, prosím, přepsat následující SQL dotaz? Třeba i z toho něco pochopím…

// $type (1/0)
// $limit - aktuální ID stránky mínus jedna
// $offset - počet na stránku

$this->connection->query('
    SELECT
      parent.id,
      parent.authorId,
      parent.name,
      parent.date,
      parent.receiver,
      parent.text,

      child.id AS c_id,
      child.authorId AS c_authorId,
      child.name AS c_name,
      child.date AS c_date,
      child.text AS c_text,
      child.parent AS c_parent
    FROM
      (
      SELECT
        forum.id AS r_id,
        forum.*
      FROM forum
      WHERE forum.type = ?', $type, ' AND forum.parent IS NULL
      ORDER BY forum.date DESC
      LIMIT ?, ?
      ) AS parent
    LEFT JOIN forum AS child
    ON parent.id = child.parent
    ORDER BY
      parent.date DESC,
      parent.id DESC,
      c_date,
      c_id
    ',
    ($limit * $offset), $offset
    );

Zkoušel jsem i něco takovýho:

// model:
$query = $this->connection->query('SELECT * FROM forum WHERE type = ?', $type);

// presenter:
$totalCount = count($query);
  // paginator...
$this->template->comments = $query->limit(($id - 1), $perPage)->fetchAll();

ale to mi bohužel hází pořád errory… jako že se pořád snažím přistupovat k metodě, která není součástí ResultSet, atd. Tuším, že problému bude v query() a rád bych se tomu vyhnul, ale pořád se mi nedaří se zakousnout do přepisování sql dotazů do Nette\Database…

Děkuju za vaše cenné rady a omlouvám se, že vás s nimi zatěžuju… ;) Hezký den! :)

Tirus91
Člen | 199
+
0
-

@had12:

nemělo by to být takto?

$this->template->comments = $query->fetchAll(($id - 1), $perPage);
Jan Suchánek
Člen | 404
+
0
-

@had12:

$typeId = $this->conn->table("forum")->where("type = ?",$id)->fetch()->id;


vytvor si view
    SELECT
      parent.id parent_id,
      parent.authorId parent_authorId,
      parent.name parent_name,
      parent.date parent_date,
      parent.receiver parent_receiver,
      parent.text parent_text,

      child.id AS chield_id,
      child.authorId AS chield_authorId,
      child.name AS chield_name,
      child.date AS chield_date,
      child.text AS chield_text,
      child.parent AS chield_parent
    FROM forum AS parent
    LEFT JOIN forum child ON ON parent.id = child.parent
    ORDER BY
      parent.date DESC,
      parent.id DESC,
      child.date,
      child.id

nevím píšu to z patra :)
$count = $this->conn->table("forum_view")->where("parent_id = ? AND parent_id IS NOT NULL", $typeId)->select("count(*) count")->fetch()->count;

$this->conn->table("forum_view")->where("parent_id = ? AND parent_id IS NOT NULL", $typeId)->limit($limit, $offest);

Když prostě nevím udělám si view a nehrotím to :)

Editoval jenicek (4. 4. 2014 12:27)

had12
Člen | 28
+
0
-

jenicek:

Když prostě nevím udělám si view a nehrotím to :)

To je fakt, tohle řešení mě vůbec nenapadlo, zatím to tak udělám. Je to spíš dočasný řešení, nelze se takhle přece vyhejbat všem dotazům… takhle nebudu mít motivaci se učit nový věci a řešit problémy, ale spíš je obcházet. ;)

Ty kódy ještě zkusím.

ad 1) nenapadá vás řešení?

Jan Suchánek
Člen | 404
+
0
-

@had12: No otázka je proč by si takový dotaz chtěl mít přímo v php? Ale budiž.

// count

$this->conn->query("
   SELECT
      count(forum.*)
    FROM forum AS parent
    LEFT JOIN forum child ON ON parent.id = child.parent
    WHERE parent.type = ?
    ORDER BY
      parent.date DESC,
      parent.id DESC,
      child.date,
      child.id
", $id);

// limit

$this->conn->query("
   SELECT
      parent.id parent_id,
      parent.authorId parent_authorId,
      parent.name parent_name,
      parent.date parent_date,
      parent.receiver parent_receiver,
      parent.text parent_text,

      child.id AS chield_id,
      child.authorId AS chield_authorId,
      child.name AS chield_name,
      child.date AS chield_date,
      child.text AS chield_text,
      child.parent AS chield_parent
    FROM forum AS parent
    LEFT JOIN forum child ON ON parent.id = child.parent
    WHERE parent.type = ?
    ORDER BY
      parent.date DESC,
      parent.id DESC,
      child.date,
      child.id
    LIMIT ? OFFSET ?
", $id, $limit, $offset);

Editoval jenicek (4. 4. 2014 16:09)

had12
Člen | 28
+
0
-

no, to ale stejně musím posílat dva dotazy… mě zajímá, jestli je nějaká možnost, jak v prvním kroku vytáhnout všechna data, v druhým je spočítat a ve třetím z těch vytaženejch všech dat vrátit jenom limit()… tohle není v Nette\Database implementováno?

Když jsem vytvořil view, házelo to zase error o chybějícím primary key, kterej ale view mít nemusí. Třeba už jen z tohohle důvodu bych to rád měl v PHP… navíc – tvorbou view budu mít o dotaz navíc.

Do $this->conn->query() to umím dát taky. Já bych ale rád využil těch výhod Nette\Database, o kterých se tu pořád všude básní… a doufal jsem, že třeba právě tohle počítání záznamů a jejich filtrace už v tom bude vyřešeno… zatím to ale bohužel vypadá, že tyhle „výhody“ Nette\Database jsou tvrdě vykoupený nepřehledností syntaxe… (např. jak poznám, že se jedná o SELECT * FROM…, když mi úplně chybí klauzule select() a select() ani nepodporuje zápis formou array()?).

Jak tak koukám, tak zlaté dibi, které aspoň tohle umělo: https://dibiphp.com/cs/quick-start#…

Editoval had12 (4. 4. 2014 16:42)

had12
Člen | 28
+
0
-

…s tím placeholderem mi někdo, prosím, poradí?

Ještě bych se chtěl optat, zda je někde vytvořená struktura pořadí Nette\Database funkcí (abych věděl, v jakém pořadí je lze používat) – něco, jako existuje třeba zde https://dev.mysql.com/…/select.html pro syntaxi SELECT…?

had12
Člen | 28
+
0
-

přišel jsem na problém placeholderu (píšu to sem, kdyby někdo měl stejnej problém): kolidovalo to s texy!. Stačilo vypnout Texy nad formulářem a bylo po problému.