SelectFonts form field from arenam
При создании шаблонов одной из важных задач стоит выбор подходящего шрифта. Иногда приходится несколько раз менять шрифт пока он нас не устроит. Поэтому в админ панели сайта необходимы поля с выбором шрифтов, а хорошей практикой является видеть как будет выглядеть шрифт на вашем сайте перед его сохранением.
Мы создали простое поле для решения данной задачи и готовы им поделиться.
Итак, поле состоит из поля визуального просмотра выбранного шрифта, кнопок следующего и предыдущего шрифта и кнопоу увеличения и уменьшения шрифта для лучшего просмотра разных шрифтов.
Вот что у нас должно получиться.
Мы не собираемся растягивать эту статью и предоставим сразу весь код.
Создайте файл selectfonts.php
и поместите туда все это:
<?php /** * @author Maxim Resh (arenam.ru) * @website https://arenam.ru/ * @copyright Copyright © 2021 - All rights reserved. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html **/ defined( '_JEXEC' ) or die; // No direct access use Joomla\CMS\Factory; JFormHelper::loadFieldClass('list'); class JFormFieldSelectFonts extends JFormFieldList { public $type = 'selectfonts'; public function getOptions() { $items = array( "initial" => "-- Default --", // Cirillic "Bad+Script|'Bad Script', cursive" => "Bad Script", "Roboto|'Roboto', sans-serif" => "Roboto", "Open+Sans|'Open Sans', sans-serif" => "Open Sans", "JetBrains+Mono|'JetBrains Mono', monospace" => "JetBrains Mono", "Montserrat|'Montserrat', sans-serif" => "Montserrat", "Source+Sans+Pro|'Source Sans Pro', sans-serif" => "Source Sans Pro", "Roboto+Condensed|'Roboto Condensed', sans-serif" => "Roboto Condensed", "Oswald|'Oswald', sans-serif" => "Oswald", "Roboto+Mono|'Roboto Mono', monospace" => "Roboto Mono", "Raleway|'Raleway', sans-serif" => "Raleway", "Noto+Sans|'Noto Sans', sans-serif" => "Noto Sans", "PT+Sans|'PT Sans', sans-serif" => "PT Sans", "Roboto+Slab|'Roboto Slab', serif" => "Roboto Slab", "Ubuntu|'Ubuntu', sans-serif" => "Ubuntu", "Merriweather|'Merriweather', serif" => "Merriweather", "Playfair+Display|'Playfair Display', serif" => "Playfair Display", "Nunito|'Nunito', sans-serif" => "Nunito", "Piazzolla|'Piazzolla', serif" => "Piazzolla", "Open+Sans+Condensed|'Open Sans Condensed', sans-serif" => "Open Sans Condensed", "Lora|'Lora', serif" => "Lora", "Rubik|'Rubik', sans-serif" => "Rubik", "PT+Serif|'PT Serif', serif" => "PT Serif", "Noto+Serif|'Noto Serif', serif" => "Noto Serif", "Fira+Sans|'Fira Sans', sans-serif" => "Fira Sans", "Jura|'Jura', sans-serif" => "Jura", "Source+Code+Pro|'Source Code Pro', monospace" => "Source Code Pro", "PT+Sans+Narrow|'PT Sans Narrow', sans-serif" => "PT Sans Narrow", "Arimo|'Arimo', sans-serif" => "Arimo", "Inter|'Inter', sans-serif" => "Inter", "Bitter|'Bitter', serif" => "Bitter", "Yanone+Kaffeesatz|'Yanone Kaffeesatz', sans-serif" => "Yanone Kaffeesatz", "IBM+Plex+Sans|'IBM Plex Sans', sans-serif" => "IBM Plex Sans", "Source+Serif+Pro|'Source Serif Pro', serif" => "Source Serif Pro", "Comfortaa|'Comfortaa', cursive" => "Comfortaa", "Exo+2|'Exo 2', sans-serif" => "Exo 2", "Pacifico|'Pacifico', cursive" => "Pacifico", "EB+Garamond|'EB Garamond', serif" => "EB Garamond", "Balsamiq+Sans|'Balsamiq Sans', cursive" => "Balsamiq Sans", "Play|'Play', sans-serif" => "Play", "Russo+One|'Russo One', sans-serif" => "Russo One", "Cormorant+Garamond|'Cormorant Garamond', serif" => "Cormorant Garamond", "Caveat|'Caveat', cursive" => "Caveat", "Amatic+SC|'Amatic SC', cursive" => "Amatic SC", "IBM+Plex+Serif|'IBM Plex Serif', serif" => "IBM Plex Serif", "Vollkorn|'Vollkorn', serif" => "Vollkorn", "Fira+Sans+Condensed|'Fira Sans Condensed', sans-serif" => "Fira Sans Condensed", "PT+Sans+Caption|'PT Sans Caption', sans-serif" => "PT Sans Caption", "Alegreya+Sans|'Alegreya Sans', sans-serif" => "Alegreya Sans", "Ubuntu+Condensed|'Ubuntu Condensed', sans-serif" => "Ubuntu Condensed", "Alegreya|'Alegreya', serif" => "Alegreya", "Tinos|'Tinos', serif" => "Tinos", "Cuprum|'Cuprum', sans-serif" => "Cuprum", "Didact+Gothic|'Didact Gothic', sans-serif" => "Didact Gothic", "Prata|'Prata', serif" => "Prata", "IBM+Plex+Mono|'IBM Plex Mono', monospace" => "IBM Plex Mono", "Old+Standard+TT|'Old Standard TT', serif" => "Old Standard TT", "Playfair+Display+SC|'Playfair Display SC', serif" => "Playfair Display SC", "Manrope|'Manrope', sans-serif" => "Manrope", "Philosopher|'Philosopher', sans-serif" => "Philosopher", "Poiret+One|'Poiret One', cursive" => "Poiret One", "Spectral|'Spectral', serif" => "Spectral", "Istok+Web|'Istok Web', sans-serif" => "Istok Web", "Montserrat+Alternates|'Montserrat Alternates', sans-serif" => "Montserrat Alternates", "Fira+Sans+Extra+Condensed|'Fira Sans Extra Condensed', sans-serif" => "Fira Sans Extra Condensed", "Press+Start+2P|'Press Start 2P', cursive" => "Press Start 2P", "Neucha|'Neucha', cursive" => "Neucha", "Ruda|'Ruda', sans-serif" => "Ruda", "Cormorant|'Cormorant', serif" => "Cormorant", "El+Messiri|'El Messiri', sans-serif" => "El Messiri", "Alice|'Alice', serif" => "Alice", "Jost|'Jost', sans-serif" => "Jost", "PT+Mono|'PT Mono', monospace" => "PT Mono", "Marck+Script|'Marck Script', cursive" => "Marck Script", "Yeseva+One|'Yeseva One', cursive" => "Yeseva One", "Sawarabi+Gothic|'Sawarabi Gothic', sans-serif" => "Sawarabi Gothic", "Tenor+Sans|'Tenor Sans', sans-serif" => "Tenor Sans", "Ubuntu+Mono|'Ubuntu Mono', monospace" => "Ubuntu Mono", "PT+Serif+Caption|'PT Serif Caption', serif" => "PT Serif Caption", "Marmelad|'Marmelad', sans-serif" => "Marmelad", "Arsenal|'Arsenal', sans-serif" => "Arsenal", "Fira+Mono|'Fira Mono', monospace" => "Fira Mono", "Forum|'Forum', cursive" => "Forum", "Alegreya+Sans+SC|'Alegreya Sans SC', sans-serif" => "Alegreya Sans SC", "Cousine|'Cousine', monospace" => "Cousine", "Anonymous+Pro|'Anonymous Pro', monospace" => "Anonymous Pro", "Kosugi+Maru|'Kosugi Maru', sans-serif" => "Kosugi Maru", "Viaoda+Libre|'Viaoda Libre', cursive" => "Viaoda Libre", "Rubik+Mono+One|'Rubik Mono One', sans-serif" => "Rubik Mono One", "Pattaya|'Pattaya', sans-serif" => "Pattaya", "Commissioner|'Commissioner', sans-serif" => "Commissioner", "Scada|'Scada', sans-serif" => "Scada", "Oranienbaum|'Oranienbaum', serif" => "Oranienbaum", "Alegreya+SC|'Alegreya SC', serif" => "Alegreya SC", "Kurale|'Kurale', serif" => "Kurale", "Literata|'Literata', serif" => "Literata", "Pangolin|'Pangolin', cursive" => "Pangolin", "Gabriela|'Gabriela', serif" => "Gabriela", "Cormorant+Infant|'Cormorant Infant', serif" => "Cormorant Infant", "Kelly+Slab|'Kelly Slab', cursive" => "Kelly Slab", "Podkova|'Podkova', serif" => "Podkova", "Vollkorn+SC|'Vollkorn SC', serif" => "Vollkorn SC", "Kosugi|'Kosugi', sans-serif" => "Kosugi", "Spectral+SC|'Spectral SC', serif" => "Spectral SC", "Cormorant+SC|'Cormorant SC', serif" => "Cormorant SC", "Andika|'Andika', sans-serif" => "Andika", "Fira+Code|'Fira Code', monospace" => "Fira Code", "Ledger|'Ledger', serif" => "Ledger", "Prosto+One|'Prosto One', cursive" => "Prosto One", "Ruslan+Display|'Ruslan Display', cursive" => "Ruslan Display", "Bellota+Text|'Bellota Text', cursive" => "Bellota Text", "Bellota|'Bellota', cursive" => "Bellota", "Underdog|'Underdog', cursive" => "Underdog", "Cormorant+Unicase|'Cormorant Unicase', serif" => "Cormorant Unicase", "Seymour+One|'Seymour One', sans-serif" => "Seymour One", "Stalinist+One|'Stalinist One', cursive" => "Stalinist One", // Not Cirillic "Lemonada|'Lemonada', cursive" => "Lemonada (?)", "Sansita+Swashed|'Sansita Swashed', cursive" => "Sansita Swashed (?)", "Orbitron|'Orbitron', sans-serif" => "Orbitron (?)", "Cinzel|'Cinzel', serif" => "Cinzel (?)", "Texturina|'Texturina', serif" => "Texturina (?)", "Dancing+Script|'Dancing Script', cursive" => "Dancing Script (?)", "Josefin+Sans|'Josefin Sans', sans-serif" => "Josefin Sans (?)" ); asort($items); $option = array(); foreach ($items as $key => $val) { $option[] = JHtml::_('select.option', $key, $val); } // Merge any additional options in the XML definition. $options = array_merge(parent::getOptions(), $option); return $options; } public function getInput() { $doc = Factory::getDocument(); $doc->addScriptDeclaration(" function fontSelected(e){ var select = e.target || e; if (select.selectedIndex > 0) { // web font var val = select.options[select.selectedIndex].value; var fontID = val.split('|'); if (!document.getElementById(fontID[0])) { var head = document.getElementsByTagName('head')[0]; var link = document.createElement('link'); link.id = fontID[0]; link.rel = 'stylesheet'; link.type = 'text/css'; link.href = 'https://fonts.googleapis.com/css?family='+fontID[0]; link.media = 'all'; head.appendChild(link); } select.closest('div').querySelector('textarea').style.fontFamily = select.options[select.selectedIndex].innerHTML; }else{ // default browser font select.closest('div').querySelector('textarea').style.fontFamily = null; } } function fontChange(e){ var target = e.target; var select = target.closest('div').querySelector('select'); switch(target.dataset.action){ case 'down': var newOpt = select.options[select.selectedIndex+1]; break; case 'up': var newOpt = select.options[select.selectedIndex-1]; break; } if (newOpt !== undefined) { select.value = newOpt.value; fontSelected(select); jQuery(select).trigger('liszt:updated'); } } function fontSizeChange(e){ var target = e.target; var textarea = target.closest('div').querySelector('textarea'); var fontSize = textarea.style.fontSize; switch(target.dataset.action){ case 'increase': textarea.style.fontSize = (parseFloat(fontSize)+1)+'px'; break; case 'decrease': textarea.style.fontSize = (parseFloat(fontSize)-1)+'px'; break; } } "); $doc->addStyleDeclaration (' .fontsContainer { display: inline-block; padding: 4px; border: 1px solid #ccc; } .fontsContainer span{ webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .prewFonts { display: block !important; padding: 10px; margin-bottom: 6px !important; font-size: 22px; line-height: 1.4; width: 358px; min-width: 198px; min-height: 20px; } .padding{ padding-right: 6px; } .fontBtn{ border: 1px solid #ccc; background: #f3f3f3; padding: 4px 8px 6px 8px; cursor: pointer; } .fontBtn:hover{ background: #ccc; } '); $htmlA = '<div class="fontsContainer"><textarea class="prewFonts" style="font-size:22px;">A peep at some distant orb has power to raise and purify our thoughts like a strain of sacred music, or a noble picture, or a passage from the grander poets. It always does one good.</textarea>'; $htmlB = ' <span class="padding"></span> <span class="fontBtn" onclick="fontChange(event)" data-action="up">Up</span> <span class="fontBtn" onclick="fontChange(event)" data-action="down">Down</span> <span class="padding"></span> <span class="fontBtn" onclick="fontSizeChange(event)" data-action="increase">+</span> <span class="fontBtn" onclick="fontSizeChange(event)" data-action="decrease">-</span> <span class="padding"></span> '; $htmlB .= " </div> <script>fontSelected(document.getElementById('jform_params_". $this->element['name'] ."'));</script> "; return $htmlA . parent::getInput() . $htmlB; } }
Большая часть шрифтов из списка поддерживают кириллицу.
Пример XML кода:
<field name="body_font" type="selectfonts" label="Body font" description="" onchange="fontSelected(event)" />
Незабудьте указать путь к вашему полю, если оно находится не в стандартной папке.
<fieldset name="font" label="Font" description="" addfieldpath="/templates/mytmpl/fields"> </fieldset>