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 protected]> 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 protected]> 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 protected]> 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 protected])
>>> Help/Unsubscribe/Update your Subscription:
>>> https://lists.apple.com/mailman/options/webobjects-dev/programmingosx%40mac.com
>>>
>>> This email sent to [email protected]
>>
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com
This email sent to [email protected]