превратить массив в объект активной записи можно использовать - PullRequest
0 голосов
/ 09 июня 2010

Я выполняю запрос и затем дешифрую его в контроллере. После расшифровки я помещал результаты в массив и отправлял их в представление. Проблема в том, что с этим решением мне нужно переписать все мои представления, чтобы проанализировать отправленные массивы вместо объектов активной записи, отправленных ранее.

Есть ли способ превратить расшифрованный массив обратно в объект, который будет работать с существующим кодом активной записи в представлении?

До

Контроллер:

$name = $this->Clients_model->getNameData('*','client_id='.$clid,'');
$data['name'] = $name;
$this->load->view('names/name_view',$data);

Вид:

if($name->num_rows()) > 0){
    foreach($name->result() as $row){
        echo $row->data;
[...]

Теперь

Контроллер:

$name = $this->Clients_model->getNameData('*','client_id='.$clid,'');
$nameArray= array();
foreach ($name->result() as $row){
    $x = $row;
    $keys = array('id','client_id');
    $unenc = array();
    foreach ($x as $key=>$value){
        if(! in_array($key, $keys)){
            $unenc[$key]=$this->encrypt->decode($value,$this->e_key);
        }else{
            $unenc[$key]=$value;
        }
    }
    array_push($nameArray,$unenc);
}

//Creates an object with the data, but doesn't work with CI active record
//foreach ($nameArray as $akey  => $aval) {
//    $namea -> {$akey} = $aval;
//}

//return $data;
$data['name'] = $nameArray;
$this->load->view('names/name_view',$data);

Вид:

if(count($name) > 0){
    foreach($name as $key=>$row){
        echo $row['data'];
[...]

Во втором (теперь) контроллере есть некоторый закомментированный код, который будет создавать объект, но он не ведет себя так, как ожидается с активной записью. Есть ли способ взять массив $nameArray() и превратить его в объект, который будет работать с существующим кодом представления (например, с кодом в «before: view» выше)?

Спасибо!

1 Ответ

0 голосов
/ 09 июня 2010

Я задал этот вопрос на форумах CI и получил блестящую помощь от пользователя mddd: http://codeigniter.com/forums/viewthread/157516/#760320

В итоге было решено работать с объектом результата mysql внутри контроллера:

    $name = $this->Clients_model->getNameData('*','client_id='.$clid,'');
    $dummy = $name->result();
    $ignore_keys = array('id', 'client_id');
    // watch! we're getting the row as a reference so we're really changing it; not working on a copy
    foreach ($name->result_object as &$row) {  
         foreach (get_object_vars($row) as $key=>$value){
            if(!in_array($key, $ignore_keys)){
                $row->$key = $this->encrypt->decode($value,$this->e_key);
            }
        }
    }
    $data['name']=$name;
    $this->load->view('names/name_view',$data);

это позволяет мне изменять только запросы в контроллерах вместо запросов и всех представлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...