PageRenderTime 25ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/wp-content/plugins/header-footer-elementor/inc/widgets-manager/widgets/class-page-title.php

https://gitlab.com/campus-academy/krowkaramel
PHP | 530 lines | 388 code | 47 blank | 95 comment | 27 complexity | a22100833a0a5b709229e83cdf424e80 MD5 | raw file
  1. <?php
  2. /**
  3. * Elementor Classes.
  4. *
  5. * @package header-footer-elementor
  6. */
  7. namespace HFE\WidgetsManager\Widgets;
  8. use Elementor\Controls_Manager;
  9. use Elementor\Group_Control_Text_Shadow;
  10. use Elementor\Widget_Base;
  11. use Elementor\Group_Control_Typography;
  12. use Elementor\Core\Kits\Documents\Tabs\Global_Typography;
  13. use Elementor\Core\Kits\Documents\Tabs\Global_Colors;
  14. use HFE\WidgetsManager\Widgets_Loader;
  15. if ( ! defined( 'ABSPATH' ) ) {
  16. exit; // Exit if accessed directly.
  17. }
  18. /**
  19. * HFE Page Title widget
  20. *
  21. * HFE widget for Page Title.
  22. *
  23. * @since 1.3.0
  24. */
  25. class Page_Title extends Widget_Base {
  26. /**
  27. * Retrieve the widget name.
  28. *
  29. * @since 1.3.0
  30. *
  31. * @access public
  32. *
  33. * @return string Widget name.
  34. */
  35. public function get_name() {
  36. return 'page-title';
  37. }
  38. /**
  39. * Retrieve the widget title.
  40. *
  41. * @since 1.3.0
  42. *
  43. * @access public
  44. *
  45. * @return string Widget title.
  46. */
  47. public function get_title() {
  48. return __( 'Page Title', 'header-footer-elementor' );
  49. }
  50. /**
  51. * Retrieve the widget icon.
  52. *
  53. * @since 1.3.0
  54. *
  55. * @access public
  56. *
  57. * @return string Widget icon.
  58. */
  59. public function get_icon() {
  60. return 'hfe-icon-page-title';
  61. }
  62. /**
  63. * Retrieve the list of categories the widget belongs to.
  64. *
  65. * Used to determine where to display the widget in the editor.
  66. *
  67. * Note that currently Elementor supports only one category.
  68. * When multiple categories passed, Elementor uses the first one.
  69. *
  70. * @since 1.3.0
  71. *
  72. * @access public
  73. *
  74. * @return array Widget categories.
  75. */
  76. public function get_categories() {
  77. return [ 'hfe-widgets' ];
  78. }
  79. /**
  80. * Register Page Title controls.
  81. *
  82. * @since 1.3.0
  83. * @access protected
  84. */
  85. protected function _register_controls() { // phpcs:ignore PSR2.Methods.MethodDeclaration.Underscore
  86. $this->register_controls();
  87. }
  88. /**
  89. * Register Page Title controls.
  90. *
  91. * @since 1.5.7
  92. * @access protected
  93. */
  94. protected function register_controls() {
  95. $this->register_content_page_title_controls();
  96. $this->register_page_title_style_controls();
  97. }
  98. /**
  99. * Register Page Title General Controls.
  100. *
  101. * @since 1.3.0
  102. * @access protected
  103. */
  104. protected function register_content_page_title_controls() {
  105. $this->start_controls_section(
  106. 'section_general_fields',
  107. [
  108. 'label' => __( 'Title', 'header-footer-elementor' ),
  109. ]
  110. );
  111. $this->add_control(
  112. 'archive_title_note',
  113. [
  114. 'type' => Controls_Manager::RAW_HTML,
  115. /* translators: %1$s doc link */
  116. 'raw' => sprintf( __( '<b>Note:</b> Archive page title will be visible on frontend.', 'header-footer-elementor' ) ),
  117. 'content_classes' => 'elementor-panel-alert elementor-panel-alert-warning',
  118. ]
  119. );
  120. $this->add_control(
  121. 'before',
  122. [
  123. 'label' => __( 'Before Title Text', 'header-footer-elementor' ),
  124. 'type' => Controls_Manager::TEXT,
  125. 'dynamic' => [
  126. 'active' => true,
  127. ],
  128. ]
  129. );
  130. $this->add_control(
  131. 'after',
  132. [
  133. 'label' => __( 'After Title Text', 'header-footer-elementor' ),
  134. 'type' => Controls_Manager::TEXT,
  135. 'dynamic' => [
  136. 'active' => true,
  137. ],
  138. ]
  139. );
  140. $this->add_control(
  141. 'new_page_title_select_icon',
  142. [
  143. 'label' => __( 'Select Icon', 'header-footer-elementor' ),
  144. 'type' => Controls_Manager::ICONS,
  145. 'render_type' => 'template',
  146. ]
  147. );
  148. $this->add_control(
  149. 'page_title_icon_indent',
  150. [
  151. 'label' => __( 'Icon Spacing', 'header-footer-elementor' ),
  152. 'type' => Controls_Manager::SLIDER,
  153. 'range' => [
  154. 'px' => [
  155. 'max' => 50,
  156. ],
  157. ],
  158. 'condition' => [
  159. 'new_page_title_select_icon[value]!' => '',
  160. ],
  161. 'selectors' => [
  162. '{{WRAPPER}} .hfe-page-title-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
  163. ],
  164. ]
  165. );
  166. $this->add_control(
  167. 'page_custom_link',
  168. [
  169. 'label' => __( 'Link', 'header-footer-elementor' ),
  170. 'type' => Controls_Manager::SELECT,
  171. 'options' => [
  172. 'custom' => __( 'Custom URL', 'header-footer-elementor' ),
  173. 'default' => __( 'Default', 'header-footer-elementor' ),
  174. 'none' => __( 'None', 'header-footer-elementor' ),
  175. ],
  176. 'default' => 'default',
  177. ]
  178. );
  179. $this->add_control(
  180. 'page_heading_link',
  181. [
  182. 'label' => __( 'Link', 'header-footer-elementor' ),
  183. 'type' => Controls_Manager::URL,
  184. 'placeholder' => __( 'https://your-link.com', 'header-footer-elementor' ),
  185. 'dynamic' => [
  186. 'active' => true,
  187. ],
  188. 'default' => [
  189. 'url' => get_home_url(),
  190. ],
  191. 'condition' => [
  192. 'page_custom_link' => 'custom',
  193. ],
  194. ]
  195. );
  196. $this->add_control(
  197. 'heading_tag',
  198. [
  199. 'label' => __( 'HTML Tag', 'header-footer-elementor' ),
  200. 'type' => Controls_Manager::SELECT,
  201. 'options' => [
  202. 'h1' => __( 'H1', 'header-footer-elementor' ),
  203. 'h2' => __( 'H2', 'header-footer-elementor' ),
  204. 'h3' => __( 'H3', 'header-footer-elementor' ),
  205. 'h4' => __( 'H4', 'header-footer-elementor' ),
  206. 'h5' => __( 'H5', 'header-footer-elementor' ),
  207. 'h6' => __( 'H6', 'header-footer-elementor' ),
  208. ],
  209. 'default' => 'h2',
  210. ]
  211. );
  212. $this->add_control(
  213. 'size',
  214. [
  215. 'label' => __( 'Size', 'header-footer-elementor' ),
  216. 'type' => Controls_Manager::SELECT,
  217. 'default' => 'default',
  218. 'options' => [
  219. 'default' => __( 'Default', 'header-footer-elementor' ),
  220. 'small' => __( 'Small', 'header-footer-elementor' ),
  221. 'medium' => __( 'Medium', 'header-footer-elementor' ),
  222. 'large' => __( 'Large', 'header-footer-elementor' ),
  223. 'xl' => __( 'XL', 'header-footer-elementor' ),
  224. 'xxl' => __( 'XXL', 'header-footer-elementor' ),
  225. ],
  226. ]
  227. );
  228. $this->add_responsive_control(
  229. 'align',
  230. [
  231. 'label' => __( 'Alignment', 'header-footer-elementor' ),
  232. 'type' => Controls_Manager::CHOOSE,
  233. 'options' => [
  234. 'left' => [
  235. 'title' => __( 'Left', 'header-footer-elementor' ),
  236. 'icon' => 'eicon-text-align-left',
  237. ],
  238. 'center' => [
  239. 'title' => __( 'Center', 'header-footer-elementor' ),
  240. 'icon' => 'eicon-text-align-center',
  241. ],
  242. 'right' => [
  243. 'title' => __( 'Right', 'header-footer-elementor' ),
  244. 'icon' => 'eicon-text-align-right',
  245. ],
  246. 'justify' => [
  247. 'title' => __( 'Justified', 'header-footer-elementor' ),
  248. 'icon' => 'eicon-text-align-justify',
  249. ],
  250. ],
  251. 'default' => '',
  252. 'selectors' => [
  253. '{{WRAPPER}} .hfe-page-title-wrapper' => 'text-align: {{VALUE}};',
  254. ],
  255. 'frontend_available' => true,
  256. ]
  257. );
  258. $this->end_controls_section();
  259. }
  260. /**
  261. * Register Page Title Style Controls.
  262. *
  263. * @since 1.3.0
  264. * @access protected
  265. */
  266. protected function register_page_title_style_controls() {
  267. $this->start_controls_section(
  268. 'section_title_typography',
  269. [
  270. 'label' => __( 'Title', 'header-footer-elementor' ),
  271. 'tab' => Controls_Manager::TAB_STYLE,
  272. ]
  273. );
  274. $this->add_group_control(
  275. Group_Control_Typography::get_type(),
  276. [
  277. 'name' => 'title_typography',
  278. 'global' => [
  279. 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
  280. ],
  281. 'selector' => '{{WRAPPER}} .elementor-heading-title, {{WRAPPER}} .hfe-page-title a',
  282. ]
  283. );
  284. $this->add_control(
  285. 'title_color',
  286. [
  287. 'label' => __( 'Color', 'header-footer-elementor' ),
  288. 'type' => Controls_Manager::COLOR,
  289. 'global' => [
  290. 'default' => Global_Colors::COLOR_PRIMARY,
  291. ],
  292. 'selectors' => [
  293. '{{WRAPPER}} .elementor-heading-title, {{WRAPPER}} .hfe-page-title a' => 'color: {{VALUE}};',
  294. '{{WRAPPER}} .hfe-page-title-icon i' => 'color: {{VALUE}};',
  295. '{{WRAPPER}} .hfe-page-title-icon svg' => 'fill: {{VALUE}};',
  296. ],
  297. ]
  298. );
  299. $this->add_group_control(
  300. Group_Control_Text_Shadow::get_type(),
  301. [
  302. 'name' => 'title_shadow',
  303. 'selector' => '{{WRAPPER}} .elementor-heading-title',
  304. ]
  305. );
  306. $this->add_control(
  307. 'blend_mode',
  308. [
  309. 'label' => __( 'Blend Mode', 'header-footer-elementor' ),
  310. 'type' => Controls_Manager::SELECT,
  311. 'options' => [
  312. '' => __( 'Normal', 'header-footer-elementor' ),
  313. 'multiply' => 'Multiply',
  314. 'screen' => 'Screen',
  315. 'overlay' => 'Overlay',
  316. 'darken' => 'Darken',
  317. 'lighten' => 'Lighten',
  318. 'color-dodge' => 'Color Dodge',
  319. 'saturation' => 'Saturation',
  320. 'color' => 'Color',
  321. 'difference' => 'Difference',
  322. 'exclusion' => 'Exclusion',
  323. 'hue' => 'Hue',
  324. 'luminosity' => 'Luminosity',
  325. ],
  326. 'selectors' => [
  327. '{{WRAPPER}} .elementor-heading-title' => 'mix-blend-mode: {{VALUE}}',
  328. ],
  329. ]
  330. );
  331. $this->end_controls_section();
  332. $this->start_controls_section(
  333. 'section_icon',
  334. [
  335. 'label' => __( 'Icon', 'header-footer-elementor' ),
  336. 'tab' => Controls_Manager::TAB_STYLE,
  337. 'condition' => [
  338. 'new_page_title_select_icon[value]!' => '',
  339. ],
  340. ]
  341. );
  342. $this->add_control(
  343. 'page_title_icon_color',
  344. [
  345. 'label' => __( 'Icon Color', 'header-footer-elementor' ),
  346. 'type' => Controls_Manager::COLOR,
  347. 'global' => [
  348. 'default' => Global_Colors::COLOR_PRIMARY,
  349. ],
  350. 'condition' => [
  351. 'new_page_title_select_icon[value]!' => '',
  352. ],
  353. 'default' => '',
  354. 'selectors' => [
  355. '{{WRAPPER}} .hfe-page-title-icon i' => 'color: {{VALUE}};',
  356. '{{WRAPPER}} .hfe-page-title-icon svg' => 'fill: {{VALUE}};',
  357. ],
  358. ]
  359. );
  360. $this->add_control(
  361. 'page_title_icons_hover_color',
  362. [
  363. 'label' => __( 'Icon Hover Color', 'header-footer-elementor' ),
  364. 'type' => Controls_Manager::COLOR,
  365. 'condition' => [
  366. 'new_page_title_select_icon[value]!' => '',
  367. ],
  368. 'default' => '',
  369. 'selectors' => [
  370. '{{WRAPPER}} .hfe-page-title-icon:hover i' => 'color: {{VALUE}};',
  371. '{{WRAPPER}} .hfe-page-title-icon:hover svg' => 'fill: {{VALUE}};',
  372. ],
  373. ]
  374. );
  375. $this->end_controls_section();
  376. }
  377. /**
  378. * Render page title widget output on the frontend.
  379. *
  380. * Written in PHP and used to generate the final HTML.
  381. *
  382. * @since 1.3.0
  383. * @access protected
  384. */
  385. protected function render() {
  386. $settings = $this->get_settings_for_display();
  387. $this->add_inline_editing_attributes( 'page_title', 'basic' );
  388. if ( ! empty( $settings['page_heading_link']['url'] ) ) {
  389. $this->add_link_attributes( 'url', $settings['page_heading_link'] );
  390. }
  391. $heading_size_tag = Widgets_Loader::validate_html_tag( $settings['heading_tag'] );
  392. ?>
  393. <div class="hfe-page-title hfe-page-title-wrapper elementor-widget-heading">
  394. <?php
  395. $head_link_url = isset( $settings['page_heading_link']['url'] ) ? $settings['page_heading_link']['url'] : '';
  396. $head_custom_link = isset( $settings['page_custom_link'] ) ? $settings['page_custom_link'] : '';
  397. ?>
  398. <?php if ( '' != $head_link_url && 'custom' === $head_custom_link ) { ?>
  399. <a <?php echo wp_kses_post( $this->get_render_attribute_string( 'url' ) ); ?>>
  400. <?php } elseif ( 'default' === $head_custom_link ) { ?>
  401. <a href="<?php echo esc_url( get_home_url() ); ?>">
  402. <?php } ?>
  403. <<?php echo $heading_size_tag; ?> class="elementor-heading-title elementor-size-<?php echo $settings['size']; ?>">
  404. <?php if ( '' !== $settings['new_page_title_select_icon']['value'] ) { ?>
  405. <span class="hfe-page-title-icon">
  406. <?php \Elementor\Icons_Manager::render_icon( $settings['new_page_title_select_icon'], [ 'aria-hidden' => 'true' ] ); ?> </span>
  407. <?php } ?>
  408. <?php if ( '' != $settings['before'] ) { ?>
  409. <?php echo wp_kses_post( $settings['before'] ); ?>
  410. <?php
  411. }
  412. if ( is_archive() || is_home() ) {
  413. echo wp_kses_post( get_the_archive_title() );
  414. } else {
  415. echo wp_kses_post( get_the_title() );
  416. }
  417. if ( '' != $settings['after'] ) {
  418. ?>
  419. <?php echo wp_kses_post( $settings['after'] ); ?>
  420. <?php } ?>
  421. </<?php echo $heading_size_tag; ?> >
  422. <?php if ( ( '' != $head_link_url && 'custom' === $head_custom_link ) || 'default' === $head_custom_link ) { ?>
  423. </a>
  424. <?php } ?>
  425. </div>
  426. <?php
  427. }
  428. /**
  429. * Render page title output in the editor.
  430. *
  431. * Written as a Backbone JavaScript template and used to generate the live preview.
  432. *
  433. * @since 1.3.0
  434. * @access protected
  435. */
  436. protected function content_template() {
  437. ?>
  438. <#
  439. if ( '' == settings.page_title ) {
  440. return;
  441. }
  442. if ( '' != settings.page_heading_link.url ) {
  443. view.addRenderAttribute( 'url', 'href', settings.page_heading_link.url );
  444. }
  445. var iconHTML = elementor.helpers.renderIcon( view, settings.new_page_title_select_icon, { 'aria-hidden': true }, 'i' , 'object' );
  446. var headingSizeTag = settings.heading_tag;
  447. if ( typeof elementor.helpers.validateHTMLTag === "function" ) {
  448. headingSizeTag = elementor.helpers.validateHTMLTag( settings.heading_tag );
  449. } else if( HfeWidgetsData.allowed_tags ) {
  450. headingSizeTag = HfeWidgetsData.allowed_tags.includes( headingSizeTag.toLowerCase() ) ? headingSizeTag : 'div';
  451. }
  452. #>
  453. <div class="hfe-page-title hfe-page-title-wrapper elementor-widget-heading">
  454. <# if ( '' != settings.page_heading_link.url ) { #>
  455. <a {{{ view.getRenderAttributeString( 'url' ) }}} >
  456. <# } #>
  457. <{{{ headingSizeTag }}} class="elementor-heading-title elementor-size-{{{ settings.size }}}">
  458. <# if( '' != settings.new_page_title_select_icon.value ){ #>
  459. <span class="hfe-page-title-icon" data-elementor-setting-key="page_title" data-elementor-inline-editing-toolbar="basic">
  460. {{{iconHTML.value}}}
  461. </span>
  462. <# } #>
  463. <# if ( '' != settings.before ) { #>
  464. {{{ settings.before }}}
  465. <# } #>
  466. <?php
  467. if ( is_archive() || is_home() ) {
  468. echo wp_kses_post( get_the_archive_title() );
  469. } else {
  470. echo wp_kses_post( get_the_title() );
  471. }
  472. ?>
  473. <# if ( '' != settings.after ) { #>
  474. {{{ settings.after }}}
  475. <# } #>
  476. </{{{ headingSizeTag }}}>
  477. <# if ( '' != settings.page_heading_link.url ) { #>
  478. </a>
  479. <# } #>
  480. </div>
  481. <?php
  482. }
  483. }