name : WeblinkField.php
<?php

/**
 * @package     Joomla.Administrator
 * @subpackage  com_weblinks
 *
 * @copyright   Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

namespace Joomla\Component\Weblinks\Administrator\Field\Modal;

use Joomla\CMS\Factory;
use Joomla\CMS\Form\FormField;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\Database\ParameterType;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
/**
 * Supports a modal weblink picker.
 *
 * @since  __DEPLOY_VERSION__
 */
class WeblinkField extends FormField
{
    /**
     * The form field type.
     *
     * @var    string
     * @since  __DEPLOY_VERSION__
     */
    protected $type = 'Modal_Weblink';
    /**
         * Method to get the field input markup.
         *
         * @return  string  The field input markup.
         *
         * @since   __DEPLOY_VERSION__
         */
    protected function getInput()
    {
        $app = Factory::getApplication();

        $allowNew    = ((string) $this->element['new'] == 'true');
        $allowEdit   = ((string) $this->element['edit'] == 'true');
        $allowClear  = ((string) $this->element['clear'] != 'false');
        $allowSelect = ((string) $this->element['select'] != 'false');

        // Load language
        $app->getLanguage()->load('com_weblinks', JPATH_ADMINISTRATOR);
        // The active weblink id field.
        $value = (int) $this->value > 0 ? (int) $this->value : '';
        // Create the modal id.
        $modalId = 'Weblink_' . $this->id;
        /** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */
        $wa = $app->getDocument()->getWebAssetManager();
        // Add the modal field script to the document head.
        $wa->useScript('field.modal-fields');
        // Script to proxy the select modal function to the modal-fields.js file.
        if ($allowSelect) {
            static $scriptSelect = null;
            if (\is_null($scriptSelect)) {
                $scriptSelect = [];
            }

            if (!isset($scriptSelect[$this->id])) {
                $wa->addInlineScript(
                    "
				window.jSelectWeblink_" . $this->id . " = function (id, title, catid, object, url, language) {
					window.processModalSelect('Article', '" . $this->id . "', id, title, catid, object, url, language);
				}",
                    [],
                    ['type' => 'module']
                );
                Text::script('JGLOBAL_ASSOCIATIONS_PROPAGATE_FAILED');
                $scriptSelect[$this->id] = true;
            }
        }

        // Setup variables for display.
        $linkWeblinks = 'index.php?option=com_weblinks&amp;view=weblinks&amp;layout=modal&amp;tmpl=component&amp;' . Session::getFormToken() . '=1';
        $linkWeblink  = 'index.php?option=com_weblinks&amp;view=weblink&amp;layout=modal&amp;tmpl=component&amp;' . Session::getFormToken() . '=1';
        $modalTitle   = Text::_('COM_WEBLINKS_CHANGE_WEBLINK');
        if (isset($this->element['language'])) {
            $linkWeblinks .= '&amp;forcedLanguage=' . $this->element['language'];
            $linkWeblink .= '&amp;forcedLanguage=' . $this->element['language'];
            $modalTitle .= ' &#8212; ' . $this->element['label'];
        }

        $urlSelect = $linkWeblinks . '&amp;function=jSelectWeblink_' . $this->id;
        $urlEdit   = $linkWeblink . '&amp;task=weblink.edit&amp;id=\' + document.getElementById("' . $this->id . '_id").value + \'';
        $urlNew    = $linkWeblink . '&amp;task=weblink.add';
        if ($value) {
            $db    = $this->getDatabase();
            $query = $db->getQuery(true)
                ->select($db->quoteName('title'))
                ->from($db->quoteName('#__weblinks'))
                ->where($db->quoteName('id') . ' = :id')
                ->bind(':id', $value, ParameterType::INTEGER);
            $db->setQuery($query);
            try {
                $title = $db->loadResult();
            } catch (\RuntimeException $e) {
                $app->enqueueMessage($e->getMessage(), 'error');
            }
        }

        $title = empty($title) ? Text::_('COM_WEBLINKS_SELECT_A_WEBLINK') : htmlspecialchars($title, ENT_QUOTES, 'UTF-8');
        // The current weblink display field.
        $html = '';
        if ($allowSelect || $allowNew || $allowEdit || $allowClear) {
            $html .= '<span class="input-group">';
        }

        $html .= '<input class="form-control" id="' . $this->id . '_name" type="text" value="' . $title . '" readonly size="35">';
        // Select weblink button
        if ($allowSelect) {
            $html .= '<button'
                . ' class="btn btn-primary' . ($value ? ' hidden' : '') . '"'
                . ' id="' . $this->id . '_select"'
                . ' data-bs-toggle="modal"'
                . ' type="button"'
                . ' data-bs-target="#ModalSelect' . $modalId . '">'
                . '<span class="icon-file" aria-hidden="true"></span> ' . Text::_('JSELECT')
                . '</button>';
        }

        // New weblink button
        if ($allowNew) {
            $html .= '<button'
                . ' class="btn btn-secondary' . ($value ? ' hidden' : '') . '"'
                . ' id="' . $this->id . '_new"'
                . ' data-bs-toggle="modal"'
                . ' type="button"'
                . ' data-bs-target="#ModalNew' . $modalId . '">'
                . '<span class="icon-plus" aria-hidden="true"></span> ' . Text::_('JACTION_CREATE')
                . '</button>';
        }

        // Edit weblink button
        if ($allowEdit) {
            $html .= '<button'
                . ' class="btn btn-primary' . ($value ? '' : ' hidden') . '"'
                . ' id="' . $this->id . '_edit"'
                . ' data-bs-toggle="modal"'
                . ' type="button"'
                . ' data-bs-target="#ModalEdit' . $modalId . '">'
                . '<span class="icon-pen-square" aria-hidden="true"></span> ' . Text::_('JACTION_EDIT')
                . '</button>';
        }

        // Clear weblink button
        if ($allowClear) {
            $html .= '<button'
                . ' class="btn btn-secondary' . ($value ? '' : ' hidden') . '"'
                . ' id="' . $this->id . '_clear"'
                . ' type="button"'
                . ' onclick="window.processModalParent(\'' . $this->id . '\'); return false;">'
                . '<span class="icon-times" aria-hidden="true"></span> ' . Text::_('JCLEAR')
                . '</button>';
        }

        if ($allowSelect || $allowNew || $allowEdit || $allowClear) {
            $html .= '</span>';
        }

        // Select weblink modal
        if ($allowSelect) {
            $html .= HTMLHelper::_('bootstrap.renderModal', 'ModalSelect' . $modalId, [
                    'title'      => $modalTitle,
                    'url'        => $urlSelect,
                    'height'     => '400px',
                    'width'      => '800px',
                    'bodyHeight' => 70,
                    'modalWidth' => 80,
                    'footer'     => '<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">'
                        . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</button>',
                ]);
        }

        $closeButtonClick = "window.processModalEdit(this,  '$this->id', 'add', 'weblink', 'cancel', 'weblink-form'); return false;";
        $saveButtonClick  = "window.processModalEdit(this,  '$this->id', 'add', 'weblink', 'save', 'weblink-form'); return false;";
        $applyButtonClick = "window.processModalEdit(this,  '$this->id', 'add', 'weblink', 'apply', 'weblink-form'); return false;";
        // New weblink modal
        if ($allowNew) {
            $html .= HTMLHelper::_('bootstrap.renderModal', 'ModalNew' . $modalId, [
                    'title'       => Text::_('COM_WEBLINKS_NEW_WEBLINK'),
                    'backdrop'    => 'static',
                    'keyboard'    => false,
                    'closeButton' => false,
                    'url'         => $urlNew,
                    'height'      => '400px',
                    'width'       => '800px',
                    'bodyHeight'  => '70',
                    'modalWidth'  => '80',
                    'footer'      => '<a role="button" class="btn" aria-hidden="true"'
                        . ' onclick="' . $closeButtonClick . '">'
                        . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</a>'
                        . '<a role="button" class="btn btn-primary" aria-hidden="true"'
                        . ' onclick="' . $saveButtonClick . '">'
                        . Text::_('JSAVE') . '</a>'
                        . '<a role="button" class="btn btn-success" aria-hidden="true"'
                        . ' onclick="' . $applyButtonClick . '">'
                        . Text::_('JAPPLY') . '</a>',
                ]);
        }

        // Edit weblink modal
        if ($allowEdit) {
            $html .= HTMLHelper::_('bootstrap.renderModal', 'ModalEdit' . $modalId, [
                    'title'       => Text::_('COM_WEBLINKS_EDIT_WEBLINK'),
                    'backdrop'    => 'static',
                    'keyboard'    => false,
                    'closeButton' => false,
                    'url'         => $urlEdit,
                    'height'      => '400px',
                    'width'       => '800px',
                    'bodyHeight'  => '70',
                    'modalWidth'  => '80',
                    'footer'      => '<a role="button" class="btn" aria-hidden="true"'
                        . ' onclick="' . $closeButtonClick . '">'
                        . Text::_('JLIB_HTML_BEHAVIOR_CLOSE') . '</a>'
                        . '<a role="button" class="btn btn-primary" aria-hidden="true"'
                        . ' onclick="' . $saveButtonClick . '">'
                        . Text::_('JSAVE') . '</a>'
                        . '<a role="button" class="btn btn-success" aria-hidden="true"'
                        . ' onclick="' . $applyButtonClick . '">'
                        . Text::_('JAPPLY') . '</a>',
                ]);
        }

        // Note: class='required' for client side validation.
        $class = $this->required ? ' class="required modal-value"' : '';
        $html .= '<input type="hidden" id="' . $this->id . '_id" ' . $class . ' data-required="' . (int) $this->required . '" name="' . $this->name
            . '" data-text="' . htmlspecialchars(Text::_('COM_WEBLINKS_SELECT_A_WEBLINK', true), ENT_COMPAT, 'UTF-8') . '" value="' . $value . '" />';
        return $html;
    }

    /**
     * Method to get the field label markup.
     *
     * @return  string  The field label markup.
     *
     * @since   __DEPLOY_VERSION__
     */
    protected function getLabel()
    {
        return str_replace($this->id, $this->id . '_name', parent::getLabel());
    }
}

© 2025 Cubjrnet7