2017-02-09 6 views
0

JSONファイルに格納されたイベントのタグを処理するクラスのクラスを調整しようとしています。このライブラリの下のコードでは、コンストラクタ関数の実行中にファイルから配列を取得するので、クラスの関数全体を通して操作して操作することができます。クラスコンストラクタ関数のパラメータ

class tagHandler { 
private $tagsFile = "/home/thomassm/public_html/functions/php/tags.json"; 
private $LstTags; 
private $LstReturn; 

function __construct() { 
    $this->LstTags = array(); 
    if(!file_exists ($this->tagsFile)){ 
     $fHND = fopen($this->tagsFile, "w"); 
     $tmpArray = array(array("EID","EName","EColor", "EDel")); 
     fwrite($fHND, json_encode($tmpArray)); 
     fclose($fHND); 
    } 

    $encodedInput = file ($this->tagsFile); 
    $this->LstTags = json_decode($encodedInput[0], true); 
    if(!$this->LstTags) $this->LstTags = array(); 
} 

function __destruct(){ 
    $this->update(); 
} 
public function update(){ 
    $this->LstTags = array_values($this->LstTags); 

    $fHND = fopen($this->tagsFile, "w"); 
    fwrite($fHND, json_encode($this->LstTags)); 
    fclose($fHND); 

    //empty memory region 
    $this->LstTags = array(); 
    $encodedInput = file ($this->tagsFile); 
    $this->LstTags = json_decode($encodedInput[0], true); 
} 
//More functions that use the collected array here. 

私は自分のイベントにサインアップした人に対処するためにクラスを調整しようとしています。各イベントにはデータベースにレコードがあり、サインアップした男性とサインする女性の配列のフィールドが格納されます。私はコンストラクタークラスが前のクラスのように操作できるように、レコードから配列を取得することを望みます。問題は、イベントID(EID)を持つレコードをDBで検索する必要がある配列を取得することであり、コンストラクタ関数に渡される変数が必要になります。状況を悪化させるために、このパラメータはループ内で変更可能でなければなりません。たとえば、すべてのイベントをリストするページでは、各レコードをループするループでこのクラスを使用する必要があるため、配列を取得して操作し、テーブル/フルカレンダーに表示してから次のイベントを取得するまで繰り返します。私は以下のコードを書きました。それは完全ではありません(いくつかの変数は男性と女性などに名前が変更されていません)、完全に間違っているかもしれませんが、説明する根拠はあなたに与えられます。

class signupHandler { 
private $LstMaleS; 
private $LstFemaleS; 
private $LstReturn; 

function __construct($IntEID) { 
    $this->LstTags = array(); 

    $StrQuery = "SELECT MaleS, FemaleS FROM tblEvents WHERE EID = ?"; 

    if ($statement = TF_Core::$MySQLi->DB->prepare($StrQuery)) { 
     $statement->bind_param('s',$IntEID); 
     $statement->execute(); 
     $results = $statement->get_result(); 
    } 

    $this->LstTags = json_decode($encodedInput[0], true); 
    if(!$this->LstTags) $this->LstTags = array(); 
} 

おかげで、 トム

+1

私がやることは、代わりに 'signupHandler'のコンストラクタにデータベース結果配列を渡すことです。これをクラス外で照会し、クラスを初期化することができます。この方法では、クラスを使用して、まだデータベースにない新しいエントリを保持し、そのエントリを保存するメソッドを持つこともできます。これはMVCフレームワークが通常行うものなので、MVCフレームワークを使用すると恩恵を受けることができます。 – apokryfos

+0

もし私がそれをしたら、コンストラクタ/破壊クラスが必要でしょうか?または、私は推測する変更された文字列を返すためにdestructを使用することができます。それはクラスなしの痛みのように聞こえるし、もし私がそれを行うならば、コードはとにかく多く繰り返すとは思わないので、クラス全体を使用しないかもしれません。 –

+0

この質問は「OOPへ」または「OOPではない」に変わります。本当にあなた次第です。私はちょうど通常行われていることを言っています。 – apokryfos

答えて

0
function decodeNames($StrNames){ 
    $this->LstNames = array(); 
    $this->LstNames = json_decode($StrNames, true); 
    if(!$this->LstNames) $this->LstNames = array(); 
    $this->LstNames = array_values($this->LstNames); 
} 

function update(){ 
    $this->LstNames = array_values($this->LstNames); 
    return json_encode($this->LstNames); 
} 

public function addSignUp($StrNames, $StrUsername, $StrStatus){ 
    $this->decodeNames($StrNames); 

    $BlnPresent = false; 

    for($i = 0; $i < count($this->LstNames); $i++){ 
     if($this->LstNames[$i][0] == $StrUsername){ 
      $this->LstNames[$i][1] = $StrStatus; 
      $BlnPresent = true; 
     } 
    } 
    if($BlnPresent == false){ 
     array_push($this->LstNames, array($StrUsername, $StrStatus, date("Y-m-d H:i:s"))); 
    } 
    return $this->update(); 
} 

私はクラスに私はそれから関数を呼び出すたびに、エンコードされたJSON配列を渡すことにしました。すべての関数の前に、それはデコードされ、配列に変換され、最後に再エンコードされ、それを呼び出すファイルに返されます。今では、もはやコンストラクタや関数を破壊しません。

関連する問題