Nefunkční úprava článků – repository

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

Zdravim,

nevíte někdo z jakého důvodu se mi místo úpravy článek vytvoří nový ?

Repository.php

	abstract class Repository extends Object {

    /** @var Database */
    protected $database;

    /** @var string */
    protected $table;

    public function __construct(Context $database) {
        $this->database = $database;
    }

    public function findAll() {
        return $this->database->table($this->table);
    }

    public function findBy($where) {
        return $this->findAll()->where($where);
    }

    public function update($where,$data){
        return $this->findBy($where)->update($data);
    }
}

ArticleRepository.php

public function updateArticle($id,$title,$url,$content) {
    $this->update($id,[
        self::COLUMN_TITLE => $title,
        self::COLUMN_URL => Strings::webalize($url),
        self::COLUMN_CONTENT => $content
    ]);
}

ArticlePresenter.php

public function actionEdit($id) {
    $this->id = $id;
    $article = $this->articleRepository->getArticle($id);
    if(!$article){
        $this->error('Článek nebyl nalezen');
    }
    $this['articleForm']->setDefaults($article->toArray());
}

ArticleFormFactory.php

public function create($id,callable $onSuccess) {
        $form = $this->factory->create();
        $form->addText('title','Název článku')
             ->setRequired();
        $form->addText('url','URL adresa');
        $form->addTextArea('content','');
        $form->addSubmit('save','Uložit');
        $form->onSuccess[] = function (Form $form,$values) use ($id,$onSuccess) {
            try{
                if($id) {
                    $article = $this->articleRepository->updateArticle($id,$values->title,$values->url,$values->content);
                } else {
                    $this->articleRepository->createArticle($values->title,$values->url,$values->content);
                }
            } catch (Exception $e) {
                $form->addError('Nepodařilo se vytvořit článek');
                return;
            }
            $onSuccess();
        };
        return $form;
    }

Děkuji

CZechBoY
Člen | 3608
+
0
-

Ještě pošli createComponent v presenteru

kiCkZ
Člen | 153
+
0
-

CZechBoY napsal(a):

Ještě pošli createComponent v presenteru

Doplňuji

protected function createComponentArticleForm() {
    return $this->articleFactory->create($this->id,function(){
        $this->flashMessage('Článek byl úspěšně uložen.');
        $this->redirect('show');
    });
}
David Matějka
Moderator | 6445
+
0
-

divny, chybu tam nevidim. po odeslani formulare dojde k presmerovani na jakou stranku? (nemyslim ten redirect po ulozeni, ale hned po odeslani formulare). existuje $id? zkus si to oddebugovat, nejsnaze treba dump($id);exit;

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

divny, chybu tam nevidim. po odeslani formulare dojde k presmerovani na jakou stranku? (nemyslim ten redirect po ulozeni, ale hned po odeslani formulare). existuje $id? zkus si to oddebugovat, nejsnaze treba dump($id);exit;

Zkusim ten debug ještě, ale problém je takový, že jakmile dám edit dostanu se na stránku se článkem veškeré vyplněné věci jsou dobře ke konkrétnímu článku, ale po uložení se mi přepíšou všechny články na hodnoty, které jsem přitom nastavil k jednomu konkrétnímu článku podle ID.

David Matějka
Moderator | 6445
+
+3
-

jo uz to vidim, ty tam posilas do where jen to id, tedy provadis neco jako

->where(1)->update(...)

takze uprav tu podminku na ['id' => $id]

CZechBoY
Člen | 3608
+
+2
-

nebo wherePrimary :-)

kiCkZ
Člen | 153
+
0
-

David Matějka napsal(a):

jo uz to vidim, ty tam posilas do where jen to id, tedy provadis neco jako

->where(1)->update(...)

takze uprav tu podminku na ['id' => $id]

Takže v té funkci stačí u update udělat tohle tedy.

public function update($id,$data){
    return $this->findBy(['id' => $id])->update($data);
}

Díky moc kluci

Editoval kiCkZ (25. 10. 2017 20:15)