Re: create new to-many objects in d2w
Re: create new to-many objects in d2w
- Subject: Re: create new to-many objects in d2w
- From: Jesse Tayler <email@hidden>
- Date: Tue, 30 Jul 2013 12:20:48 -0400
should you be doing this with your EO?
a job for didInsert() ?
On Jul 30, 2013, at 12:05 PM, Theodore Petrosky <email@hidden> wrote:
> This is not directly a reply to David. I am about to try my hand at implementing this in my app.
>
> David asks the sensible question if anyone thinks there is a better way to do this. Maybe someone can chime in here.
>
> Basically, in a D2W app with to Many relations, when you add a new relationship object, and press the 'save' button, it doesn't call saveChanges() on the EC. It is just added to the relationship and you must complete the transaction or risk fire and brimstone.
>
> The result I want would be that when you press the 'save' button in a 'Create new embedded object', WO will actually save the object and relationship to the backend.
>
> Ted
>
> On Jul 18, 2013, at 12:50 PM, David Holt <email@hidden> wrote:
>
>> Hi Ted,
>>
>> This is how I handled it. It isn't pretty and it was early days in my experience with D2W, so there may be a better way…
>>
>> David
>>
>> Rule
>>
>> 101 : ((pageConfiguration = 'EditRelationshipEmbeddedAnswer' and parentPageConfiguration = 'EditTestItem') => branchChoices = ("_scoreOptionInline") [com.webobjects.directtoweb.Assignment]
>>
>> BranchDelegate
>>
>> /**
>> * Score the option
>> *
>> * @return
>> */
>> public WOComponent _scoreOptionInline(WOComponent sender) {
>> WOComponent nextPage;
>> // Get the objects we need
>> PossibleAnswer possibleAnswer = (PossibleAnswer) object(sender);
>>
>> // Create a new editing context and setup validation
>> EOEditingContext newEc = ERXEC.newEditingContext(possibleAnswer.editingContext());
>> newEc.revert();
>> Person currentPerson = Person.currentUser(newEc);
>> // Choose the option to be scored
>> PossibleAnswer newAnswer = possibleAnswer.localInstanceIn(newEc);
>>
>> // Create scoring object
>> System.out.println("What is the value of the score? " + newAnswer.score() + " for " + newAnswer.answerDescription());
>> EOQualifier qual = Score.PERSON.eq(currentPerson).and(Score.ANSWER.eq(newAnswer));
>> if (newAnswer.aScore() != null) {
>> System.out.println("We're populating an existing object " + newAnswer.score());
>> nextPage = session(sender).navController().createScore(Score.fetchScore(newEc, qual)); //// See method in NavController below
>> } else {
>> Score newScore = Score.createScore(newEc, currentPerson, newAnswer);
>> if (newAnswer instanceof ERXGenericRecord) {
>> ((ERXGenericRecord) newAnswer).setValidatedWhenNested(false);
>> }
>> System.out.println("We're creating a new object " + newAnswer.score());
>> nextPage = session(sender).navController().createaScoreScore(newScore);
>> }
>>
>> return nextPage;
>> }
>>
>>
>> NavigationController
>>
>> public WOComponent createScore(Score aScore) {
>> EditPageInterface newEditPage = D2W.factory().editPageForEntityNamed(Score.ENTITY_NAME, session());
>> newEditPage.setObject(aScore);
>> newEditPage.setNextPageDelegate(new SaveBeforeReturning (
>> // return to current page after saving new score
>> session().context().page()));
>> WOComponent nextPage = (WOComponent) newEditPage;
>> return nextPage;
>> }
>>
>> public class SaveBeforeReturning implements NextPageDelegate {
>>
>> public SaveBeforeReturning(WOComponent afterSaving) {
>> // remember where to go after the save
>> theRealNextPage = afterSaving;
>> }
>>
>> private WOComponent theRealNextPage;
>>
>> // when the person hits save on the page
>> // this method will be called
>>
>> public WOComponent nextPage(WOComponent sender) {
>> // set up for branching based on whether the cancel button, or the save
>> // button was pressed
>> D2WPage page = (D2WPage) theRealNextPage;
>> EOEnterpriseObject eo = page.object();
>> // a null editing context means that the cancel button was pressed
>> if (eo.editingContext() == null) {
>> return theRealNextPage;
>> }
>> // otherwise, the save button was pressed
>> else {
>> eo.editingContext().saveChanges();
>> return theRealNextPage;
>> }
>> }
>> }
>>
>>
>> On 2013-07-18, at 8:29 AM, Theodore Petrosky <email@hidden> wrote:
>>
>>> David,
>>>
>>> How did you do this? I have been mucking around, but have not found a solution.
>>>
>>> playing with some Logs in the submitAction() method makes me realize that the object need to be entered into the EC. I will keep playing.
>>>
>>> Ted
>>>
>>>
>>> On Jul 12, 2013, at 12:27 PM, David Holt <email@hidden> wrote:
>>>
>>>> The trade-off is that if you save the parent EC form the related EC, you may save an edit on the parent that the user is not expecting. In most cases I agree with you and I have implemented a true save on the related component to reduce the user confusion about the "double save".
>>>>
>>>>
>>>> On 2013-07-12, at 8:33 AM, Theodore Petrosky <email@hidden> wrote:
>>>>
>>>>> when I create a new to-many object there is a button with a label 'Save'. I understood that this new object was inserted into the EC and I had to click the save button at the bottom of my parent EO to actually save the related object.
>>>>>
>>>>> but of course there is a problem. If I add an object and immediately click its delete button, my app throws a hissy-fit because the object can not be deleted as it is not saved in the first place.
>>>>>
>>>>> So the question is. when I create a new object, and click save, shouldn't d2w do just that? saveChanges() on the EC?
>>>>>
>>>>> this is the saveButton's action (from ERMODWizardCreationPage).
>>>>> /**
>>>>> * Performs submit action. Overridden to reset the nested validation setting on the
>>>>> * object.
>>>>> */
>>>>> // FIXME - Is this needed here? davidleber
>>>>> @Override
>>>>> public WOComponent submitAction() throws Throwable {
>>>>> WOComponent result = super.submitAction();
>>>>> if (object() instanceof ERXGenericRecord) {
>>>>> ((ERXGenericRecord)object()).setValidatedWhenNested(true);
>>>>> }
>>>>> return result;
>>>>> }
>>>>>
>>>>> I keep following back the super.submitAction() to see what it does but there is no implied saveChanges() anywhere that I can find.
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Do not post admin requests to the list. They will be ignored.
>>>>> Webobjects-dev mailing list (email@hidden)
>>>>> Help/Unsubscribe/Update your Subscription:
>>>>>
>>>>> This email sent to email@hidden
>>>>
>>>
>>
>
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden