Try putting:
$this->ProjectTasks->create();
in each loop of the foreach in Schedule::afterSave()
When you call save() multiple times on the same model, I have found
that I run into problems if I don't call create() in between each call
to save().
On Apr 17, 3:00 pm, Joshua McFarren <[EMAIL PROTECTED]> wrote:
> Hi,
>
> Is there a case where Model::save() doesn't initiate the beforeSave
> and afterSave callbacks for that Model? Maybe this doesn't work from
> another afterSave callback? Are these callbacks only initiated when
> Model::save() is accessed from a Controller not another Model?
>
> I have a Schedule Model that has a start date (pivot_date) which is
> used to calculate the ProjectTask due dates that belong to it. My
> ProjectTask Model has beforeSave and afterSave callbacks which cascade
> through the list of tasks and update the due dates. This works really
> well.
>
> However when a Schedule changes these due dates need to be
> recalculated as well. So I want to cause this cascade of updates to
> its ProjectTasks by staring with the first one. Unfortunately
> $this->ProjectTasks->save($task) only updates the task but doesn't kick in
>
> the beforeSave and afterSave callbacks which update the other tasks.
>
> I put in some debug items to verify this. The task name gets updated
> in the DB but the ProjectTask beforeSave doesn't kick in when accessed
> this way. I would expect to see the debug from there but I don't. If i
> remove that debug and exit still nothing happens.
>
> Any help would be greatly appreciated. I've read the Manual and APIs
> many times and I'm still not getting why this doesn't work.
>
> I'm running cake_1.2.0.6311-beta.
>
> Thanks,
> Joshua
>
> ######
>
> class Schedule extends AppModel {
>
> var $name = 'Schedule';
>
> function afterSave($created) {
> /*
> * If the pivot_date changes we need to recalculate due
> * dates: Find the project_tasks which are not dependent
> * on another ProjectTask. This will likely be the first
> * task in the schedule. Now save those tasks to force
> * a recalculation of the due date when the ProjectTask
> * beforeSave is called. The ProjectTask afterSave will
> * then cause a cascading set of updates to each successive
> * task in the schedule and all the due dates will be fixed
> */
> if (! $created) { // true if UPDATE not CREATE
> $schedule_id = $this->id;
> $independentTasks = $this->ProjectTasks->findAll(
> "ProjectTasks.schedule_id = '$schedule_id'" .
> "AND ProjectTasks.depends_on IS NULL",
> NULL,
> NULL
> );
> foreach ($independentTasks as $task) {
> $task['ProjectTasks']['name'] =
> $task['ProjectTasks']['name'] . "
> Altered!";
> $this->ProjectTasks->save($task);
> }
> }
> parent::afterSave($created);
> }
>
> }
>
> ######
>
> class ProjectTask extends AppModel {
>
> var $name = 'ProjectTask';
>
> function beforeSave() {
> /*
> * We're using this to insert a calculated due date
> */
> echo debug($this->data);
> exit;
> if(isset($this->data)){
> $this->__setDueDate($this->data);
> return parent::beforeSave();
> } else {
> return false;
> }
> }
>
> function afterSave($created) {
> /*
> * Find all the ProjectTasks which are dependent
> * on the task we just saved and update them to
> * force a recalculation of the due date when before
> * save is called. This will cause a cascading set
> * of updates to each successive task in the schedule
> */
> if (! $created) { // true if UPDATE not CREATE
> $project_task_id = $this->id;
> $dependentTasks = $this->findAll(
> "ProjectTask.depends_on ='$project_task_id'",
> NULL,
> NULL
> );
> foreach ($dependentTasks as $task) $this->save($task);
> }
> parent::afterSave($created);
> }
>
> }
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake
PHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---