I created a minimum working example of what I'm talking about, and it's
attached. It actually compiles and runs!

Although it's 135 lines, I had to get a web server and DBO up and going.
Really, it's *remarkable* that it's so short and in C++! Anyway, when I
click the pushbutton created on line 124, it looks like the session.find on
line 112 is causing the page to refresh. I'm not sure why a Wt::Dbo call
would cause the page to reload? Or would cause the browser to issue a new
GET.

Any ideas? Thanks, all!

In Christ,
Aaron Laws

On Wed, Aug 12, 2015 at 4:26 PM, Aaron Laws <dartm...@gmail.com> wrote:

> In this code: http://pastie.org/10347062, when I uncomment line 36 and
> click the new ingredient button, the page refreshes, and I'm not sure why.
> When I comment line 36, no refresh. Of course, the ingredient isn't added
> to the dbo collection, but the GUI element shows up on the page, etc.
>
> Is there anything about getting a non-const pointer to an object, and
> adding something to a Wt::Dbo::collection on that object that would cause a
> page to refresh? It has me a bit frazzled. Let me know if you have any
> other questions.
>
> In Christ,
> Aaron Laws
>
#include <Wt/WContainerWidget>
#include <Wt/WPushButton>
#include <Wt/WText>
#include <Wt/WBreak>
#include <Wt/WApplication>
#include <Wt/Dbo/Dbo>
#include <Wt/Dbo/backend/Sqlite3>
#include <Wt/WEnvironment>
#include <string>
#include <Wt/WEnvironment>
#include <Wt/WApplication>
#include <Wt/WSignal>
#include <string>
#include <Wt/Dbo/Dbo>

struct puppy;

struct trick : public Wt::Dbo::Dbo<trick>
{
    std::string name;
    Wt::Dbo::ptr<puppy> mypuppy;

    template <class A> void persist(A&a)
    {
        Wt::Dbo::field(a, name, "name");
        Wt::Dbo::belongsTo(a, mypuppy, "puppyid");
    }
};

struct puppy : public Wt::Dbo::Dbo<puppy>
{
    std::string name;

    Wt::Dbo::Query<Wt::Dbo::ptr<trick>, Wt::Dbo::DynamicBinding> get_tricks()
    {
        return puppies.find();
    }

    template<class A> void persist(A&a)
    {
        Wt::Dbo::field(a, name, "name");
        Wt::Dbo::hasMany(a, puppies, Wt::Dbo::ManyToOne, "puppyid");
    }

    private:
    Wt::Dbo::collection<Wt::Dbo::ptr<trick> > puppies;
};

struct web_container : public Wt::WContainerWidget
{
    web_container (Wt::Dbo::Session &, Wt::WContainerWidget * parent = nullptr);
    Wt::Signal<> & done() { return done_; }
    void print_out_puppies (void);

    private:
    Wt::Dbo::Session & session;
    Wt::Signal<> done_;
};

struct myweb_app_test : public Wt::WApplication
{
    myweb_app_test(Wt::WEnvironment const &, Wt::Dbo::Session & session);
};

Wt::Dbo::Session session;

Wt::WApplication* create_application(Wt::WEnvironment const & env)
{
    return new myweb_app_test(env, session);
}

void populate_db(void)
{
    {
        Wt::Dbo::Transaction thetransaction{session};
        puppy * p{new puppy};
        p->name = "spaghetti puppy";
        auto puppyptr = session.add(p);
        trick * t{new trick};
        t->name = "wrap up";
        auto trickptr = session.add(t);
        t = new trick;
        t->name = "lay down";
        trickptr = session.add(t);
    }
}

int main(int argc, char** argv)
{
    Wt::Dbo::backend::Sqlite3 db("puppies.db");
    db.setProperty("show-queries", "true");
    session.setConnection(db);
    session.mapClass<puppy>("puppy");
    session.mapClass<trick>("trick");
    try
    {
        session.createTables();
        populate_db();
        std::cerr << "created new database\n";
    }
    catch (Wt::Dbo::Exception & e)
    {
        std::cerr << "New database not created because of ";
        std::cerr << e.what() << ". Assuming db already exists.\n";
    }
    
    return Wt::WRun(argc, argv, &create_application);
}

void web_container::print_out_puppies (void)
{
    Wt::Dbo::collection<Wt::Dbo::ptr<puppy> > puppies = session.find<puppy>();
    /*for (auto & p : puppies)
    {
        new Wt::WText{p->name, this};
        new Wt::WBreak{this};
    }*/
}

web_container::web_container(Wt::Dbo::Session & session, Wt::WContainerWidget * parent)
    : session(session), Wt::WContainerWidget{parent}
{
    std::cerr << "\n\n\nCreating new web-container\n\n";
    auto btn = new Wt::WPushButton {"text", this};
    btn->clicked().connect(this, &web_container::print_out_puppies);
}

myweb_app_test::myweb_app_test(Wt::WEnvironment const & env, Wt::Dbo::Session & session)
    : Wt::WApplication(env)
{

    new web_container{session, root()};
}

------------------------------------------------------------------------------
_______________________________________________
witty-interest mailing list
witty-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/witty-interest

Reply via email to