1

Temat: Problem z przechwytywaniem danych

Mam problem z przechwytywaniem danych sad

Sytuacja wygląda następująco mam link który prowadzi do formularze z dodawaniem komentarza:

<?php echo $html->link('Dodaj Komentarz',
 '/comments/add/'.$data['Post']['id']); ?>

Oraz funkcje która służy do dodawania do bazy komentarza:

function add($post_id) {

if (!empty($this->data)) {
            if ($this->Comment->save($this->data)) {
                $this->flash('Your Comment has been saved.', '/posts');
            }
        }
 }

Czy aby funkcja add przechwyciła $data['Post']['id'],
wystarczy  $this->Post->setPost_id($post_id), a jeżeli tak to w którym miejscu trzeba ją wstawić ?(kiedy wstawiam ją na początku funkcji nie działam, tak samo w warunku)

Czy trzeba to rozwiązać inaczej?
Tak aby pole Post_id w zapisywanym komentarzu miało wartość   $data['Post']['id'] ??

Kod formularza dodającego komentarz:

<div class="comment form">
<form id="CommentAddForm" method="post" action="/cake/app/webroot/index.php/comments/add">
<fieldset style="display:none;"><input type="hidden" name="_method" value="POST" /></fieldset><fieldset><legend>New Comment</legend>
<input type="hidden" name="data[Comment][id]" value="" id="CommentId" /><div class="input select"><label for="CommentPostId">Post</label><input type="hidden" name="data[Comment][post_id]" value="" id="CommentPostId" /></div>
<div class="input text"><label for="CommentAuthor">Author</label>
<input name="data[Comment][author]" type="text" maxlength="50" value="" id="CommentAuthor" /></div>
<div class="input textarea"><label for="CommentBody">Body</label><textarea name="data[Comment][body]" cols="30" rows="6" id="CommentBody" ></textarea>
</div></fieldset><div class="submit"><input type="submit" value="Submit" /></div></form></div>

2

Odp: Problem z przechwytywaniem danych

Rozwiązaniem może być wstawienie id posta przed save'm, tak aby funkcja miała postać:

function add($post_id) {

$this->set('post_id',$post_id);

if (!empty($this->data)) {
          $this->data['Comment']['post_id']=$post_id;
            if ($this->Comment->save($this->data)) {
                $this->flash('Your Comment has been saved.', '/posts');
            }
        }
 }

Wtedy konieczne jeszcze jest dodanie numeru posta w akcji formularza (wcześniej trzeba tą wartość przekazać w kontrolerze):
Pola CommentId i PostId będą w tym wypadku w formularzxu zbędne, ponieważ PostId wypełniane jest przed dodaniem komentarza natomiast CommentId powstaje dopiero po wstawieniu komentarza do bazy. Formularz miałby więc postać zbliżoną do:

<div class="comment form">
<form id="CommentAddForm" method="post" action="/cake/app/webroot/index.php/comments/add/<?php echo $post_id; ?>">
<fieldset style="display:none;"><input type="hidden" name="_method" value="POST" /></fieldset><fieldset><legend>New Comment</legend>
<div class="input text"><label for="CommentAuthor">Author</label>
<input name="data[Comment][author]" type="text" maxlength="50" value="" id="CommentAuthor" /></div>
<div class="input textarea"><label for="CommentBody">Body</label><textarea name="data[Comment][body]" cols="30" rows="6" id="CommentBody" ></textarea>
</div></fieldset><div class="submit"><input type="submit" value="Submit" /></div></form></div>

Niestety przy dodawaniu posta użytkownik będzie mógł wpisać w adres przeglądarki dowolny numer po comments/add/ i potrzebna będzie dobra walidacja. Drugie możliwe rozwiązanie to użycie sesji do przekazania wartości zmiennej post_id.

3

Odp: Problem z przechwytywaniem danych

dzięki działa smile

Teraz staram sie zrobić logowanie smile

4

Odp: Problem z przechwytywaniem danych

Fallen napisał/a:

dzięki działa smile

Teraz staram sie zrobić logowanie smile

Jeśli chcesz coś prostego to polecam http://bakery.cakephp.org/articles/view … in-1-2-x-x

5

Odp: Problem z przechwytywaniem danych

Dzięki smile
Ale niestety napotkałem kolejny problem hmm

Mam coś takiego:

<div class="posts form">
<form id="PostAddForm" method="post" action="/cake/posts/add">
<fieldset style="display:none;"><input type="hidden" name="_method" value="POST" /></fieldset><fieldset>
<legend>New Post</legend>
<input type="hidden" name="data[Post][id]" value="" id="PostId" />
<label for="PostTitle">Title</label><input name="data[Post][title]" type="text" length="120" value="" id="PostTitle" /><br>
<label for="PostBody">Body</label><textarea name="data[Post][body]" cols="30" rows="6" id="PostBody" ></textarea><br>
<label for="PostAutor">Autor</label><input name="data[Post][autor]" type="text" length="120" value="" id="PostAutor" />
</fieldset>
<div class="submit"><input type="submit" value="Submit" /></div></form></div>

Wszystko sie ładnie dodaje prócz  data[Post][autor], why?
Dodałem dodatkowe pole w tabeli hmm
Podobna sytuacja jest w druga stronę kiedy nawet dodam ręcznie autora, cake nie chce szczytywać go z bazy:/

<?php foreach ($data as $post): ?>
echo $post['Post']['title']; - działa
echo $post['Post']['body']; - działa
echo $post['Post']['created']; - działa
echo $post['Post']['autor']; - nie działa

Czy wina może sie brać z faktu że pole autor dołączyłem po pewnym czasie a wcześniej all działało bez tego pola?

6

Odp: Problem z przechwytywaniem danych

udało się, działa smile

Problem został usunięty w momencie usunięcia cache-a modelu POst smile

7

Odp: Problem z przechwytywaniem danych

Dobrym rozwiązaniem na problemy z cache'owaniem w trakcie pisania aplikacji jest ustawienie zmiennej debug na 2 lub 3 w pliku app/config/core.php

Wtedy nie trzeba manualnie usuwać cache po każdej zmianie w widokach i dodatkowo wyświetla się fajne podsumowanie sql'owych kwerend smile