Search code examples
phpbox-api

Why show Fatal error: Cannot redeclare Box_API?


I'm using unofficial BoxPHPAPI v3 based on the API documentations located here. But when I visit my application, it show this error -

Fatal error: Cannot redeclare Box_API::get_user_by_login() in D:\xampp\htdocs\box\library\BoxAPI.class.php on line 101

<?php
include('library/BoxAPI.class.php');

$client_id      = 'CLIENT ID';
$client_secret  = 'CLIENT SECRET';
$redirect_uri   = 'REDIRECT URL';

$box = new Box_API($client_id, $client_secret, $redirect_uri);

if(!$box->load_token()){
    if(isset($_GET['code'])){
        $token = $box->get_token($_GET['code'], true);
        if($box->write_token($token, 'file')){
            $box->load_token();
        }
    } else {
        $box->get_code();
    }
}

// User details
$box->get_user();

// Get folder details
$box->get_folder_details('FOLDER ID');

// Get folder items list
$box->get_folder_items('FOLDER ID');

// All folders in particular folder
$box->get_folders('FOLDER ID');

// All Files in a particular folder
$box->get_files('FOLDER ID');

// All Web links in a particular folder
$box->get_links('FOLDER ID');

// Get folder collaborators list
$box->get_folder_collaborators('FOLDER ID');

// Create folder
$box->create_folder('FOLDER NAME', 'PARENT FOLDER ID');

// Update folder details
$details['name'] = 'NEW FOLDER NAME';
$box->update_folder('FOLDER ID', $details);

// Share folder
$params['shared_link']['access'] = 'ACCESS TYPE'; //open|company|collaborators
print_r($box->share_folder('FOLDER ID', $params));

// Delete folder
$opts['recursive'] = 'true';
$box->delete_folder('FOLDER ID', $opts);

// Get file details
$box->get_file_details('FILE ID');

// Upload file
$box->put_file('RELATIVE FILE URL', '0');

// Update file details
$details['name'] = 'NEW FILE NAME';
$details['description'] = 'NEW DESCRIPTION FOR THE FILE';
$box->update_file('FILE ID', $details);

// Share file
$params['shared_link']['access'] = 'ACCESS TYPE'; //open|company|collaborators
print_r($box->share_file('File ID', $params));

// Delete file
$box->delete_file('FILE ID');

if (isset($box->error)){
    echo $box->error . "\n";
}
?>

and BoxAPI.class.php-

define( '_CODENAME', 'BoxPHPAPI'); 
define( '_VERSION', '1.1'); 
define( '_URL', 'https://github.com/misterfifi1');
error_reporting(E_ERROR);

class Box_API {
    
    public $client_id       = '';
    public $client_secret   = '';
    public $redirect_uri    = '';
    public $access_token    = '';
    public $refresh_token   = '';
    public $authorize_url   = 'https://www.box.com/api/oauth2/authorize';
    public $token_url       = 'https://www.box.com/api/oauth2/token';
    public $api_url         = 'https://api.box.com/2.0';
    public $upload_url      = 'https://upload.box.com/api/2.0';
    public $error_message   = '';
    public $reponse_status  = '';           
    public $asUser          = '';
    public function __construct($client_id = '', $client_secret = '', $redirect_uri = '') {
        if(empty($client_id) || empty($client_secret)) {
            throw ('Invalid CLIENT_ID or CLIENT_SECRET or REDIRECT_URL. Please provide CLIENT_ID, CLIENT_SECRET and REDIRECT_URL when creating an instance of the class.');
        } else {
            $this->client_id        = $client_id;
            $this->client_secret    = $client_secret;
            $this->redirect_uri     = $redirect_uri;
        }
    }
    
    public function setAsUser($userID){
        $this->asUser   = $userID;
    }
    
    /* First step for authentication [Gets the code] */
    public function get_code() {
        if(array_key_exists('refresh_token', $_REQUEST)) {
            $this->refresh_token = $_REQUEST['refresh_token'];
        } else {
            // echo $url = $this->authorize_url . '?' . http_build_query(array('response_type' => 'code', 'client_id' => $this->client_id, 'redirect_uri' => $this->redirect_uri));
            $url = $this->authorize_url . '?' . http_build_query(array('response_type' => 'code', 'client_id' => $this->client_id, 'redirect_uri' => $this->redirect_uri));
            header('location: ' . $url);
            exit();
        }
    }
    
