aboutsummaryrefslogtreecommitdiff
path: root/lib/sfIsisImporterRelations.class.php
blob: 82828451ec1324b858a4efabd242d6a84190d2fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php

/**
 * IsisImporterRelations: provides ISIS import methods for importing data
 * into model entities.
 */
class sfIsisImporterRelations extends sfIsisImporterEntities {
  /**
   * Import one to one data.
   *
   * @param object $model    Model
   * @param array  $field    Field data from ISIS database schema
   * @param string $relation Relation name
   */
  public function addOneToOne(&$model, array $field, $relation)
  {
    foreach (new IsisRowIterator($this, $field) as $row)
    {
      $data = new $relation();

      $this->addMain($data, $field, $row);
      $this->addSubfields($data, $field, $row);
      $data->save();

      $key         = sfInflector::underscore($relation) .'_id';
      $model->$key = $data->id;
    }
  }

  /**
   * Import one to many data.
   *
   * @param  object $model    Model
   * @param  string $relation Relation name
   * @return object           Relation model object
   */  
  public function addOneToMany(&$model, $relation)
  {
    $model_id          = $this->getModelId($model);
    $data              = new $relation();
    $data->{$model_id} = $model->id;
    $data->save();
    return $data;
  }

  /**
   * Add simple entities data into the model.
   *
   * @param object $model Model
   * @param array  $field Field data from ISIS database schema
   */  
  public function addOneToManyMain(&$model, array $field, $entity, $key = 'name')
  {
    foreach (new IsisMainItemIterator($this, $field) as $row => $value)
    {
      $this->log("Entity: $entity; Value: $value", 'debug');
      $data         = $this->addOneToMany($model, $entity);
      $data->{$key} = $value;
      $data->save();
    }    
  }

  /**
   * Import a single many to many data.
   *
   * @param object $model    Model
   * @param mixed  $values   Values to be added
   * @param string $relation Relation name
   */
  public function addManyToMany(&$model, $value, $relation)
  {
    $method = 'add'. $relation;

    // Populate related data.
    if (is_callable(array($this, $method)))
    {
      $data = $this->{$method}($value);
    }
    else
    {
      $data = $this->addEntity($relation, $value);
    }

    // Get model and relation names and id fields.
    $model_id                   = $this->getModelId($model);
    $relation_id                = $this->getRelationId($relation);
    $model_relation             = $this->getModelRelation($model, $relation);

    // Make the relation.
    $model_data                 = new $model_relation();
    $model_data->{$model_id}    = $model->id;
    $model_data->{$relation_id} = $data->id;
    $model_data->save();

    return $model_data;
  }

  /**
   * Import many to many data.
   *
   * @param object $model    Model
   * @param array  $values   Values to be added
   * @param string $relation Relation name
   */
  public function addManyToManyEntities(&$model, array $values, $relation)
  {
    foreach ($values as $value)
    {
      $this->addManyToMany($model, $value, $relation);
    }
  }

  /**
   * Add field values in a many-to-many relation.
   *
   * @param object $model    Model
   * @param array  $field    Field data from ISIS database schema
   * @param string $relation Relation name
   */
  public function addManyToManyMain(&$model, array $field, $relation)
  {
    foreach (new IsisMainItemIterator($this, $field) as $value)
    {
      $this->addManyToManyEntities($model, $this->explodeBrackets($value), $relation);
    }    
  }
}