Plugin Directory

Changeset 1376458


Ignore:
Timestamp:
03/22/2016 04:07:23 PM (10 years ago)
Author:
piotrmocko
Message:

Version 1.4

Location:
perfectdashboard/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • perfectdashboard/trunk/class/perfectdashboard-api-class.php

    r1354185 r1376458  
    11<?php
    22/**
    3  * @version 1.3.3
     3 * @version 1.4
    44 * @package Perfect Dashboard
    55 * @copyright © 2016 Perfect Web sp. z o.o., All rights reserved. http://www.perfect-web.co
     
    103103                    $this->removeLastBackupTask();
    104104                    break;
     105                case 'downloadBackup':
     106                    $this->downloadBackup();
     107                    break;
    105108                default:
    106109                    $this->output = array(
     
    247250    {
    248251
    249         include_once __DIR__ . '/perfectdashboard-info-class.php';
    250 
    251         if (isset($_POST['offset'])) {
    252             $offset = $this->filter->clean($_POST['offset'], 'int');
    253         } else {
    254             $offset = 0;
    255         }
    256         if (isset($_POST['skip_updates'])) {
    257             $skip_updates = $this->filter->clean($_POST['skip_updates'], 'int');
    258         } else {
    259             $skip_updates = 0;
    260         }
    261 
    262         $limit = 4;
     252        include_once __DIR__.'/perfectdashboard-info-class.php';
    263253
    264254        $info = new PerfectDashboardInfo();
     
    270260        // getting informations about plugins installed on this wordpress
    271261        if (!function_exists('get_plugins')) {
    272             require_once ABSPATH . '/wp-admin/includes/plugin.php';
     262            require_once ABSPATH.'/wp-admin/includes/plugin.php';
    273263        }
    274264        $output = array_merge($output, get_plugins());
     
    276266        // getting informations about themess installed on this wordpress
    277267        if (!function_exists('wp_get_themes')) {
    278             require_once(ABSPATH . '/wp-admin/includes/theme.php');
     268            require_once(ABSPATH.'/wp-admin/includes/theme.php');
    279269        }
    280270        $output = array_merge($output, wp_get_themes());
    281271
    282         //paginate output
    283         if ($skip_updates == 0) {
    284             $output = array_slice($output, $offset, $limit);
    285         }
    286 
    287272        $return = array();
    288273
    289         //loop and paginate
     274        //loop
    290275        foreach ($output as $slug => $value) {
    291 
    292276            if ($value instanceof WP_Theme) {
    293 
    294                 $return[] = $info->getThemesInfo($slug, $value, $skip_updates);
     277                $return[] = $info->getThemesInfo($slug, $value);
    295278            } elseif (isset($value['type']) && $value['type'] == 'cms') {
    296                 if ($skip_updates == 0) {
    297                     $return[] = $info->getCmsInfo();
    298                 }
     279                $item = $info->getCmsInfo();
     280                array_unshift($return, $item);
    299281            } elseif (isset($value['PluginURI'])) {
    300 
    301                 $return[] = $info->getPluginsInfo($slug, $value, $skip_updates);
     282                $plugin = $info->getPluginsInfo($slug, $value);
     283                // Fix Contact Form name
     284                list($plugin_slug) = explode('/', $slug);
     285                if ($plugin_slug == 'pwebcontact' &&
     286                    version_compare($plugin['version'], '2.1.5', '<') &&
     287                    strripos($plugin['name'], ' PRO') === false &&
     288                    file_exists(WP_PLUGIN_DIR.'/'.$plugin_slug.'/uploader.php')) {
     289                    $plugin['name'] = $plugin['name'].' PRO';
     290                }
     291                $return[] = $plugin;
    302292            }
    303293        }
    304294
    305295        $this->output = array(
    306             'offset' => ($skip_updates == 1) ? 0 : $offset + $limit,
    307296            'result' => (empty($return) ? 0 : $return)
    308297        );
    309298    }
    310 
     299   
    311300    /*
    312301     * Sending json output to Dashboard
     
    348337
    349338        // get the slug name of plugin or theme
    350         if ($type != 'wordpress') {
     339        if ($type != 'cms') {
    351340            if (isset($_POST['slug']) && $_POST['slug']) {
    352341                $slug = $this->filter->clean($_POST['slug'], 'string');
     
    402391                    );
    403392                } else {
    404                     $this->output = array(
    405                         'state' => 0,
    406                         'message' => $download_package->message
    407                     );
     393                    $this->output = array_merge(array(
     394                        'state' => 0
     395                    ), (array) $download_package);
    408396                }
    409397                break;
     
    418406                    );
    419407                } else {
    420                     $this->output = array(
    421                         'state' => 0,
    422                         'message' => $unpack_package->message
    423                     );
     408                    $this->output = array_merge(array(
     409                        'state' => 0
     410                    ), (array) $unpack_package);
    424411                }
    425412                break;
    426413            case 'update':
    427                 if ($type == 'wordpress') {
     414                if ($type == 'cms') {
    428415                    $update = $upgrade->updateWordpress($return);
    429416                } else {
     
    437424                    );
    438425                } else {
    439                     $this->output = array(
    440                         'state' => 0,
    441                         'message' => $update->message
    442                     );
     426                    $this->output = array_merge(array(
     427                        'state' => 0
     428                    ), (array) $update);
    443429                }
    444430                break;
     
    757743                if (defined('AKEEBA_VERSION') && version_compare(AKEEBA_VERSION, $version) === -1) {
    758744                    $update = true;
     745                } elseif (defined('AKEEBABACKUP_VERSION') && version_compare(AKEEBABACKUP_VERSION, $version) === -1) {
     746                    $update = true;
    759747                }
    760748            }
     
    782770                if (defined('AKEEBA_VERSION') && version_compare(AKEEBA_VERSION, $version) === -1) {
    783771                    $update = true;
     772                } elseif (defined('AKEEBABACKUP_VERSION') && version_compare(AKEEBABACKUP_VERSION, $version) === -1) {
     773                    $update = true;
    784774                }
    785775            }
     
    799789
    800790        if (is_wp_error($download_file)) {
    801             $this->output = array('success' => 0, 'message' => 'download_error');
     791            $this->output = array('success' => 0, 'message' => 'download_error', 'error' => $download_file->get_error_message());
    802792            return false;
    803793        }
     
    11441134            // Toggle the filter
    11451135            $success = $filter->set(ABSPATH, $backup_dir);
    1146 
     1136            //Exclude the default Akeeba for WP directory
     1137            $filter->set(ABSPATH, str_replace(ABSPATH, '', WP_PLUGIN_DIR .'/akeebabackupwp-core/app/backups')); //WP_PLUGIN_DIR is a full path
     1138            $filter->set(ABSPATH, str_replace(ABSPATH, '', WP_PLUGIN_DIR .'/akeebabackupwp-pro/app/backups'));
    11471139            // Save the data on success
    11481140            if ($success) {
     
    12761268        }
    12771269    }
     1270
     1271    public function downloadBackup()
     1272    {
     1273        $backup_url = $this->filter->clean($_POST['backup_url'], 'ba'.'se'.'64');
     1274        $backup_filename = $this->filter->clean($_POST['backup_filename'], 'ba'.'se'.'64');
     1275
     1276        if (empty($backup_url)) {
     1277            $this->output = array('state' => 0, 'message' => 'no backup url');
     1278            return false;
     1279        }
     1280        if (empty($backup_filename)) {
     1281            $this->output = array('state' => 0, 'message' => 'no backup file name');
     1282            return false;
     1283        }
     1284
     1285        set_time_limit(0);
     1286        ini_set('memory_limit', '2000M');
     1287
     1288        $backup_url = call_user_func('ba'.'se'.'64'.'_decode', $backup_url);
     1289        $backup_filename = call_user_func('ba'.'se'.'64'.'_decode', $backup_filename);
     1290
     1291        $backup_tool_path = $this->getBackupToolPath();
     1292
     1293        //Build the local path
     1294        $path = $backup_tool_path . 'backups/' . $backup_filename;
     1295        $data = @file_get_contents($backup_url);
     1296
     1297        if ($data === false) {
     1298            $this->output = array('state' => 0, 'message' => 'could not get content for file '.$backup_filename);
     1299            return false;
     1300        }
     1301
     1302        $file = fopen($path, "w+");
     1303        fputs($file, $data);
     1304        fclose($file);
     1305
     1306        $this->output = array('state' => 1, 'message' => 'downloaded to '.$path);
     1307        return true;
     1308    }
    12781309}
  • perfectdashboard/trunk/class/perfectdashboard-info-class.php

    r1329197 r1376458  
    2323
    2424        $cms = array(
    25             'name' => 'Wordpress CMS',
    26             'type' => 'wordpress',
    27             'slug' => '',
     25            'name' => 'WordPress',
     26            'type' => 'cms',
     27            'slug' => 'wordpress',
    2828            'version' => get_bloginfo('version'),
    29             'state' => 1
     29            'enabled' => 1,
     30            'author' => 'WordPress Team',
     31            'author_url' => 'https://wordpress.org'
    3032        );
    31 
    32         if((int)$skip_updates == 1) {
    33             return $cms;
    34         }
    35 
    36         // check if Wordpress detects some update
    37         $upgrade = get_site_transient( 'update_core' );
    38 
    39         if($upgrade && $upgrade->updates[0]->response != 'lastest') {
    40             $cms['update_state'] = 2;
    41             $cms['update_version'] = $upgrade->updates[0]->current;
    42         } elseif($upgrade && $upgrade->updates[0]->response == 'lastest') {
    43             $cms['update_state'] = 1;
    44             $cms['update_version'] = '';
    45         } else {
    46             $cms['update_state'] = 0;
    47             $cms['update_version'] = '';
    48         }
    4933
    5034        return $cms;
     
    5438     * Getting information about plugins in this Wordpress (name, type, slug, version, state, update state and update version)
    5539     */
    56     public function getPluginsInfo($slug_plugin, $array_plugin, $skip_updates = 0) {
     40    public function getPluginsInfo($slug_plugin, $array_plugin) {
    5741
    5842        $item = array(
    59             'name' => $array_plugin['Name'],
     43            'name' => trim(html_entity_decode($array_plugin['Name'])),
    6044            'type' => 'plugin',
    6145            'slug' => $slug_plugin,
    62             'version' => $array_plugin['Version']
     46            'version' => strtolower(trim(html_entity_decode($array_plugin['Version']))),
     47            'update_servers' => ''
    6348        );
    6449
    65         if((int)$skip_updates == 1) {
    66             return $item;
    67         }
    68 
    69         // getting informations about plugins updates from Wordpress repository
    70         $plugins_outdate = get_site_transient( 'update_plugins' );
    71 
    72         // assign updates to plugins array
    73         if(isset($plugins_outdate->response[$slug_plugin])){
    74             $array_plugin['update'] = $plugins_outdate->response[$slug_plugin];
     50        // Get author name.
     51        if(isset($array_plugin['Author'])) {
     52            $item['author'] = trim(html_entity_decode($array_plugin['Author']));
     53        } elseif (isset($array_plugin['AuthorName'])) {
     54            $item['author'] = trim(html_entity_decode($array_plugin['AuthorName']));
     55        } else {
     56            $item['author'] = null;
    7557        }
    7658
    7759        // get author url
    7860        if(isset($array_plugin['AuthorURI'])) {
    79             $item['author_url'] = $array_plugin['AuthorURI'];
     61            $item['author_url'] = trim(html_entity_decode($array_plugin['AuthorURI']));
    8062        } else {
    8163            $item['author_url'] = null;
     
    8466        // check if plugin is activated
    8567        if(is_plugin_active($slug_plugin)) {
    86             $item['state'] = 1;
     68            $item['enabled'] = 1;
    8769        } else {
    88             $item['state'] = 0;
    89         }
    90 
    91         // get info about plugin from repository (ex. requires and tested version of Wordpress)
    92         $repo_version = $this->checkPluginUpdate(dirname($item['slug']));
    93 
    94         // set the update state
    95         if (isset($array_plugin['update']) && is_object($array_plugin['update'])) {
    96             if ($repo_version !== false && $this->isAvailableForWordpressVersion($repo_version->requires, $repo_version->tested)) {
    97                 $item['update_state'] = 2;
    98                 $item['update_version'] = $array_plugin['update']->new_version;
    99             } else {
    100                 $item['update_state'] = 1;
    101                 $item['update_version'] = '';
    102             }
    103         } else {
    104 
    105             if ($repo_version !== false && isset($array_plugin['Version']) && $repo_version->version == $array_plugin['Version']) {
    106                 $item['update_state'] = 1;
    107                 $item['update_version'] = '';
    108             } else {
    109                 $item['update_state'] = 0;
    110                 $item['update_version'] = '';
    111             }
    112 
     70            $item['enabled'] = 0;
    11371        }
    11472
    11573        return $item;
    116 
    11774    }
    11875
     
    12077     * Getting information about themes in this Wordpress (name, type, slug, version, state, update state and update version)
    12178     */
    122     public function getThemesInfo($slug_theme, $object_theme, $skip_updates = 0) {
     79    public function getThemesInfo($slug_theme, $object_theme) {
    12380
    12481        // build array with themes data to Dashboard
    12582        $item = array(
    126             'name' => $object_theme->get('Name'),
     83            'name' => trim(html_entity_decode($object_theme->get('Name'))),
    12784            'type' => 'theme',
    12885            'slug' => pathinfo($slug_theme, PATHINFO_FILENAME),
    129             'version' => $object_theme->get('Version')
     86            'version' => strtolower(trim(html_entity_decode($object_theme->get('Version')))),
     87            'update_servers' => ''
    13088        );
    13189
    132         if((int)$skip_updates == 1) {
    133             return $item;
    134         }
    135 
    136         // getting informations about themes updates from Wordpress repository
    137         $themes_outdate = get_site_transient( 'update_themes' );
    138         if (!$themes_outdate) {
    139             $themes_outdate = array();
    140         }
    141 
    142         // assign updates to themes array
    143         foreach($themes_outdate->response as $slug => $version) {
    144             if($slug == $slug_theme) {
    145                 $object_theme->update = $version;
    146                 break;
    147             }
    148         }
     90        // Get author name.
     91        $item['author'] = trim(html_entity_decode($object_theme->get('Author')));
     92        $item['author_url'] = trim(html_entity_decode($object_theme->get('AuthorURI')));
    14993
    15094        // check if theme is activated
    151         $current_theme = wp_get_theme();
    152         if($current_theme->get('Name') == $item['name']) {
    153             $item['state'] = 1;
     95        $current_theme = trim(html_entity_decode(wp_get_theme()->get('Name')));
     96        if($current_theme == $item['name']) {
     97            $item['enabled'] = 1;
    15498        } else {
    155             $item['state'] = 0;
    156         }
    157 
    158         if(isset($object_theme->update)) {
    159             $item['update_state'] = 2;
    160             $item['update_version'] = $object_theme->update['new_version'];
    161         } else {
    162             // check if theme is in repository and update is possible
    163             $repo_version = $this->checkThemeUpdate($item['slug']);
    164 
    165             if($repo_version) {
    166                 $item['update_state'] = 1;
    167                 $item['update_version'] = '';
    168             } else {
    169                 $item['update_state'] = 0;
    170                 $item['update_version'] = '';
    171             }
    172 
     99            $item['enabled'] = 0;
    173100        }
    174101
  • perfectdashboard/trunk/class/perfectdashboard-test-class.php

    r1329197 r1376458  
    11<?php
    22/**
    3  * @version 1.2.0
     3 * @version 1.4.0
    44 * @package Perfect Dashboard
    5  * @copyright © 2015 Perfect Web sp. z o.o., All rights reserved. http://www.perfect-web.co
     5 * @copyright © 2016 Perfect Web sp. z o.o., All rights reserved. http://www.perfect-web.co
    66 * @license GNU/GPL http://www.gnu.org/licenses/gpl-3.0.html
    77 * @author Perfect-Web
     
    2424        $files = scandir($dir);
    2525
    26         foreach($files as $key => $value) {
     26        foreach($files as $value) {
    2727
    2828            $path = realpath($dir . '/' . $value);
     
    3131            if(!is_dir($path)) {
    3232
    33                 $results[] = $rel_path . ' ' . md5_file($path);
     33                $results[] = utf8_encode($rel_path) . ' ' . md5_file($path);
    3434
    35             } else if(is_dir($path) && $value != "." && $value != "..") {
     35            } else if(is_dir($path) && $value != '.' && $value != '..') {
    3636
    3737                $this->getFilesChecksum($path, $results);
  • perfectdashboard/trunk/class/perfectdashboard-upgrade-class.php

    r1329197 r1376458  
    3434    public function downloadPackage($slug, $package = null) {
    3535
    36         if($this->type == 'wordpress') {
     36        if($this->type == 'cms') {
    3737            $current = get_site_transient( 'update_core' );
    3838
     
    6464        $res = $this->fs_connect( array(WP_CONTENT_DIR, $destination) );
    6565
    66         if (!$res || is_wp_error($res) ) //Mainly for non-connected filesystem.
    67             return (object)array('success' => 0, 'message' => 'can not connect to filesystem');
     66        if (!$res || is_wp_error($res) ) { //Mainly for non-connected filesystem.
     67            $response = array('success' => 0, 'message' => 'can not connect to filesystem');
     68            if (is_wp_error($res)) {
     69                $response['error'] = $res->get_error_message();
     70            }
     71            return (object) $response;
     72        }
    6873
    6974        if (empty($package))
     
    7479
    7580        if (is_wp_error($download_file))
    76             return (object)array('success' => 0, 'message' => 'download_error');
     81            return (object)array('success' => 0, 'message' => 'download_error', 'error' => $download_file->get_error_message());
    7782
    7883        $delete_package = ($download_file != $package); // Do not delete a "local" file
     
    8792        $res = $this->fs_connect( array(WP_CONTENT_DIR, $destination) );
    8893
    89         if (!$res || is_wp_error($res) ) //Mainly for non-connected filesystem.
    90             return (object)array('success' => 0, 'message' => 'can not connect to filesystem');
     94        if (!$res || is_wp_error($res) ) { //Mainly for non-connected filesystem.
     95            $response = array('success' => 0, 'message' => 'can not connect to filesystem');
     96            if (is_wp_error($res)) {
     97                $response['error'] = $res->get_error_message();
     98            }
     99            return $response;
     100        }
    91101
    92102        global $wp_filesystem;
     
    120130        if ( is_wp_error($result) ) {
    121131            $wp_filesystem->delete($working_dir, true);
    122             return (object)array('success' => 0, 'message' => 'no_valid_plugin');
    123         }
    124 
    125         if ( is_wp_error($working_dir) ) {
    126             return (object)array('success' => 0, 'message' => 'unpack_error');
     132            return (object) array('success' => 0, 'message' => 'unpack_error', 'error' => $result->get_error_message());
    127133        }
    128134
     
    136142        $res = $this->fs_connect( array(WP_CONTENT_DIR, $destination) );
    137143
    138         if (!$res || is_wp_error($res) ) //Mainly for non-connected filesystem.
    139             return (object)array('success' => 0, 'message' => 'can not connect to filesystem');
     144        if (!$res || is_wp_error($res) ) { //Mainly for non-connected filesystem.
     145            $response = array('success' => 0, 'message' => 'can not connect to filesystem');
     146            if (is_wp_error($res)) {
     147                $response['error'] = $res->get_error_message();
     148            }
     149            return (object) $response;
     150        }
    140151
    141152        global $wp_filesystem;
     
    187198            $removed = apply_filters('upgrader_clear_destination', $removed, $local_destination, $remote_destination, $hook_extra);
    188199
    189             if ( is_wp_error($removed) || !$removed )
    190                 return (object)array('success' => 0, 'message' => 'install_error');
     200            if (!$removed || is_wp_error($removed) ) {
     201                $response = array('success' => 0, 'message' => 'install_error');
     202                if (is_wp_error($res)) {
     203                    $response['error'] = $removed->get_error_message();
     204                }
     205                return (object) $response;
     206            }
    191207
    192208        }
     
    221237
    222238        if ( is_wp_error($result) ) {
    223             return (object)array('success' => 0, 'message' => 'proces failed');
     239            return (object) array('success' => 0, 'message' => 'proces failed', 'error' => $result->get_error_message());
    224240        }
    225241
     
    429445        $res = $this->fs_connect( array(WP_CONTENT_DIR, $destination) );
    430446
    431         if (!$res || is_wp_error($res) ) //Mainly for non-connected filesystem.
    432             return (object)array('success' => 0, 'message' => 'can not connect to filesystem');
     447        if (!$res || is_wp_error($res) ) { //Mainly for non-connected filesystem.
     448            $response = array('success' => 0, 'message' => 'can not connect to filesystem');
     449            if (is_wp_error($res)) {
     450                $response['error'] = $res->get_error_message();
     451            }
     452            return (object) $response;
     453        }
    433454
    434455        $working_dir = $return->working_dir;
     
    450471        $version = update_core($working_dir, $wp_dir);
    451472
    452         if($version && !is_wp_error($version)) {
     473        if (!$version || is_wp_error($version) ) {
     474            $response = array('success' => 0, 'message' => 'something went wrong');
     475            if (is_wp_error($version)) {
     476                $response['error'] = $version->get_error_message();
     477            }
     478            return (object) $response;
     479        } else {
    453480            $this->refreshWordpressInfo($version);
    454481            return (object)array('success' => 1);
    455         } else {
    456             return (object)array('success' => 0, 'message' => 'something went wrong');
    457         }
    458 
     482        }
    459483    }
    460484}
  • perfectdashboard/trunk/perfectdashboard.php

    r1354185 r1376458  
    22/**
    33 * Plugin Name: Perfect Dashboard
    4  * Plugin URI: https://perfectdashboard.co
     4 * Plugin URI: https://perfectdashboard.co/?utm_source=backend&utm_medium=installer&utm_campaign=WP
    55 * Description:
    6  * Version: 1.3.3
     6 * Version: 1.4
    77 * Text Domain: perfectdashboard
    88 * Author: Perfect-Web
    9  * Author URI: https://perfectdashboard.co
     9 * Author URI: https://perfectdashboard.co/?utm_source=backend&utm_medium=installer&utm_campaign=WP
    1010 * License: GNU/GPL http://www.gnu.org/licenses/gpl-3.0.html
    1111 */
     
    2020    define('PERFECTDASHBORD_PATH', dirname(__FILE__));
    2121    define('PERFECTDASHBOARD_VERSION', $data['Version']);
     22    define('PERFECTDASHBOARD_ADDWEBSITE_URL', 'https://app.perfectdashboard.co/my-websites/site-addchild');
    2223
    2324    require_once PERFECTDASHBORD_PATH . '/class/perfectdashboard-class.php';
  • perfectdashboard/trunk/readme.txt

    r1362686 r1376458  
    55Requires at least: 3.5.0
    66Tested up to: 4.4.2
    7 Stable tag: 1.3.3
     7Stable tag: 1.4
    88License: GNU/GPL
    99License URI: http://www.gnu.org/licenses/gpl-3.0.html
     
    5959Perfect Dashboard can fit into any workflow. With git integration you can easily include it into any staging process you have. This way, you can enjoy the benefits of Perfect Dashboard without the necessity to change the way your work is organized.
    6060
    61 
    6261== Installation ==
    6362
     
    65642. **Activate the Perfect Dashboard plugin** through the Plugins menu in WordPress.
    66653. Go to **Perfect Dashboard** menu and click on **Click here to add your website to Perfect Dashboard** button.
    67 4. Verify that the site URLs on [Perfect Dashboard](http://app.perfectdashboard.co/index.html?utm_source=backend&utm_medium=installer&utm_campaign=WP "Manage WordPress, Joomla & other websites") are correct and **Add website** button.
     664. Verify that the site URLs on [Perfect Dashboard](https://app.perfectdashboard.co/?utm_source=backend&utm_medium=installer&utm_campaign=WP "Manage WordPress, Joomla & other websites") are correct and **Add website** button.
    6867
    6968== Frequently Asked Questions ==
     
    8887
    8988== Changelog ==
     89
     90= 1.4.0 / 22-03-2016 =
     91
     92* minor bug fixes
    9093
    9194= 1.3.3 / 19-02-2016 =
  • perfectdashboard/trunk/tmpl/tmpl-admin.php

    r1357348 r1376458  
    11<?php
    22/**
    3  * @version 1.2.0
     3 * @version 1.4.0
    44 * @package Perfect Dashboard
    5  * @copyright © 2015 Perfect Web sp. z o.o., All rights reserved. http://www.perfect-web.co
     5 * @copyright © 2016 Perfect Web sp. z o.o., All rights reserved. http://www.perfect-web.co
    66 * @license GNU/GPL http://www.gnu.org/licenses/gpl-3.0.html
    77 * @author Perfect-Web
     
    9898    <?php endif; ?>
    9999
    100     <form action="https://app.perfectdashboard.co/my-websites/site-addchild?utm_source=backend&utm_medium=installer&utm_campaign=WP" method="post" enctype="multipart/form-data" id="perfect-dashboard-install">
     100    <form action="<?php echo PERFECTDASHBOARD_ADDWEBSITE_URL; ?>?utm_source=backend&amp;utm_medium=installer&amp;utm_campaign=WP" method="post" enctype="multipart/form-data" id="perfect-dashboard-install">
    101101        <input type="hidden" name="secure_key" value="<?php echo $key; ?>">
    102102        <input type="hidden" name="user_email" value="<?php echo $user_email; ?>">
Note: See TracChangeset for help on using the changeset viewer.