    /* Second step for authentication [Gets the access_token and the refresh_token] */
    public function get_token($code = '', $json = false) {
        $url = $this->token_url;
        if(!empty($this->refresh_token)){
            $params = array('grant_type' => 'refresh_token', 'refresh_token' => $this->refresh_token, 'client_id' => $this->client_id, 'client_secret' => $this->client_secret);
        } else {
            $params = array('grant_type' => 'authorization_code', 'code' => $code, 'client_id' => $this->client_id, 'client_secret' => $this->client_secret);
        }
        if($json){
            return $this->post($url, $params);
        } else {
            return json_decode($this->post($url, $params), true);
        }
    }
    
    /** MFI METHODS */
    /* Get comments */
    public function get_comments($file) {
        $url = $this->build_url("/files/$file/comments");
        return json_decode($this->get($url), true);
    }
    
    /* Get tasks */
    public function get_tasks($file) {
        $url = $this->build_url("/files/$file/tasks");
        return json_decode($this->get($url), true);
    }
    
    public function create_user($login, $name){
        $url = $this->build_url("/users");
        $params = array('login' =>$login, 'name' => $name) ;
        return json_decode($this->post($url, json_encode($params)), true);
    }
    
    public function get_user_by_login($login, $complete = false){
        $fields = '';
        if($complete)
            $fields = '&fields=id,name,login,created_at,modified_at,language,space_amount,max_upload_size,status,avatar_url,space_used,can_see_managed_users,is_sync_enabled,is_external_collab_restricted,is_exempt_from_device_limits,is_exempt_from_login_verification';
        $url = $this->build_url("/users")."&filter_term=$login".$fields;
        return json_decode($this->get($url));
    }
    
    public function get_users($limit = 100, $offset = 0){
        $url = $this->build_url("/users")."&limit=$limit&offset=$offset";
        $params = array('limit' =>$limit);
        return json_decode($this->get($url));
    }
    
    /* Gets user details  by ID*/
    public function get_user_by_id($id) {
        $url = $this->build_url("/users/$id");
        return json_decode($this->get($url),true);
    }
    
    public function get_user_by_login($login){
        $url = $this->build_url("/users")."&filter_term=$login";
        return json_decode($this->get($url));
    }
    
    public function get_userID_by_login($user){
        $result = $this->get_user_by_login($user->email);
        if(isset($result->entries)){
            if(count($result->entries)==1){
                $user->id = $result->entries[0]->id;
            }
        }
        return $user;
    }
    
    public function get_enterprise_events($limit=0,$after="2015-06-10T00:00:00-08:00", $before="2015-12-12T10:53:43-08:00",$event='',$stream_position=0){
        $url = $this->build_url("/events")."&stream_type=admin_logs&limit=$limit&created_after=$after&created_before=$before&event_type=$event&stream_position=$stream_position";
        return json_decode($this->get($url));
    }
    
    public function invite_user($login, $name){
        $url = $this->build_url("/invites");
        $params = array('login' =>$login, 'name' => $name) ;
        return json_decode($this->post($url, json_encode($params)), true);
    }
    
    private function get_groups(){
        $url = $this->build_url("/groups");
        return json_decode($this->get($url));
    }
    
    public function get_group_id($name){
        $group_id = 0;
        $groups = $this->get_groups();
        foreach($groups->entries as $group){
            if($group->name == $name){
                $group_id = $group->id;
            }
        }
        return $group_id;
    }
    
    public function create_group($name){
        $url = $this->build_url("/groups");
        $params = array('name' => $name) ;
        return json_decode($this->post($url, json_encode($params)), true);
    }
    
    public function add_user_to_group($userId, $groupId){
        $url = $this->build_url("/group_memberships");
        $params = array('user' => array('id' => $userId), 'group' => array('id' => $groupId));
        return json_decode($this->post($url, json_encode($params)), true);
    }
    
    public function share_folder_with_user($folderId, $userId){
        $url = $this->build_url("/collaborations");
        $items = array('id' => $folderId, "type" => "folder");
        $accessible_by = array("id" => $userId, "type" => "user");
        $params = array("item" => $items, "accessible_by" => $accessible_by ,"role" => "viewer");
        return json_decode($this->post($url, json_encode($params)), true);
    }
    
    /*** ===== END ===== */
    
    
    /* Gets the current user details */
    public function get_user() {
        $url = $this->build_url('/users/me');
        return json_decode($this->get($url),true);
    }
    
