/** * Handles shortcode form * @param ctShortcode $shortcode * @param null $containerName * @param null $defaults * @throws Exception * @return bool|string */ protected function appendShortcodeForm($shortcode, $containerName = null, $defaults = null) { $containerName = $containerName ? $containerName : 'container_' . ++$this->counter; $this->form->addBreak($containerName); $attributes = array_diff_key($shortcode->getAttributesNormalized(), $this->bannedAttributes); $defaults = $defaults ? $defaults : $this->defaults; foreach ($attributes as $name => $attribute) { $attribute = $this->normalizeAttribute($name, $attribute, $defaults); //may be false if ($attribute['type'] && $attribute['type'] != 'false') { if (!method_exists($this, $attribute['type'])) { throw new Exception("Cannot handle " . $attribute['type'] . ' type'); } $this->{$attribute}['type']($name, $attribute); } } return false; }
/** * Shows the page that allows the details of a website to be modified or added to the portfolio. */ function WPPortfolio_modify_website() { // Determine if we're in edit mode. Ensure we get correct mode regardless of where it is. $editmode = false; if (isset($_POST['editmode'])) { $editmode = $_POST['editmode'] == 'edit'; } else { if (isset($_GET['editmode'])) { $editmode = $_GET['editmode'] == 'edit'; } } // Get the site ID. Ensure we get ID regardless of where it is. $siteid = 0; if (isset($_POST['website_siteid'])) { $siteid = is_numeric($_POST['website_siteid']) ? $_POST['website_siteid'] + 0 : 0; } else { if (isset($_GET['siteid'])) { $siteid = is_numeric($_GET['siteid']) ? $_GET['siteid'] + 0 : 0; } } // Work out page heading $verb = __("Add New", 'wp-portfolio'); if ($editmode) { $verb = __("Modify", 'wp-portfolio'); } ?> <div class="wrap"> <div id="icon-themes" class="icon32"> <br/> </div> <h2><?php echo $verb . ' ' . __('Website Details', 'wp-portfolio'); ?> </h2> <?php // Check id is a valid number if editing $editmode if ($editmode && $siteid == 0) { WPPortfolio_showMessage(sprintf(__('Sorry, but no website with that ID could be found. Please click <a href="%s">here</a> to return to the list of websites.', 'wp-portfolio'), WPP_WEBSITE_SUMMARY), true); return; } // If we're editing, try to get the website details. if ($editmode && $siteid > 0) { // Get details from the database $websitedetails = WPPortfolio_getWebsiteDetails($siteid); // False alarm, couldn't find it. if (count($websitedetails) == 0) { $editmode = false; } } else { $websitedetails['siteactive'] = 1; $websitedetails['displaylink'] = 1; } // Check if website is being added, if so, add to the database. if (isset($_POST) && isset($_POST['update'])) { // Grab specified details $data = array(); $data['siteid'] = $_POST['website_siteid']; $data['sitename'] = trim(strip_tags($_POST['website_sitename'])); $data['siteurl'] = trim(strip_tags($_POST['website_siteurl'])); $data['sitedescription'] = $_POST['website_sitedescription']; $data['sitegroup'] = $_POST['website_sitegroup']; $data['customthumb'] = trim(strip_tags($_POST['website_customthumb'])); $data['siteactive'] = trim(strip_tags($_POST['website_siteactive'])); $data['displaylink'] = trim(strip_tags($_POST['website_displaylink'])); $data['siteorder'] = trim(strip_tags($_POST['website_siteorder'])) + 0; $data['specificpage'] = trim(strip_tags($_POST['website_specificpage'])); $data['customfield'] = trim(strip_tags($_POST['website_customfield'])); $data['siteadded'] = trim(strip_tags($_POST['siteadded'])); // Keep track of errors for validation $errors = array(); // Ensure all fields have been completed if (!($data['sitename'] && $data['siteurl'] && $data['sitedescription'])) { array_push($errors, __("Please check that you have completed the site name, url and description fields.", 'wp-portfolio')); } // Check custom field length if (strlen($data['customfield']) > 255) { array_push($errors, __("Sorry, but the custom field is limited to a maximum of 255 characters.", 'wp-portfolio')); } // Check that the date is correct if ($data['siteadded']) { $dateTS = 0; //strtotime($data['siteadded']); if (preg_match('/^([0-9]{4}\\-[0-9]{2}\\-[0-9]{2} [0-9]{2}\\:[0-9]{2}\\:[0-9]{2})$/', $data['siteadded'], $matches)) { $dateTS = strtotime($data['siteadded']); } // Invalid date if ($dateTS == 0) { array_push($errors, __("Sorry, but the 'Date Added' date format was not recognised. Please enter a date in the format <em>'yyyy-mm-dd hh:mm:ss'</em>.", 'wp-portfolio')); } else { $data['siteadded'] = date('Y-m-d H:i:s', $dateTS); } } else { // Date is blank, so create correct one. $data['siteadded'] = date('Y-m-d H:i:s'); } // Continue if there are no errors if (count($errors) == 0) { global $wpdb; $table_name = $wpdb->prefix . TABLE_WEBSITES; // Change query based on add or edit if ($editmode) { $query = arrayToSQLUpdate($table_name, $data, 'siteid'); } else { unset($data['siteid']); // Don't need id for an insert $data['siteadded'] = date('Y-m-d H:i:s'); // Only used if adding a website. $query = arrayToSQLInsert($table_name, $data); } // Try to put the data into the database $wpdb->show_errors(); $wpdb->query($query); // When adding, clean fields so that we don't show them again. if ($editmode) { WPPortfolio_showMessage(__("Website details successfully updated.", 'wp-portfolio')); // Retrieve the details from the database again $websitedetails = WPPortfolio_getWebsiteDetails($siteid); } else { WPPortfolio_showMessage(__("Website details successfully added.", 'wp-portfolio')); $data['siteid'] = false; $data['sitename'] = false; $data['siteurl'] = false; $data['sitedescription'] = false; $data['sitegroup'] = false; $data['customthumb'] = false; $data['siteactive'] = 1; // The default is that the website is visible. $data['displaylink'] = 1; // The default is to show the link. $data['siteorder'] = 0; $data['specificpage'] = 0; $data['customfield'] = false; } } else { $message = __("Sorry, but unfortunately there were some errors. Please fix the errors and try again.", 'wp-portfolio') . '<br><br>'; $message .= "<ul style=\"margin-left: 20px; list-style-type: square;\">"; // Loop through all errors in the $error list foreach ($errors as $errormsg) { $message .= "<li>{$errormsg}</li>"; } $message .= "</ul>"; WPPortfolio_showMessage($message, true); $websitedetails = $data; } } $form = new FormBuilder(); $formElem = new FormElement("website_sitename", __("Website Name", 'wp-portfolio')); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'sitename'); $formElem->description = __("The proper name of the website.", 'wp-portfolio') . ' <em>' . __('(Required)', 'wp-portfolio') . '</em>'; $form->addFormElement($formElem); $formElem = new FormElement("website_siteurl", __("Website URL", 'wp-portfolio')); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'siteurl'); $formElem->description = __("The URL for the website, including the leading", 'wp-portfolio') . ' <em>http://</em>. <em>' . __('(Required)', 'wp-portfolio') . '</em>'; $form->addFormElement($formElem); $formElem = new FormElement("website_sitedescription", __("Website Description", 'wp-portfolio')); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'sitedescription'); $formElem->description = __("The description of your website. HTML is permitted.", 'wp-portfolio') . ' <em>' . __('(Required)', 'wp-portfolio') . "</em>"; $formElem->setTypeAsTextArea(4, 70); $form->addFormElement($formElem); global $wpdb; $table_name = $wpdb->prefix . TABLE_WEBSITE_GROUPS; $SQL = "SELECT * FROM {$table_name} ORDER BY groupname"; $groups = $wpdb->get_results($SQL, OBJECT); $grouplist = array(); foreach ($groups as $group) { $grouplist[$group->groupid] = stripslashes($group->groupname); } $formElem = new FormElement("website_sitegroup", "Website Group"); $formElem->setTypeAsComboBox($grouplist); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'sitegroup'); $formElem->description = __("The group you want to assign this website to.", 'wp-portfolio'); $form->addFormElement($formElem); $form->addBreak('advanced-options', '<div id="wpp-hide-show-advanced" class="wpp_hide"><a href="#">' . __('Show Advanced Settings', 'wp-portfolio') . '</a></div>'); $formElem = new FormElement("website_siteactive", __("Show Website?", 'wp-portfolio')); $formElem->setTypeAsComboBox(array('1' => __('Show Website', 'wp-portfolio'), '0' => __('Hide Website', 'wp-portfolio'))); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'siteactive'); $formElem->description = __("By changing this option, you can show or hide a website from the portfolio.", 'wp-portfolio'); $form->addFormElement($formElem); $formElem = new FormElement("website_displaylink", __("Show Link?", 'wp-portfolio')); $formElem->setTypeAsComboBox(array('show_link' => __('Show Link', 'wp-portfolio'), 'hide_link' => __('Hide Link', 'wp-portfolio'))); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'displaylink'); $formElem->description = __("With this option, you can choose whether or not to display the URL to the website.", 'wp-portfolio'); $form->addFormElement($formElem); $formElem = new FormElement("siteadded", __("Date Website Added", 'wp-portfolio')); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'siteadded'); $formElem->description = __("Here you can adjust the date in which the website was added to the portfolio. This is useful if you're adding items retrospectively. (valid format is yyyy-mm-dd hh:mm:ss)", 'wp-portfolio'); $form->addFormElement($formElem); $formElem = new FormElement("website_siteorder", __("Website Ordering", 'wp-portfolio')); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'siteorder'); $formElem->description = '• ' . __("The number to use for ordering the websites. Websites are rendered in ascending order, first by this order value (lowest value first), then by website name.", 'wp-portfolio') . '<br/>' . '• ' . __("e.g. Websites (A, B, C, D) with ordering (50, 100, 0, 50) will be rendered as (C, A, D, B).", 'wp-portfolio') . '<br/>' . '• ' . __("If all websites have 0 for ordering, then the websites are rendered in alphabetical order by name.", 'wp-portfolio'); $form->addFormElement($formElem); $formElem = new FormElement("website_customthumb", __("Custom Thumbnail URL", 'wp-portfolio')); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'customthumb'); $formElem->cssclass = "long-text"; $formElem->description = __("If specified, the URL of a custom thumbnail to use <em>instead</em> of the screenshot of the URL above.", 'wp-portfolio') . '<br/>' . '• ' . __("The image URL must include the leading <em>http://</em>, e.g.", 'wp-portfolio') . ' <em>http://www.yoursite.com/wp-content/uploads/yourfile.jpg</em><br/>' . '• ' . __("Leave this field blank to use an automatically generated screenshot of the website specified above.", 'wp-portfolio') . '<br/>' . '• ' . __("Custom thumbnails are automatically resized to match the size of the other thumbnails.", 'wp-portfolio'); $form->addFormElement($formElem); $formElem = new FormElement("website_customfield", __("Custom Field", 'wp-portfolio') . "<br/><span class=\"wpp-advanced-feature\">• " . __("Advanced Feature", 'wp-portfolio') . "</span>"); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'customfield'); $formElem->cssclass = "long-text"; $formElem->description = sprintf(__("Allows you to specify a value that is substituted into the <code><b>%s</b></code> field. This can be any value. Examples of what you could use the custom field for include:", 'wp-portfolio'), WPP_STR_WEBSITE_CUSTOM_FIELD) . '<br/>' . '• ' . __("Affiliate URLs for the actual URL that visitors click on.", 'wp-portfolio') . '<br/>' . '• ' . __("Information as to the type of work a website relates to (e.g. design work, SEO, web development).", 'wp-portfolio'); $form->addFormElement($formElem); // Advanced Features $formElem = new FormElement("website_specificpage", __("Use Specific Page Capture", 'wp-portfolio') . "<br/>" . "<span class=\"wpp-advanced-feature\">• " . __("Advanced Feature", 'wp-portfolio') . "</span><br/>" . "<span class=\"wpp-stw-paid\">• " . __("STW Paid Account Only", 'wp-portfolio') . "</span>"); $formElem->setTypeAsComboBox(array('0' => __('No - Homepage Only', 'wp-portfolio'), '1' => __('Yes - Show Specific Page', 'wp-portfolio'))); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'specificpage'); $formElem->description = '• <b>' . __("Requires Shrink The Web 'Specific Page Capture' Paid (Basic or Plus) feature.", 'wp-portfolio') . '</b><br/>' . '• ' . __("If enabled show internal web page rather than website's homepage. If in doubt, select <b>'No - Homepage Only'</b>.", 'wp-portfolio'); $form->addFormElement($formElem); // Hidden Elements $formElem = new FormElement("website_siteid", false); $formElem->value = WPPortfolio_getArrayValue($websitedetails, 'siteid'); $formElem->setTypeAsHidden(); $form->addFormElement($formElem); $formElem = new FormElement("editmode", false); $formElem->value = $editmode ? "edit" : "add"; $formElem->setTypeAsHidden(); $form->addFormElement($formElem); $form->setSubmitLabel(($editmode ? __("Update", 'wp-portfolio') : __("Add", 'wp-portfolio')) . " " . __("Website Details", 'wp-portfolio')); echo $form->toString(); ?> <br><br> </div><!-- wrap --> <?php }
/** * Convert an array of details into a form element. * @param String $fieldName The name of the form element * @param Array $fieldDetails The list of details for the form element. */ protected function createElementObject($fieldName, $fieldDetails) { // Extract fields $label = $this->formObj->getArrayValue($fieldDetails, 'label'); $type = $this->formObj->getArrayValue($fieldDetails, 'type'); // Required 'true' or true are valid $required = $this->formObj->getArrayValue($fieldDetails, 'required'); $required = $required == 'true' || $required == '1'; // Start creating form element if anything other than a break. $elem = false; if ($type != 'break') { $elem = new FormElement($fieldName, $label, $required); } // Handle specific types switch ($type) { // Text Area case 'textarea': $rows = $this->formObj->getArrayValue($fieldDetails, 'rows') + 0; if ($rows == 0) { $rows = 5; } $elem->setTypeAsTextArea($rows, 70); break; // Select/Dropdown // Select/Dropdown case 'select': $options = false; if (isset($fieldDetails['data']) && is_array($fieldDetails['data'])) { $options = $fieldDetails['data']; } $elem->setTypeAsComboBox($options); break; // Radio Buttons // Radio Buttons case 'radio': $options = false; if (isset($fieldDetails['data']) && is_array($fieldDetails['data'])) { $options = $fieldDetails['data']; } $elem->setTypeAsRadioButtons($options); break; // Checkbox // Checkbox case 'checkbox': $label = false; if (isset($fieldDetails['extralabel'])) { $label = $fieldDetails['extralabel']; } $elem->setTypeAsCheckbox($label); break; // Checkbox List // Checkbox List case 'checkboxlist': $options = false; if (isset($fieldDetails['data']) && is_array($fieldDetails['data'])) { $options = $fieldDetails['data']; } $elem->setTypeAsCheckboxList($options); break; // Merged Fields - process each sub element // Merged Fields - process each sub element case 'merge': $elementList = array(); if (!empty($fieldDetails['merge'])) { foreach ($fieldDetails['merge'] as $fieldName => $fieldDetails) { $elementList[] = $this->createElementObject($fieldName, $fieldDetails); } } $elem->setTypeAsMergedElements($elementList); break; // File upload // File upload case 'uploadfile': $elem->setTypeAsUploadFile($this->formObj->getArrayValue($fieldDetails, 'show_existing'), $this->formObj->getArrayValue($fieldDetails, 'valid_if_value')); break; // Custom HTML // Custom HTML case 'custom': $elem->setTypeAsCustom($this->formObj->getArrayValue($fieldDetails, 'html')); break; // Hidden field // Hidden field case 'hidden': $elem->setTypeAsHidden(); break; // Section break // Section break case 'break': $this->formObj->addBreak($fieldName, $this->formObj->getArrayValue($fieldDetails, 'html')); break; // Text box // Text box default: break; } // Add optional fields if ($type != 'break') { // Element description if ($desc = $this->formObj->getArrayValue($fieldDetails, 'desc')) { $elem->description = $desc; } // Extra CSS if ($cssclass = $this->formObj->getArrayValue($fieldDetails, 'cssclass')) { $elem->cssclass = $cssclass; } // Add extra HTML if provided. $extraHTML = $this->formObj->getArrayValue($fieldDetails, 'extrahtml'); if ($extraHTML) { $elem->afterFormElementHTML = $extraHTML; } // Add custom error message if there is one $elem->errorMessage = $this->formObj->getArrayValue($fieldDetails, 'errormsg'); // Validation rules if (isset($fieldDetails['validate']) && is_array($fieldDetails['validate'])) { // Is it a custom function? If so, get the function name. if ($this->formObj->getArrayValue($fieldDetails['validate'], 'type') == 'function') { $elem->validationFn = $this->formObj->getArrayValue($fieldDetails['validate'], 'fname'); $elem->errorMessage = $this->formObj->getArrayValue($fieldDetails['validate'], 'error'); } else { $elem->setValidationRules($fieldDetails['validate']); } } // See if there are any suffix items? If so, parse them. // See wiki for documentation on how to structure this. if (!empty($fieldDetails['suffix_subitems'])) { $suffixItems = array(); // suffix_subitems contains a list of 'position' => array(fieldName => fieldDetails) foreach ($fieldDetails['suffix_subitems'] as $position => $elementDetails) { $suffixItems[$position] = array(); // Need to process each field now we know the position. foreach ($elementDetails as $fieldName => $fieldDetails) { // Add the position of this item (in order), with the object for this element. $suffixItems[$position][] = $this->createElementObject($fieldName, $fieldDetails); } } // Update the form element with the subitems $elem->setSuffixItems($suffixItems); } } return $elem; }
/** * Convert an array of details into a form element. * @param String $fieldName The name of the form element * @param Array $fieldDetails The list of details for the form element. */ protected function createElementObject($fieldName, $fieldDetails) { // Extract fields $label = $this->formObj->getArrayValue($fieldDetails, 'label'); $type = $this->formObj->getArrayValue($fieldDetails, 'type'); // Required 'true' or true are valid $required = $this->formObj->getArrayValue($fieldDetails, 'required'); $required = $required == 'true' || $required == '1'; // Start creating form element if anything other than a break. $elem = false; if ($type != 'break') { $elem = new FormElement($fieldName, $label, $required); } // Handle specific types switch ($type) { // Text Area case 'textarea': $rows = $this->formObj->getArrayValue($fieldDetails, 'rows') + 0; if ($rows == 0) { $rows = 5; } $elem->setTypeAsTextArea($rows, 70); break; // Select/Dropdown // Select/Dropdown case 'select': $options = false; if (isset($fieldDetails['data']) && is_array($fieldDetails['data'])) { $options = $fieldDetails['data']; } $elem->setTypeAsComboBox($options); break; // Radio Buttons // Radio Buttons case 'radio': $options = false; if (isset($fieldDetails['data']) && is_array($fieldDetails['data'])) { $options = $fieldDetails['data']; } $elem->setTypeAsRadioButtons($options); break; // Checkbox // Checkbox case 'checkbox': $label = false; if (isset($fieldDetails['extralabel'])) { $label = $fieldDetails['extralabel']; } $elem->setTypeAsCheckbox($label); break; // Checkbox List // Checkbox List case 'checkboxlist': $options = false; if (isset($fieldDetails['data']) && is_array($fieldDetails['data'])) { $options = $fieldDetails['data']; } $elem->setTypeAsCheckboxList($options); break; // Merged Fields - process each sub element // Merged Fields - process each sub element case 'merge': $elementList = array(); if (!empty($fieldDetails['merge'])) { foreach ($fieldDetails['merge'] as $fieldName => $fieldDetails) { $elementList[] = $this->createElementObject($fieldName, $fieldDetails); } } $elem->setTypeAsMergedElements($elementList); break; // Custom HTML // Custom HTML case 'custom': $elem->setTypeAsCustom($this->formObj->getArrayValue($fieldDetails, 'html')); break; // Hidden field // Hidden field case 'hidden': $elem->setTypeAsHidden(); break; // Section break // Section break case 'break': $this->formObj->addBreak($fieldName, $this->formObj->getArrayValue($fieldDetails, 'html')); break; // Text box // Text box default: break; } // Add optional fields if ($type != 'break') { // Element description if ($desc = $this->formObj->getArrayValue($fieldDetails, 'desc')) { $elem->description = $desc; } // Extra CSS if ($cssclass = $this->formObj->getArrayValue($fieldDetails, 'cssclass')) { $elem->cssclass = $cssclass; } // Add extra HTML if provided. $extraHTML = $this->formObj->getArrayValue($fieldDetails, 'extrahtml'); if ($extraHTML) { $elem->afterFormElementHTML = $extraHTML; } // Validation rules if (isset($fieldDetails['validate']) && is_array($fieldDetails['validate'])) { // Is it a custom function? If so, get the function name. if ($this->formObj->getArrayValue($fieldDetails['validate'], 'type') == 'function') { $elem->validationFn = $this->formObj->getArrayValue($fieldDetails['validate'], 'fname'); $elem->errorMessage = $this->formObj->getArrayValue($fieldDetails['validate'], 'error'); } else { $elem->setValidationRules($fieldDetails['validate']); } } } return $elem; }