XylotrechusZ
<?php
/**
* @copyright Copyright (c) 2009-2022 ThemeCatcher (https://www.themecatcher.net)
*/
class Quform_Element_Submit extends Quform_Element
{
/**
* Render this element and return the HTML
*
* @param array $context
* @return string
*/
public function render(array $context = array())
{
$context = $this->prepareContext($context);
if ( ! $this->isVisible()) {
return '';
}
$output = sprintf('<div class="%s">', Quform::escape(Quform::sanitizeClass($this->getElementClasses($context))));
if ($this->form->hasPages()) {
if ( ! $this->isOnFirstPage() && $this->form->config('backLocation') != 'after') {
$output .= $this->getButtonHtml('back', __('Back', 'quform'));
}
if ( ! $this->isOnLastPage()) {
$output .= $this->getButtonHtml('next', __('Next', 'quform'));
} else {
$output .= $this->getButtonHtml('submit', __('Send', 'quform'));
}
if ( ! $this->isOnFirstPage() && $this->form->config('backLocation') == 'after') {
$output .= $this->getButtonHtml('back', __('Back', 'quform'));
}
} else {
$output .= $this->getButtonHtml('submit', __('Send', 'quform'));
}
$output .= $this->getLoadingHtml();
$output .= '</div>';
return $output;
}
/**
* Get the classes for the outermost element wrapper
*
* @param array $context
* @return array
*/
protected function getElementClasses(array $context = array())
{
$classes = array(
'quform-element',
'quform-element-submit',
sprintf('quform-element-%s', $this->getIdentifier()),
'quform-cf'
);
if (Quform::isNonEmptyString($context['buttonStyle'])) {
$classes[] = sprintf('quform-button-style-%s', $context['buttonStyle']);
}
if (Quform::isNonEmptyString($context['buttonSize'])) {
$classes[] = sprintf('quform-button-size-%s', $context['buttonSize']);
}
if (Quform::isNonEmptyString($context['buttonWidth']) && $context['buttonWidth'] != 'custom') {
$classes[] = sprintf('quform-button-width-%s', $context['buttonWidth']);
}
if (Quform::isNonEmptyString($this->config('customElementClass'))) {
$classes[] = $this->config('customElementClass');
}
$classes = apply_filters('quform_element_classes', $classes, $this, $context);
$classes = apply_filters('quform_element_classes_' . $this->getIdentifier(), $classes, $this, $context);
return $classes;
}
/**
* Get the HTML for the submit / next / back button
*
* @param string $which Which button - 'submit', 'next' or 'back'
* @param string $defaultText The fallback text for the default button
* @return string
*/
protected function getButtonHtml($which, $defaultText)
{
if ($this->config($which . 'Type') == 'inherit') {
$config = array(
'type' => $this->form->config($which . 'Type'),
'text' => $this->form->config($which . 'Text'),
'icon' => $this->form->config($which . 'Icon'),
'iconPosition' => $this->form->config($which . 'IconPosition'),
'image' => $this->form->config($which . 'Image'),
'html' => $this->form->config($which . 'Html'),
);
} else {
$config = array(
'type' => $this->config($which . 'Type'),
'text' => $this->config($which . 'Text'),
'icon' => $this->config($which . 'Icon'),
'iconPosition' => $this->config($which . 'IconPosition') == 'inherit' ? $this->form->config($which . 'IconPosition') : $this->config($which . 'IconPosition'),
'image' => $this->config($which . 'Image'),
'html' => $this->config($which . 'Html'),
);
}
$classes = array(
sprintf('quform-button-%s', $which),
sprintf('quform-button-%s-%s', $which, $config['type']),
sprintf('quform-button-%s-%s', $which, $this->getIdentifier())
);
if ($config['type'] == 'default' && Quform::isNonEmptyString($config['icon'])) {
$classes[] = sprintf('quform-button-icon-%s', $config['iconPosition']);
}
$output = sprintf('<div class="%s"%s>',
esc_attr(join(' ', $classes)),
Quform::isNonEmptyString($this->form->config('buttonAnimation')) ? sprintf(' data-animation="%s"', esc_attr($this->form->config('buttonAnimation'))) : ''
);
$output .= '<button name="quform_submit" type="submit" class="quform-' . esc_attr($which) . '" value="' . ($which == 'back' ? 'back' : 'submit') . '">';
if ($config['type'] == 'default') {
$text = sprintf(
'<span class="%s">%s</span>',
esc_attr(sprintf('quform-button-text quform-button-%s-text', $which)),
esc_html(Quform::isNonEmptyString($config['text']) ? $config['text'] : $defaultText)
);
if (Quform::isNonEmptyString($config['icon'])) {
$icon = sprintf(
'<span class="%s"><i class="%s"></i></span>',
esc_attr(sprintf('quform-button-icon quform-button-%s-icon', $which)),
esc_attr($config['icon'])
);
if ($config['iconPosition'] == 'right') {
$output .= $text . $icon;
} else {
$output .= $icon . $text;
}
} else {
$output .= $text;
}
} elseif ($config['type'] == 'image') {
$output .= '<img src="' . esc_url($config['image']) . '" alt="' . esc_attr($which) . '">';
} elseif ($config['type'] == 'html') {
$output .= do_shortcode($config['html']);
}
$output .= '</button></div>';
return $output;
}
/**
* Get the HTML for the loading indicator
*
* @return string
*/
protected function getLoadingHtml()
{
if ( ! Quform::isNonEmptyString($this->form->config('loadingType')) || $this->form->config('loadingPosition') == 'over-form') {
return '';
}
$classes = array(
'quform-loading',
sprintf('quform-loading-position-%s', $this->form->config('loadingPosition'))
);
if ($this->config('loadingType') != 'custom') {
$classes[] = sprintf('quform-loading-type-%s', $this->form->config('loadingType'));
}
$output = sprintf('<div class="%s">', esc_attr(join(' ', $classes)));
$output .= '<div class="quform-loading-inner">';
if ($this->form->config('loadingType') == 'custom') {
$output .= do_shortcode($this->form->config('loadingCustom'));
} else {
$output .= '<div class="quform-loading-spinner"><div class="quform-loading-spinner-inner"></div></div>';
}
$output .= '</div></div>';
return $output;
}
/**
* Is this button on the first page?
*
* @return bool
*/
public function isOnFirstPage()
{
return $this->isOnPage($this->form->getFirstPage());
}
/**
* Is this button on the last page?
*
* @return bool
*/
public function isOnLastPage()
{
return $this->isOnPage($this->form->getLastPage());
}
/**
* Is this button a child of the given page
*
* @param Quform_Element_Page|null $page
* @return bool
*/
protected function isOnPage($page)
{
if ($page instanceof Quform_Element_Page) {
foreach ($page->getRecursiveIterator(RecursiveIteratorIterator::SELF_FIRST) as $child) {
if ($child->getName() == $this->getName()) {
return true;
}
}
}
return false;
}
/**
* Render the CSS for this element
*
* @param array $context
* @return string
*/
protected function renderCss(array $context = array())
{
$css = parent::renderCss($context);
if ($context['buttonWidth'] == 'custom' && Quform::isNonEmptyString($context['buttonWidthCustom'])) {
$css .= sprintf('.quform-element-submit.quform-element-%s button { width: %s; }', $this->getIdentifier(), Quform::addCssUnit($context['buttonWidthCustom']));
}
return $css;
}
/**
* Get the list of CSS selectors
*
* @return array
*/
protected function getCssSelectors()
{
return array(
'submit' => '%s .quform-element-submit.quform-element-%s',
'submitInner' => '%s .quform-button-submit.quform-button-submit-%s',
'submitButton' => '%1$s .quform-button-submit.quform-button-submit-%2$s button, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button',
'submitButtonHover' => '%1$s .quform-button-submit.quform-button-submit-%2$s button:hover, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button:hover',
'submitButtonActive' => '%1$s .quform-button-submit.quform-button-submit-%2$s button:active, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button:active',
'submitButtonText' => '%1$s .quform-button-submit.quform-button-submit-%2$s button .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button .quform-button-text',
'submitButtonTextHover' => '%1$s .quform-button-submit.quform-button-submit-%2$s button:hover .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button:hover .quform-button-text',
'submitButtonTextActive' => '%1$s .quform-button-submit.quform-button-submit-%2$s button:active .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button:active .quform-button-text',
'submitButtonIcon' => '%1$s .quform-button-submit.quform-button-submit-%2$s button .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button .quform-button-icon',
'submitButtonIconHover' => '%1$s .quform-button-submit.quform-button-submit-%2$s button:hover .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button:hover .quform-button-icon',
'submitButtonIconActive' => '%1$s .quform-button-submit.quform-button-submit-%2$s button:active .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-submit.quform-button-submit-%2$s button:active .quform-button-icon',
'backInner' => '%s .quform-button-back.quform-button-back-%s',
'backButton' => '%1$s .quform-button-back.quform-button-back-%2$s button, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button',
'backButtonHover' => '%1$s .quform-button-back.quform-button-back-%2$s button:hover, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button:hover',
'backButtonActive' => '%1$s .quform-button-back.quform-button-back-%2$s button:active, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button:active',
'backButtonText' => '%1$s .quform-button-back.quform-button-back-%2$s button .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button .quform-button-text',
'backButtonTextHover' => '%1$s .quform-button-back.quform-button-back-%2$s button:hover .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button:hover .quform-button-text',
'backButtonTextActive' => '%1$s .quform-button-back.quform-button-back-%2$s button:active .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button:active .quform-button-text',
'backButtonIcon' => '%1$s .quform-button-back.quform-button-back-%2$s button .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button .quform-button-icon',
'backButtonIconHover' => '%1$s .quform-button-back.quform-button-back-%2$s button:hover .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button:hover .quform-button-icon',
'backButtonIconActive' => '%1$s .quform-button-back.quform-button-back-%2$s button:active .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-back.quform-button-back-%2$s button:active .quform-button-icon',
'nextInner' => '%s .quform-button-next.quform-button-next-%s',
'nextButton' => '%1$s .quform-button-next.quform-button-next-%2$s button, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button',
'nextButtonHover' => '%1$s .quform-button-next.quform-button-next-%2$s button:hover, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button:hover',
'nextButtonActive' => '%1$s .quform-button-next.quform-button-next-%2$s button:active, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button:active',
'nextButtonText' => '%1$s .quform-button-next.quform-button-next-%2$s button .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button .quform-button-text',
'nextButtonTextHover' => '%1$s .quform-button-next.quform-button-next-%2$s button:hover .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button:hover .quform-button-text',
'nextButtonTextActive' => '%1$s .quform-button-next.quform-button-next-%2$s button:active .quform-button-text, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button:active .quform-button-text',
'nextButtonIcon' => '%1$s .quform-button-next.quform-button-next-%2$s button .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button .quform-button-icon',
'nextButtonIconHover' => '%1$s .quform-button-next.quform-button-next-%2$s button:hover .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button:hover .quform-button-icon',
'nextButtonIconActive' => '%1$s .quform-button-next.quform-button-next-%2$s button:active .quform-button-icon, %1$s .quform-element-submit.quform-button-style-theme .quform-button-next.quform-button-next-%2$s button:active .quform-button-icon'
);
}
/**
* Get the default element configuration
*
* @param string|null $key Get the config by key, if omitted the full config is returned
* @return array
*/
public static function getDefaultConfig($key = null)
{
$config = apply_filters('quform_default_config_submit', array(
// Basic
'label' => __('Submit', 'quform'),
'submitType' => 'inherit',
'submitText' => '',
'submitIcon' => '',
'submitIconPosition' => 'inherit',
'submitImage' => '',
'submitHtml' => '',
'nextType' => 'inherit',
'nextText' => '',
'nextIcon' => '',
'nextIconPosition' => 'inherit',
'nextImage' => '',
'nextHtml' => '',
'backType' => 'inherit',
'backText' => '',
'backIcon' => '',
'backIconPosition' => 'inherit',
'backImage' => '',
'backHtml' => '',
// Styles
'buttonStyle' => 'inherit',
'buttonSize' => 'inherit',
'buttonWidth' => 'inherit',
'buttonWidthCustom' => '',
'customElementClass' => '',
'styles' => array(),
// Logic
'logicEnabled' => false,
'logicAction' => true,
'logicMatch' => 'all',
'logicRules' => array(),
// Advanced
'visibility' => ''
));
$config['type'] = 'submit';
if (Quform::isNonEmptyString($key)) {
return Quform::get($config, $key);
}
return $config;
}
}