    /* Get the details of the mentioned folder */
    public function get_folder_details($folder, $json = false) {
        $url = $this->build_url("/folders/$folder");
        if($json){  
            return $this->get($url);
        } else {
            return json_decode($this->get($url),true);
        }
    }
    
    /* Get the list of items in the mentioned folder */
    public function get_folder_items($folder, $json = false) {
        $url = $this->build_url("/folders/$folder/items");
        if($json){  
            return $this->get($url);
        } else {
            return json_decode($this->get($url),true);
        }
    }
    
    /* Get the list of collaborators in the mentioned folder */
    public function get_folder_collaborators($folder, $json = false) {
        $url = $this->build_url("/folders/$folder/collaborations");
        if($json){  
            return $this->get($url);
        } else {
            return json_decode($this->get($url),true);
        }
    }
    
    /* Lists the folders in the mentioned folder */
    public function get_folders($folder) {
        $data = $this->get_folder_items($folder);
        foreach($data['entries'] as $item){
            $array = '';
            if($item['type'] == 'folder'){
                $array = $item;
            }
            $return[] = $array;
        }
        return array_filter($return);
    }
    
    /* Lists the files in the mentioned folder */
    public function get_files($folder) {
        $data = $this->get_folder_items($folder);
        foreach($data['entries'] as $item){
            $array = '';
            if($item['type'] == 'file'){
                $array = $item;
            }
            $return[] = $array;
        }
        return array_filter($return);
    }
    
    /* Lists the files in the mentioned folder */
    public function get_links($folder) {
        $data = $this->get_folder_items($folder);
        foreach($data['entries'] as $item){
            $array = '';
            if($item['type'] == 'web_link'){
                $array = $item;
            }
            $return[] = $array;
        }
        return array_filter($return);
    }
    
    public function create_folder($name, $parent_id) {
        $url = $this->build_url("/folders");
        $params = array('name' => $name, 'parent' => array('id' => $parent_id));
        return json_decode($this->post($url, json_encode($params)), true);
    }
    
    /* Modifies the folder details as per the api */
    public function update_folder($folder, array $params) {
        $url = $this->build_url("/folders/$folder");
        return json_decode($this->put($url, $params), true);
    }
    
    /* Deletes a folder */
    public function delete_folder($folder, array $opts) {
        echo $url = $this->build_url("/folders/$folder", $opts);
        $return = json_decode($this->delete($url), true);
        if(empty($return)){
            return 'The folder has been deleted.';
        } else {
            return $return;
        }
    }
    
    /* Shares a folder */
    public function share_folder($folder, array $params) {
        $url = $this->build_url("/folders/$folder");
        return json_decode($this->put($url, $params), true);
    }
    
    /* Shares a file */
    public function share_file($file, array $params) {
        $url = $this->build_url("/files/$file");
        return json_decode($this->put($url, $params), true);
    }
    /* Get the details of the mentioned file */
    public function get_file_details($file, $json = false) {
        $url = $this->build_url("/files/$file");
        if($json){  
            return $this->get($url);
        } else {
            return json_decode($this->get($url),true);
        }
    }
    
    /* Uploads a file */
    public function put_file($file, $name, $parent_id) {
        $url = $this->build_url('/files/content', array(), $this->upload_url);
        $attrs = array('name' => $name, 'parent' => array('id' => $parent_id));
        $cfile = new CURLFile(realpath($file),'image/png','pic');
        $params = array('attributes' => json_encode($attrs), 'file' => $cfile);
        return json_decode($this->post($url, $params), true);
    }
    
    /* Modifies the file details as per the api */
    public function update_file($file, array $params) {
        $url = $this->build_url("/files/$file");
        return json_decode($this->put($url, $params), true);
    }
    /* Deletes a file */
    public function delete_file($file) {
        $url = $this->build_url("/files/$file");
        $return = json_decode($this->delete($url),true);
        if(empty($return)){
            return 'The file has been deleted.';
        } else {
            return $return;
        }
    }
    
    /* Saves the token */
    public function write_token($token, $type = 'file') {
        $array = json_decode($token, true);
        if(isset($array['error'])){
            $this->error = $array['error_description'];
            return false;
        } else {
            $array['timestamp'] = time();
            if($type == 'file'){
                $fp = fopen('token.box', 'w');
                fwrite($fp, json_encode($array));
                fclose($fp);
            }
            return true;
        }
    }
    
