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
-~----------~----~----~----~------~----~------~--~---

Reply via email to