<?php /** * @copyright Copyright (C) 2015 Cédric KEIFLIN alias ced1870 * https://www.joomlack.fr * @license GNU/GPL * */ defined('_JEXEC') or die; /** * Editor Pagebuilderckbutton buton * */ class PlgButtonPagebuilderckbutton extends JPlugin { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; /** * Pagebuilderckbutton button * * @param string $name The name of the button to add * */ public function onDisplay($name) { // loads the language files from the component frontend $lang = JFactory::getLanguage(); $lang->load('com_pagebuilderck', JPATH_SITE . '/components/com_pagebuilderck', $lang->getTag(), false); // load CKBox from the component include_once(JPATH_SITE . '/administrator/components/com_pagebuilderck/helpers/pagebuilderck.php'); PagebuilderckHelper::loadCkbox(); // instantiate variables $doc = JFactory::getDocument(); // $getContent = $this->_subject->getContent($name); // get the list of pages $pages = json_encode($this->getPages()); // construct the JS code to manage the operations $js = " /* Function called on button click */ function insertPagebuilderckbutton(editor) { pages = " . $pages . "; // event.preventDefault(); if (typeof(tinyMCE) == 'undefined') { var content = document.getElementById(editor).value; } else { var editor = tinyMCE.activeEditor; var content = editor.getContent({format: 'text'}); } var re = /{pagebuilderck\s+(.*?)\s*}/ig; matches = content.match(re); createPagebuilderckPopup(); var PBCKmodal = jQuery('#pagebuilderckButtonModal'); PBCKmodal.empty().append('<div class=\"inner\" />'); PBCKmodalBody = PBCKmodal.find('> .inner').css('padding', '10px'); PBCKmodalBody.append('<h4 class=pagebuilderckButtonModalTitle >" . JText::_('CK_NEW_TAG', true) . "</h4>'); PBCKmodalBody.append('<div class=pagebuilderckButtonModalDesc >" . JText::_('CK_INSERT_NEW_DESC', true) . "</div>'); PBCKmodalBody.append('<div class=\"clearfix\">' +'<a class=\"btn btn-primary\" onclick=\"loadPagebuilderckModalEdition(0)\" title=\"" . JText::_('CK_CREATE_NEW_PAGE_DESC', true) . "\"><i class=\"icon icon-new\"></i>" . JText::_('CK_CREATE_NEW_PAGE', true) . "</a>' +' ' +'<a class=\"btn btn-primary\" onclick=\"loadPagebuilderckModalInsertChoice()\" title=\"" . JText::_('CK_INSERT_EXISTING_PAGE_DESC', true) . "\"><i class=\"icon icon-plus-2\"></i>" . JText::_('CK_INSERT_EXISTING_PAGE', true) . "</a>' +'</div>'); if (matches && matches.length) { PBCKmodalBody.append('<hr style=\"margin:10px 0;\"/>'); PBCKmodalBody.append('<h4 class=pagebuilderckButtonModalTitle >" . JText::_('CK_EXISTING_TAGS_FOUND', true) . "</h4>'); PBCKmodalBody.append('<div class=pagebuilderckButtonModalDesc >" . JText::_('CK_EXISTING_TAGS_FOUND_DESC', true) . "</div>'); for (var i = 0; i < matches.length; i++) { match = matches[i]; var id = match.replace('pagebuilderck', '') .replace('{', '') .replace('}', '') .trim(); addPagebuilderckEditionChoice(id); } return false; } else { // jInsertEditorText('<hr id=\"system-readmore\" />', editor); } } /* Called from the modal pages list, to insert the tag from the ID */ function insertPagebuilderckTag(id) { // jInsertEditorText('{pagebuilderck '+id+'}', '" . $name . "'); tinyMCE.activeEditor.execCommand('mceInsertContent', false, '{pagebuilderck '+id+'}'); CKBox.close('#CKBoxPagebuilderckButtonModal .ckboxmodal-footer'); } /* Create the popup */ function createPagebuilderckPopup() { removeFooterSaveButton(); if (! document.getElementById('pagebuilderckButtonModal')) { var popup = document.createElement('div'); popup.id = 'pagebuilderckButtonModal'; popup.className = 'pagebuilderckButtonModal'; popup.style.height = '100%'; document.body.appendChild(popup); popup.innerHTML = '' +'<h3>" . JText::_('CK_EDIT', true) . "</h3>' +''; } var PBCKmodal = jQuery('#pagebuilderckButtonModal'); CKBox.open({handler: 'inline', content: 'pagebuilderckButtonModal', style: {padding: '10px'}, id: 'CKBoxPagebuilderckButtonModal' }); } /* Add a line for each existing page to edit */ function addPagebuilderckEditionChoice(id) { pages = " . $pages . "; var PBCKmodal = jQuery('#pagebuilderckButtonModal'); var pagetitle = (typeof(pages[id]) != 'undefined') ? '" . JText::_('CK_TITLE', true) . ": <span class=\"label cktitle\">' + pages[id]['title'] + '</span>' : ''; PBCKmodal.append('<div class=pagebuilderckButtonModalChoice><span class=\"\">" . JText::_('CK_ID', true) . "</span> : <span class=\"label label-info ckid\">'+id+'</span>' + pagetitle + '<a class=\"btn ckedit\" data-id='+id+' onclick=\"loadPagebuilderckModalEdition('+id+')\" ><i class=\"icon icon-edit\"></i>" . JText::_('CK_EDIT', true) . "</a></div>'); } /* Load the list of pages to select the one to insert */ function loadPagebuilderckModalInsertChoice() { var PBCKmodal = jQuery('#pagebuilderckButtonModal'); PBCKmodal.empty(); PBCKmodal.prepend('<iframe class=\"iframe\" src=\"".JUri::base(true)."/index.php?option=com_pagebuilderck&view=pages&layout=modal&function=insertPagebuilderckTag&tmpl=component\"></iframe>'); } /* Load the edition area for the selected page */ function loadPagebuilderckModalEdition(id) { var PBCKmodal = jQuery('#pagebuilderckButtonModal'); removeFooterSaveButton(); addFooterSaveButton(); PBCKmodal.empty(); PBCKmodal.prepend('<iframe class=\"iframe\" src=\"".JUri::base(true)."/index.php?option=com_pagebuilderck&view=page&layout=modal&id='+id+'&tmpl=component\"></iframe>'); if (id == 0) { addInsertNewPageButton(); } } /* Add the insert new page button */ function addInsertNewPageButton() { jQuery('#pagebuilderckButtonModal').find('iframe').on('load', function() { var idval = jQuery('#pagebuilderckButtonModal').find('iframe').contents().find('input[name=\"id\"]').val(); if (idval != '') { jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-footer').append('<button class=\"ckboxmodal-button btn btn-success saveck\" data-dismiss=\"modal\" aria-hidden=\"true\" onclick=\"jQuery(\'iframe\', jQuery(jQuery(this).parents(\'.ckboxmodal\')[0])).contents().find(\'#applyBtn\').click();insertPagebuilderckTag(' + idval + ')\"><i class=\"icon icon-checkmark\"></i>" . JText::_('CK_INSERT_PAGE_AND_CLOSE', true) . "</button>'); } // add automatically the title for the page if (jQuery('#jform_title').length && jQuery('#jform_title').val()) { jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-body iframe').contents().find('input[name=\"title\"]').val(jQuery('#jform_title').val()); } }); jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-footer .savecloseck').hide(); } /* Add the save button */ function addFooterSaveButton() { jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-footer').append('<button class=\"ckboxmodal-button btn btn-success saveck savecloseck\" data-dismiss=\"modal\" aria-hidden=\"true\" onclick=\"jQuery(\'iframe\', jQuery(jQuery(this).parents(\'.ckboxmodal\')[0])).contents().find(\'#saveBtn\').click();CKBox.close(\'#CKBoxPagebuilderckButtonModal .ckboxmodal-footer\', \'1\');\"><i class=\"icon icon-checkmark\"></i> " . JText::_('CK_SAVE_CLOSE', true) . "</button>'); jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-footer').append('<button class=\"ckboxmodal-button btn btn-success saveck\" aria-hidden=\"true\" onclick=\"jQuery(\'iframe\', jQuery(jQuery(this).parents(\'.ckboxmodal\')[0])).contents().find(\'#applyBtn\').click();\"><i class=\"icon icon-checkmark\"></i> " . JText::_('CK_APPLY', true) . "</button>'); } /* Remove the save button (only needed on edition mode) */ function removeFooterSaveButton() { jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-footer .saveck').remove(); jQuery('#CKBoxPagebuilderckButtonModal').find('.ckboxmodal-footer .applyck').remove(); } "; $css = '/** fullscreen mode for the Page Builder CK modal **/ .pagebuilderckButtonModalFullscreen { top: 0 !important; left: 0 !important; right: 0 !important; margin: 0 !important; width: 100% !important; box-sizing: border-box; height: 100% !important; } .pagebuilderckButtonModalFullscreen .ckboxmodal-body { max-height: 100% !important; box-sizing: border-box; } .pagebuilderckButtonModalFullscreen iframe { height: 100% !important; } .pagebuilderckButtonModalDesc { padding: 0 0 10px 0; } .pagebuilderckButtonModalChoice { border-bottom: 1px solid #ddd; padding: 5px; } .pagebuilderckButtonModalChoice .label { margin: 0 7px; } .pagebuilderckButtonModalChoice > span { display: inline-block; } .pagebuilderckButtonModalChoice > span.ckid { min-width: 15px; text-align: center; } .pagebuilderckButtonModalChoice > span.cktitle { min-width: 100px; } .pagebuilderckButtonModalChoice > span.ckedit { } .pagebuilderckButtonModal .ckboxmodal-body iframe { border: 0 none !important; max-height: none; width: 100%; } #CKBoxPagebuilderckButtonModal .icon { margin-right: 3px; } '; $doc->addScriptDeclaration($js); $doc->addStyleDeclaration($css); $button = new JObject; $button->modal = false; $button->class = 'btn hasTooltip'; $button->onclick = 'insertPagebuilderckbutton(\'' . $name . '\');return false;'; $button->text = JText::_('PLG_PAGEBUILDERCKBUTTON'); $button->name = 'grid'; $button->title = JText::_('PLG_PAGEBUILDERCKBUTTON_DESC'); $button->link = '#'; return $button; } /* * Get the list of published pages with names * * Return Array - The list of pages */ public function getPages() { $db = JFactory::getDbo(); $q = "SELECT title, id FROM #__pagebuilderck_pages WHERE state=1"; $db->setQuery($q); $db->execute(); $pages = $db->loadObjectlist('id'); return $pages; } }