niedziela, 9 marca 2014

Internacjonalizacja w CakePHP - HABTM i hasOne

W poprzednim poście o i18n w Cake'u wspomniałem, iż następny artykuł będzie tyczył się problemów pobierania danych przy relacjach hasOne i hasAndBelongsToMany.

Co do pobierania tłumaczonych danych przy relacjach belongsTo i hasMany to zostało to opisane w wątku Internacjonalizacja w CakePHP - ciąg dalszy rozbudowy.

AppModel.php (app/Model/):
public function afterFind($results, $primary = false) {
 // belongsTo...
 // hasMany...

 if (!empty($this->hasOne)) {
  foreach ($this->hasOne as $model => $settings) {
   if (isset($this->{$model}->actsAs['Translate'])) {
    if (!empty($results)) {
     $ids = array();

     foreach ($results as $result) {
      if (isset($result[$model][$this->{$model}->primaryKey])) {
       $ids[] = $result[$model][$this->{$model}->primaryKey];
      }
     }

     if (!empty($ids)) {
      $this->{$model}->actsAs['Translate'][] = $this->{$model}->primaryKey;

      $supplements = $this->{$model}->find('all', array(
       'conditions' => array(
        $model . '.' . $this->{$model}->primaryKey => $ids
       ),
       'fields' => $this->{$model}->actsAs['Translate'],
       'recursive' => -1
      );

      if (!empty($supplements)) {
       foreach ($results as $order => $result) {
        foreach ($supplements as $supplement) {
         if ($supplement[$model][$this->{$model}->primaryKey] == $result[$model][$this->{$model}->primaryKey]) {
          $results[$order][$model] = array_merge($result[$model], $supplement[$model]);
         }
        }
       }
      }
     }
    }
   }
  }
 }

 if (!empty($this->hasAndBelongsToMany)) {
  foreach ($this->hasAndBelongsToMany as $model => $settings) {
   if (isset($this->{$model}->actsAs['Translate'])) {
    foreach ($results as $row => $result) {
     if (!empty($results[$row][$model])) {
      $ids = array();

      foreach ($results[$row][$model] as $result) {
       if (isset($result[$this->{$model}->primaryKey])) {
        $ids[] = $result[$this->{$model}->primaryKey];
       }
      }

      if (!empty($ids)) {
       $this->{$model}->actsAs['Translate'][] = $this->{$model}->primaryKey;

       $supplements = $this->{$model}->find('all', array(
        'conditions' => array(
         $model . '.' . $this->{$model}->primaryKey => $ids
        ),
        'fields' => $this->{$model}->actsAs['Translate'],
        'recursive' => -1
       ));

       if (!empty($supplements)) {
        foreach ($results[$row][$model] as $order => $result) {
         foreach ($supplements as $supplement) {
          if ($supplement[$model][$this->{$model}->primaryKey] == $result[$this->{$model}->primaryKey]) {
           $results[$row][$model][$order] = array_merge($result, $supplement[$model]);
          }
         }
        }
       }
      }
     }
    }
   }
  }
 }

 return $results;
}
Ponownie wykorzystuje metodę afterFind(); do połączenia brakujących treść. Myślę, że szczegółowy opis był mocno wyczerpujący w poprzednim poście, a zasada działania hasOne i hasAndBelongsToMany jest bardzo podobna.

Brak komentarzy:

Prześlij komentarz