views:

49

answers:

1

I'm running a query and then decrypting it in the controller. After it is decrypted I was putting the results into an array and sending that to the view. The problem is with this solution I need to rewrite all of my views to parse the arrays sent instead of the active record objects sent before.

Is there a way to turn the decrypted array back into an object that will work with existing active record code in the view?

Before

Controller:

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

View:

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

Now

Controller:

$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);

View:

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

In the second (now) controller there is some commented out code that will make an object, but it doesn't behave as expected with active record. Is there a way to take the $nameArray() array and change it into an object that will work with existing view code (such as the code in the 'before:view' above)?

Thanks!

A: 

I asked this question over on the CI forums and got some brilliant help from user mddd: http://codeigniter.com/forums/viewthread/157516/#760320

The solution ended up being to work on the mysql result object within the controller:

    $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);

this allows me to only modify the queries in the controllers instead of the queries and all the views.

stormdrain