| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574 |
- <?php
- /**
- * @class FLPhotoModule
- */
- class FLPhotoModule extends FLBuilderModule {
- /**
- * @property $data
- */
- public $data = null;
- /**
- * @property $_editor
- * @protected
- */
- protected $_editor = null;
- /**
- * @method __construct
- */
- public function __construct() {
- parent::__construct(array(
- 'name' => __( 'Photo', 'fl-builder' ),
- 'description' => __( 'Upload a photo or display one from the media library.', 'fl-builder' ),
- 'category' => __( 'Basic', 'fl-builder' ),
- 'icon' => 'format-image.svg',
- 'partial_refresh' => true,
- ));
- }
- /**
- * @method enqueue_scripts
- */
- public function enqueue_scripts() {
- $override_lightbox = apply_filters( 'fl_builder_override_lightbox', false );
- if ( $this->settings && 'lightbox' == $this->settings->link_type ) {
- if ( ! $override_lightbox ) {
- $this->add_js( 'jquery-magnificpopup' );
- $this->add_css( 'font-awesome-5' );
- $this->add_css( 'jquery-magnificpopup' );
- } else {
- wp_dequeue_script( 'jquery-magnificpopup' );
- wp_dequeue_style( 'jquery-magnificpopup' );
- }
- }
- }
- /**
- * @method update
- * @param $settings {object}
- */
- public function update( $settings ) {
- // Make sure we have a photo_src property.
- if ( ! isset( $settings->photo_src ) ) {
- $settings->photo_src = '';
- }
- // Cache the attachment data.
- $settings->data = FLBuilderPhoto::get_attachment_data( $settings->photo );
- // Save a crop if necessary.
- $this->crop();
- return $settings;
- }
- /**
- * @method delete
- */
- public function delete() {
- $cropped_path = $this->_get_cropped_path();
- if ( fl_builder_filesystem()->file_exists( $cropped_path['path'] ) ) {
- fl_builder_filesystem()->unlink( $cropped_path['path'] );
- }
- }
- /**
- * @method crop
- */
- public function crop() {
- // Delete an existing crop if it exists.
- $this->delete();
- // Do a crop.
- if ( ! empty( $this->settings->crop ) ) {
- $editor = $this->_get_editor();
- if ( ! $editor || is_wp_error( $editor ) ) {
- return false;
- }
- $cropped_path = $this->_get_cropped_path();
- $size = $editor->get_size();
- $new_width = $size['width'];
- $new_height = $size['height'];
- // Get the crop ratios.
- if ( 'landscape' == $this->settings->crop ) {
- $ratio_1 = 1.43;
- $ratio_2 = .7;
- } elseif ( 'panorama' == $this->settings->crop ) {
- $ratio_1 = 2;
- $ratio_2 = .5;
- } elseif ( 'portrait' == $this->settings->crop ) {
- $ratio_1 = .7;
- $ratio_2 = 1.43;
- } elseif ( 'square' == $this->settings->crop ) {
- $ratio_1 = 1;
- $ratio_2 = 1;
- } elseif ( 'circle' == $this->settings->crop ) {
- $ratio_1 = 1;
- $ratio_2 = 1;
- }
- // Get the new width or height.
- if ( $size['width'] / $size['height'] < $ratio_1 ) {
- $new_height = $size['width'] * $ratio_2;
- } else {
- $new_width = $size['height'] * $ratio_1;
- }
- // Make sure we have enough memory to crop.
- try {
- ini_set( 'memory_limit', '300M' );
- } catch ( Exception $e ) {
- //
- }
- // Crop the photo.
- $editor->resize( $new_width, $new_height, true );
- // Save the photo.
- $editor->save( $cropped_path['path'] );
- /**
- * Let third party media plugins hook in.
- * @see fl_builder_photo_cropped
- */
- do_action( 'fl_builder_photo_cropped', $cropped_path, $editor );
- // Return the new url.
- return $cropped_path['url'];
- }
- return false;
- }
- /**
- * @method get_data
- */
- public function get_data() {
- if ( ! $this->data ) {
- // Photo source is set to "url".
- if ( 'url' == $this->settings->photo_source ) {
- $this->data = new stdClass();
- $this->data->alt = $this->settings->caption;
- $this->data->caption = $this->settings->caption;
- $this->data->link = $this->settings->photo_url;
- $this->data->url = $this->settings->photo_url;
- $this->settings->photo_src = $this->settings->photo_url;
- } elseif ( is_object( $this->settings->photo ) ) {
- $this->data = $this->settings->photo;
- } else {
- $this->data = FLBuilderPhoto::get_attachment_data( $this->settings->photo );
- }
- // Data object is empty, use the settings cache.
- if ( ! $this->data && isset( $this->settings->data ) ) {
- $this->data = $this->settings->data;
- }
- }
- return $this->data;
- }
- /**
- * @method get_classes
- */
- public function get_classes() {
- $classes = array( 'fl-photo-img' );
- if ( 'library' == $this->settings->photo_source && ! empty( $this->settings->photo ) ) {
- $data = self::get_data();
- if ( is_object( $data ) ) {
- if ( isset( $data->id ) ) {
- $classes[] = 'wp-image-' . $data->id;
- }
- if ( isset( $data->sizes ) ) {
- foreach ( $data->sizes as $key => $size ) {
- if ( $size->url == $this->settings->photo_src ) {
- $classes[] = 'size-' . $key;
- break;
- }
- }
- }
- }
- }
- return implode( ' ', $classes );
- }
- /**
- * @method get_src
- */
- public function get_src() {
- $src = $this->_get_uncropped_url();
- // Return a cropped photo.
- if ( $this->_has_source() && ! empty( $this->settings->crop ) ) {
- $cropped_path = $this->_get_cropped_path();
- // See if the cropped photo already exists.
- if ( fl_builder_filesystem()->file_exists( $cropped_path['path'] ) ) {
- $src = $cropped_path['url'];
- } elseif ( stristr( $src, FL_BUILDER_DEMO_URL ) && ! stristr( FL_BUILDER_DEMO_URL, $_SERVER['HTTP_HOST'] ) ) {
- $src = $this->_get_cropped_demo_url();
- } // It doesn't, check if this is a OLD demo image.
- elseif ( stristr( $src, FL_BUILDER_OLD_DEMO_URL ) ) {
- $src = $this->_get_cropped_demo_url();
- } // A cropped photo doesn't exist, try to create one.
- else {
- $url = $this->crop();
- if ( $url ) {
- $src = $url;
- }
- }
- }
- return $src;
- }
- /**
- * @method get_link
- */
- public function get_link() {
- $photo = $this->get_data();
- if ( 'url' == $this->settings->link_type ) {
- $link = $this->settings->link_url;
- } elseif ( 'lightbox' == $this->settings->link_type ) {
- $link = $photo->url;
- } elseif ( 'file' == $this->settings->link_type ) {
- $link = $photo->url;
- } elseif ( 'page' == $this->settings->link_type ) {
- $link = $photo->link;
- } else {
- $link = '';
- }
- return $link;
- }
- /**
- * @method get_alt
- */
- public function get_alt() {
- $photo = $this->get_data();
- if ( ! empty( $photo->alt ) ) {
- return htmlspecialchars( $photo->alt );
- } elseif ( ! empty( $photo->description ) ) {
- return htmlspecialchars( $photo->description );
- } elseif ( ! empty( $photo->caption ) ) {
- return htmlspecialchars( $photo->caption );
- } elseif ( ! empty( $photo->title ) ) {
- return htmlspecialchars( $photo->title );
- }
- }
- /**
- * @method get_attributes
- */
- public function get_attributes() {
- $photo = $this->get_data();
- $attrs = '';
- if ( isset( $this->settings->attributes ) ) {
- foreach ( $this->settings->attributes as $key => $val ) {
- $attrs .= $key . '="' . $val . '" ';
- }
- }
- if ( is_object( $photo ) && isset( $photo->sizes ) ) {
- foreach ( $photo->sizes as $size ) {
- if ( $size->url == $this->settings->photo_src ) {
- $attrs .= 'height="' . $size->height . '" width="' . $size->width . '" ';
- }
- }
- }
- if ( ! empty( $photo->title ) ) {
- $attrs .= 'title="' . htmlspecialchars( $photo->title ) . '" ';
- }
- return $attrs;
- }
- /**
- * @method _has_source
- * @protected
- */
- protected function _has_source() {
- if ( 'url' == $this->settings->photo_source && ! empty( $this->settings->photo_url ) ) {
- return true;
- } elseif ( 'library' == $this->settings->photo_source && ! empty( $this->settings->photo_src ) ) {
- return true;
- }
- return false;
- }
- /**
- * @method _get_editor
- * @protected
- */
- protected function _get_editor() {
- if ( $this->_has_source() && null === $this->_editor ) {
- $url_path = $this->_get_uncropped_url();
- $file_path = str_ireplace( home_url(), ABSPATH, $url_path );
- if ( fl_builder_filesystem()->file_exists( $file_path ) ) {
- $this->_editor = wp_get_image_editor( $file_path );
- } else {
- $this->_editor = wp_get_image_editor( $url_path );
- }
- }
- return $this->_editor;
- }
- /**
- * @method _get_cropped_path
- * @protected
- */
- protected function _get_cropped_path() {
- $crop = empty( $this->settings->crop ) ? 'none' : $this->settings->crop;
- $url = $this->_get_uncropped_url();
- $cache_dir = FLBuilderModel::get_cache_dir();
- if ( empty( $url ) ) {
- $filename = uniqid(); // Return a file that doesn't exist.
- } else {
- if ( stristr( $url, '?' ) ) {
- $parts = explode( '?', $url );
- $url = $parts[0];
- }
- $pathinfo = pathinfo( $url );
- if ( isset( $pathinfo['extension'] ) ) {
- $dir = $pathinfo['dirname'];
- $ext = $pathinfo['extension'];
- $name = wp_basename( $url, ".$ext" );
- $new_ext = strtolower( $ext );
- $filename = "{$name}-{$crop}.{$new_ext}";
- } else {
- $filename = $pathinfo['filename'] . "-{$crop}.png";
- }
- }
- return array(
- 'filename' => $filename,
- 'path' => $cache_dir['path'] . $filename,
- 'url' => $cache_dir['url'] . $filename,
- );
- }
- /**
- * @method _get_uncropped_url
- * @protected
- */
- protected function _get_uncropped_url() {
- if ( 'url' == $this->settings->photo_source ) {
- $url = $this->settings->photo_url;
- } elseif ( ! empty( $this->settings->photo_src ) ) {
- $url = $this->settings->photo_src;
- } else {
- $url = FL_BUILDER_URL . 'img/pixel.png';
- }
- return $url;
- }
- /**
- * @method _get_cropped_demo_url
- * @protected
- */
- protected function _get_cropped_demo_url() {
- $info = $this->_get_cropped_path();
- return FL_BUILDER_DEMO_CACHE_URL . $info['filename'];
- }
- /**
- * Returns link rel
- * @since 2.0.6
- */
- public function get_rel() {
- $rel = array();
- if ( '_blank' == $this->settings->link_target ) {
- $rel[] = 'noopener';
- }
- if ( isset( $this->settings->link_nofollow ) && 'yes' == $this->settings->link_nofollow ) {
- $rel[] = 'nofollow';
- }
- $rel = implode( ' ', $rel );
- if ( $rel ) {
- $rel = ' rel="' . $rel . '" ';
- }
- return $rel;
- }
- }
- /**
- * Register the module and its form settings.
- */
- FLBuilder::register_module('FLPhotoModule', array(
- 'general' => array( // Tab
- 'title' => __( 'General', 'fl-builder' ), // Tab title
- 'sections' => array( // Tab Sections
- 'general' => array( // Section
- 'title' => '', // Section Title
- 'fields' => array( // Section Fields
- 'photo_source' => array(
- 'type' => 'select',
- 'label' => __( 'Photo Source', 'fl-builder' ),
- 'default' => 'library',
- 'options' => array(
- 'library' => __( 'Media Library', 'fl-builder' ),
- 'url' => __( 'URL', 'fl-builder' ),
- ),
- 'toggle' => array(
- 'library' => array(
- 'fields' => array( 'photo' ),
- ),
- 'url' => array(
- 'fields' => array( 'photo_url', 'caption' ),
- ),
- ),
- ),
- 'photo' => array(
- 'type' => 'photo',
- 'label' => __( 'Photo', 'fl-builder' ),
- 'connections' => array( 'photo' ),
- 'show_remove' => true,
- ),
- 'photo_url' => array(
- 'type' => 'text',
- 'label' => __( 'Photo URL', 'fl-builder' ),
- 'placeholder' => __( 'http://www.example.com/my-photo.jpg', 'fl-builder' ),
- ),
- 'crop' => array(
- 'type' => 'select',
- 'label' => __( 'Crop', 'fl-builder' ),
- 'default' => '',
- 'options' => array(
- '' => _x( 'None', 'Photo Crop.', 'fl-builder' ),
- 'landscape' => __( 'Landscape', 'fl-builder' ),
- 'panorama' => __( 'Panorama', 'fl-builder' ),
- 'portrait' => __( 'Portrait', 'fl-builder' ),
- 'square' => __( 'Square', 'fl-builder' ),
- 'circle' => __( 'Circle', 'fl-builder' ),
- ),
- ),
- 'align' => array(
- 'type' => 'select',
- 'label' => __( 'Alignment', 'fl-builder' ),
- 'default' => 'center',
- 'options' => array(
- 'left' => __( 'Left', 'fl-builder' ),
- 'center' => __( 'Center', 'fl-builder' ),
- 'right' => __( 'Right', 'fl-builder' ),
- ),
- ),
- ),
- ),
- 'caption' => array(
- 'title' => __( 'Caption', 'fl-builder' ),
- 'fields' => array(
- 'show_caption' => array(
- 'type' => 'select',
- 'label' => __( 'Show Caption', 'fl-builder' ),
- 'default' => '0',
- 'options' => array(
- '0' => __( 'Never', 'fl-builder' ),
- 'hover' => __( 'On Hover', 'fl-builder' ),
- 'below' => __( 'Below Photo', 'fl-builder' ),
- ),
- ),
- 'caption' => array(
- 'type' => 'text',
- 'label' => __( 'Caption', 'fl-builder' ),
- ),
- ),
- ),
- 'link' => array(
- 'title' => __( 'Link', 'fl-builder' ),
- 'fields' => array(
- 'link_type' => array(
- 'type' => 'select',
- 'label' => __( 'Link Type', 'fl-builder' ),
- 'options' => array(
- '' => _x( 'None', 'Link type.', 'fl-builder' ),
- 'url' => __( 'URL', 'fl-builder' ),
- 'lightbox' => __( 'Lightbox', 'fl-builder' ),
- 'file' => __( 'Photo File', 'fl-builder' ),
- 'page' => __( 'Photo Page', 'fl-builder' ),
- ),
- 'toggle' => array(
- '' => array(),
- 'url' => array(
- 'fields' => array( 'link_url', 'link_target' ),
- ),
- 'file' => array(),
- 'page' => array(),
- ),
- 'help' => __( 'Link type applies to how the image should be linked on click. You can choose a specific URL, the individual photo or a separate page with the photo.', 'fl-builder' ),
- 'preview' => array(
- 'type' => 'none',
- ),
- ),
- 'link_url' => array(
- 'type' => 'link',
- 'label' => __( 'Link URL', 'fl-builder' ),
- 'preview' => array(
- 'type' => 'none',
- ),
- 'connections' => array( 'url' ),
- ),
- 'link_target' => array(
- 'type' => 'select',
- 'label' => __( 'Link Target', 'fl-builder' ),
- 'default' => '_self',
- 'options' => array(
- '_self' => __( 'Same Window', 'fl-builder' ),
- '_blank' => __( 'New Window', 'fl-builder' ),
- ),
- 'preview' => array(
- 'type' => 'none',
- ),
- ),
- 'link_nofollow' => array(
- 'type' => 'select',
- 'label' => __( 'Link No Follow', 'fl-builder' ),
- 'default' => 'no',
- 'options' => array(
- 'yes' => __( 'Yes', 'fl-builder' ),
- 'no' => __( 'No', 'fl-builder' ),
- ),
- 'preview' => array(
- 'type' => 'none',
- ),
- ),
- ),
- ),
- ),
- ),
- ));
|