Question

I have a model called Task defined like this (fields not relevent to question removed)

  <?php
  class Model_Task extends Model_Table {
   public $entity_code='vscrum_task';
   public $table_alias='tk';

   function init(){
     parent::init();

  // debug causes error in Ajax in ATK v4.1.1
  // $this->debug(true);
     $this->addField('id')->system(true)->visible(false); 
     $this->addField('task_desc')->mandatory(true)->visible(true);
     $this->addField('tasktype_id')->mandatory(true)->refModel('Model_TaskType');
     $this->addField('team_id')->system(true)->visible(false);

and the refModel tasktype is defined like this (fields not relevent to question removed)

<?php
    class Model_TaskType extends Model_Table {
      public $entity_code='vscrum_tasktype';
      public $table_alias='ty';

      function init(){
     parent::init();

         $this->addField('id')->mandatory(true);
         $this->addField('name')->mandatory(true);
         $this->addField('team_id');

        }   
     }

I have a CRUD which is based on task and is now (thanks to help from Jancha and Romans on stackoverflow) is working fine.

I want to limit the options in the drop down for TaskType to only those tasktypes defined for the user's team. I tried putting an addCondition in the TaskType Model referencing a session variable i had previously memorized

  $this->addCondition('team_id',$p->api->recall('team_id'));

and also using a direct call to a value for the logged in use

  $this->addCondition('team_id',$p->api->auth->get('team_id'));

but this results in showing the Tasktype fine in the Grid

enter image description here

but leaves it empty for both Edit and Add in the Ajax dialog.

enter image description here

If i remove the addCondition line from the TaskType Model, it shows all values in the list but i will always want this restricted to a subset.

As this is the referred Model and not the Model that the CRUD is based on, any suggestions on how i get this to work as expected ?

I tried Roman's suggestion of having a model which is the TaskType and a new model extended from that which is the TaskType_Team with the addCondition in it like this

class Model_TaskType_Team extends Model_TaskType { function init(){ parent::init();

    $this->addCondition('team_id',$p->api->auth->get('team_id'));
  }

for which i needed to create a subdirectory undel Model called TaskType otherwise it didnt find the new Model but the end result is the same. I think this is related to another issue i previously had where the Ajax dialog loses access to $p->api and so doesnt display the restriction (and this is why it works fine for the grid on the same page as that isnt in an ajax dialog but i dont want to use a stickyGet to resolve this for security (dont want to be able to modify the URL to see other teams data) and session variables ($p->auth->memorise and $p->auth->recall) also dont seem work in this case - any further suggestions ?

Was it helpful?

Solution

Remember that you can extend your models like that. In fact, this is very often used in larger projects.

class Model_TaskType_Team extends Model_TaskType {
    function init(){
        parent::init();
        $this->addCondition('team_id',$this->api->auth->get('team_id'));
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top