    /* Reads the token */
    public function read_token($type = 'file', $json = false) {
        if($type == 'file' && file_exists('token.box')){
            $fp = fopen('token.box', 'r');
            $content = fread($fp, filesize('token.box'));
            fclose($fp);
        } else {
            return false;
        }
        if($json){
            return $content;
        } else {
            return json_decode($content, true);
        }
    }
    
    /* Loads the token */
    public function load_token() {
        $array = $this->read_token('file');
        if(!$array){
            return false;
        } else {
            if(isset($array['error'])){
                $this->error = $array['error_description'];
                return false;
            } elseif($this->expired($array['expires_in'], $array['timestamp'])){
                $this->refresh_token = $array['refresh_token'];
                $token = $this->get_token(NULL, true);
                if($this->write_token($token, 'file')){
                    $array = json_decode($token, true);
                    $this->refresh_token = $array['refresh_token'];
                    $this->access_token = $array['access_token'];
                    return true;
                }
            } else {
                $this->refresh_token = $array['refresh_token'];
                $this->access_token = $array['access_token'];
                return true;
            }
        }
    }
    
    /* Builds the URL for the call */
    private function build_url($api_func, array $opts = array(), $url) {
        if(!$url) $url = $this->api_url;
        $opts = $this->set_opts($opts);
        $base = $url . $api_func . '?';
        $query_string = http_build_query($opts);
        $base = $base . $query_string;
        return $base;
    }
    
    /* Sets the required before biulding the query */
    private function set_opts(array $opts) {
        if(!array_key_exists('access_token', $opts)) {
            $opts['access_token'] = $this->access_token;
        }
        return $opts;
    }
    
    private function parse_result($res) {
        $xml = simplexml_load_string($res);
        $json = json_encode($xml);
        $array = json_decode($json,TRUE);
        return $array;
    }
    
    private static function expired($expires_in, $timestamp) {
        $ctimestamp = time();
        if(($ctimestamp - $timestamp) >= $expires_in){
            return true;
        } else {
            return false;
        }
    }
    
    private function getStatus($code){
        $returnedCode = array(100=>"Continue",101=>"Switching Protocols", 200=>"OK", 201=>"Created", 202=>"Accepted", 203=>"Non-Authoritative Information",
                 204=>"No Content", 205=>"Reset Content", 206=>"Partial Content", 300=>"Multiple Choices", 301=>"Moved Permanently", 302=>"Found", 303=>"See Other",
                 304=>"Not Modified", 305=>"Use Proxy", 306=>"(Unused)", 307=>"Temporary Redirect", 400=>"Bad Request", 401=>"Unauthorized", 402=>"Payment Required",
                 403=>"Forbidden", 404=>"Not Found", 405=>"Method Not Allowed", 406=>"Not Acceptable", 407=>"Proxy Authentication Required", 408=>"Request Timeout",
                 409=>"Conflict", 410=>"Gone", 411=>"Length Required", 412=>"Precondition Failed", 413=>"Request Entity Too Large", 414=>"Request-URI Too Long",
                 415=>"Unsupported Media Type", 416=>"Requested Range Not Satisfiable", 417=>"Expectation Failed", 500=>"Internal Server Error", 501=>"Not Implemented",
                 502=>"Bad Gateway", 503=>"Service Unavailable", 504=>"Gateway Timeout", 505=>"HTTP Version Not Supported");
                
        $this->reponse_status = $code;
        $this->error_message = $returnedCode[$code];
    }
    
    private function get($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        //curl_setopt($ch, CURLOPT_VERBOSE, 1);
        //curl_setopt($ch, CURLOPT_HEADER, 1);
        
        if(!empty($this->asUser)) {
            $headers = array();
            $headers[] = "as-user:$this->asUser";
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }
        
        $data = curl_exec($ch);
        $this->getStatus(curl_getinfo($ch, CURLINFO_HTTP_CODE));
        
        curl_close($ch, $data);
        
        return $data;
    }
    
    private static function post($url, $params) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    
    private static function put($url, array $params = array()) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
    
    private static function delete($url, $params = '') {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }
}

Solution

  • You have two definitions of the function get_user_by_login:

    public function get_user_by_login($login, $complete = false){
    

    and

    public function get_user_by_login($login){
    

    It looks like the second definition isn't needed. It does the same thing as the first one when $complete is not supplied.