Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
71.43% covered (warning)
71.43%
5 / 7
CRAP
83.82% covered (warning)
83.82%
57 / 68
LeadpagesPages
0.00% covered (danger)
0.00%
0 / 1
75.00% covered (warning)
75.00%
6 / 8
24.05
83.82% covered (warning)
83.82%
57 / 68
 __construct
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
4 / 4
 getPages
0.00% covered (danger)
0.00%
0 / 1
3.41
64.29% covered (warning)
64.29%
9 / 14
 getAllUserPages
0.00% covered (danger)
0.00%
0 / 1
8.81
66.67% covered (warning)
66.67%
12 / 18
 stripB3NonPublished
100.00% covered (success)
100.00%
1 / 1
4
100.00% covered (success)
100.00%
4 / 4
 sortPages
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
0 / 0
 anonymous function
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getSinglePageDownloadUrl
100.00% covered (success)
100.00%
1 / 1
2
100.00% covered (success)
100.00%
13 / 13
 downloadPageHtml
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
12 / 12
<?php
namespace Leadpages\Pages;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Leadpages\Auth\LeadpagesLogin;
use GuzzleHttp\Exception\ClientException;
class LeadpagesPages
{
    /**
     * @var \GuzzleHttp\Client
     */
    private $client;
    /**
     * @var \Leadpages\Auth\LeadpagesLogin
     */
    private $login;
    /**
     * @var \Leadpages\Auth\LeadpagesLogin
     */
    public $response;
    public function __construct(Client $client, LeadpagesLogin $login)
    {
        $this->client = $client;
        $this->login = $login;
        $this->PagesUrl = "https://my.leadpages.net/page/v1/pages";
    }
    /**
     * Base function get call get users pages
     * @param bool|false $cursor
     *
     * @return array|\GuzzleHttp\Message\FutureResponse|\GuzzleHttp\Message\ResponseInterface|\GuzzleHttp\Ring\Future\FutureInterface|null
     */
    public function getPages($cursor  = false)
    {
        if(!$cursor) {
            $queryArray = [];
        }else{
            $queryArray = ['cursor' => $cursor];
        }
        try{
            $response = $this->client->get($this->PagesUrl,
              [
                'headers' => ['LP-Security-Token' => $this->login->token],
                'query' => $queryArray
              ]);
            $response       = [
              'code'     => '200',
              'response' => $response->getBody(),
              'error'    => (bool)false
            ];
        }catch (ClientException $e){
            $response       = [
              'code'     => $e->getCode(),
              'response' => $e->getMessage(),
              'error'    => (bool)true
            ];
        }
        return $response;
    }
    /**
     * Recursive function to get all of a users pages
     * @param array $returnResponse
     * @param bool|false $cursor
     *
     * @return array|mixed
     */
    public function getAllUserPages($returnResponse = array(), $cursor = false){
        //get & parse response
        $response = $this->getPages($cursor);
        $response = json_decode($response['response'], true);
        if(empty($response['_items'])){
            echo'<p><strong>You appear to have no Leadpages created yet.</strong></p>';
            echo '<p> Please login to <a href="https://my.leadpages.net" target="_blank">Leadpages</a> and create a Leadpage to continue.</p>';
            die();
        }
        //if we have more pages add these pages to returnResponse and pass it back into this method
        //to run again
        if($response['_meta']['hasMore'] == true){
            $returnResponse[] = $response['_items'];
            return $this->getAllUserPages($returnResponse, $response['_meta']['nextCursor']);
        }
        //once we run out of hasMore pages return the response with all pages returned
        if (!$response['_meta']['hasMore']) {
            /**
             * add last result to return response
             */
            $returnResponse[] = $response['_items'];
            /**
             * this maybe a bit hacky but for recursive and compatibility with other functions
             * needed all items to be under one array under _items array
             */
            //echo '<pre>';print_r($returnResponse);die();
            if (isset($returnResponse) && sizeof($returnResponse) > 0) {
                $pages = array(
                  '_items' => array()
                );
                foreach ($returnResponse as $subarray) {
                    $pages['_items'] = array_merge($pages['_items'], $subarray);
                }
                //strip out unpublished pages
                //sort pages asc by name
                $pages = $this->sortPages($this->stripB3NonPublished($pages));
                return $pages;
            }
        }
    }
    /**
     * Remove non published B3 pages
     * @param $pages
     *
     * @return mixed
     */
    public function stripB3NonPublished($pages)
    {
        foreach($pages['_items'] as $index => $page){
            if($page['isBuilderThreePage'] && !$page['isBuilderThreePublished']){
                unset($pages['_items'][$index]);
            }
        }
        return $pages;
    }
    /**
     * sort pages in alphabetical user
     *
     * @param $pages
     *
     * @return mixed
     */
    public function sortPages($pages)
    {
        usort($pages['_items'], function($a, $b){
            //need to convert them to lowercase strings for equal comparison
            return strcmp(strtolower($a["name"]), strtolower($b["name"]));
        });
        return $pages;
    }
    /**
     * Get the url to download the page url from
     * @param $pageId
     *
     * @return array|\GuzzleHttp\Message\FutureResponse|\GuzzleHttp\Message\ResponseInterface|\GuzzleHttp\Ring\Future\FutureInterface|null
     */
    public function getSinglePageDownloadUrl($pageId)
    {
        try{
            $response = $this->client->get($this->PagesUrl.'/'.$pageId,
              [
                'headers' => ['LP-Security-Token' => $this->login->token],
              ]);
            $body = json_decode($response->getBody(), true);
            $url  = $body['_meta']['publishUrl'];
            $responseText = ['url' => $url];
            $response       = [
              'code'     => '200',
              'response' => json_encode($responseText),
              'error'    => (bool)false
            ];
        }catch (ClientException $e){
            $response       = [
              'code'     => $e->getCode(),
              'response' => $e->getMessage(),
              'error'    => (bool)true
            ];
        }
        return $response;
    }
    /**
     * get url for page, then use a get request to get the html for the page
     * TODO at sometime this should be replaced with a single call to get the html this requires to calls
     * @param $pageId Leadpages Page id not wordpress post_id
     *
     * @return mixed
     */
    public function downloadPageHtml($pageId){
        if (is_null($this->login->token)) {
            $this->login->token = $this->login->getAccessToken();
        }
        $response = $this->getSinglePageDownloadUrl($pageId);
        $responseArray = json_decode($response['response'], true);
        try{
            $html = $this->client->get($responseArray['url']);
            $response =[
                'code' => 200,
                'response' => $html->getBody()->getContents()
            ];
        }catch(RequestException $e){
            $response       = [
              'code'     => $e->getCode(),
              'response' => $e->getMessage(),
              'error'    => (bool)true
            ];
        }
        return $response;
    }
}