HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/biblioteka/wp-content/plugins/gallery-by-supsystic/src/GridGallery/Photos/Controller.php
<?php

/**
 * Class GridGallery_Photos_Controller
 *
 * @package GridGallery\Photos
 */
class GridGallery_Photos_Controller extends GridGallery_Core_BaseController
{

    const STD_VIEW = 'list'; // accepts 'list' or 'block'.

    public function requireNonces() {
        return array(
            'addAction',
            'addFolderAction',
            'deleteAction',
            'moveAction',
            'updateTitleAction',
            'updateAttachmentAction',
            'updatePositionAction'
        );
    }
    /**
     * {@inheritdoc}
     */
    protected function getModelAliases()
    {
        return array(
            'resources' => 'GridGallery_Galleries_Model_Resources',
            'photos' => 'GridGallery_Photos_Model_Photos',
            'folders' => 'GridGallery_Photos_Model_Folders',
            'position' => 'GridGallery_Photos_Model_Position',
        );
    }

    /**
     * Index Action
     * Shows the list of the all photos
     */
    public function indexAction(RscSgg_Http_Request $request)
    {
        $stats = $this->getEnvironment()->getModule('stats');
        $stats->save('Images.tab');

        if ('grid-gallery-images' === $request->query->get('page')) {
            $redirectUrl = $this->generateUrl('photos');

            return $this->redirect($redirectUrl);
        }

        $folders = $this->getModel('folders');
        $photos = $this->getModel('photos');
        $position = $this->getModel('position');

        $images = array_map(
            array($position, 'setPosition'),
            $photos->getAllWithoutFolders()
        );

        return $this->response(
            '@photos/index.twig',
            array(
                'entities' => array(
                    'images' => $position->sort($images),
                    'folders' => $folders->getAll()
                ),
                'view_type' => sanitize_text_field($request->query->get('view', self::STD_VIEW)),
                'ajax_url' => esc_url(admin_url('admin-ajax.php')),
            )
        );
    }

    /**
     * View Action
     * Shows the photos in the selected album
     *
     * @param RscSgg_Http_Request $request
     * @return RscSgg_Http_Response
     */
    public function viewAction(RscSgg_Http_Request $request)
    {
        if (!$request->query->has('folder_id')) {
            $this->redirect(
                $this->getEnvironment()->generateUrl('photos', 'index')
            );
        }

        $stats = $this->getEnvironment()->getModule('stats');
        $stats->save('folders.view');

        $folderId = (int)$request->query->get('folder_id');

        $folders = $this->getModel('folders');

        if (!$folder = $folders->getById($folderId)) {
            $this->redirect(
                $this->getEnvironment()->generateUrl('photos', 'index')
            );
        }

        $position = $this->getModel('position');

        foreach ($folder->photos as $index => $row) {
            $folder->photos[$index] = $position->setPosition(
                $row,
                'folder',
                $folderId
            );
        }

        $folder->photos = $position->sort($folder->photos);

        return $this->response(
            '@photos/view.twig',
            array(
                'folder' => $folder,
                'ajax_url' => esc_url(admin_url('admin-ajax.php')),
                'view_type' => sanitize_text_field($request->query->get('view', self::STD_VIEW)),
            )
        );
    }

	/**
	 * Extract for use in Pro version
	 */
	protected function addPhotoResForAddAction($_photos, $_attachment, $_request) {
		return $_photos->add($_attachment->ID, $_request->post->get('folder_id', 0), array());
	}

    /**
     * Add Action
     * Adds new photos to the database
     *
     * @param RscSgg_Http_Request $request
     * @return RscSgg_Http_Response
     */
    public function addAction(RscSgg_Http_Request $request)
    {
        $env = $this->getEnvironment();

		$photos = $this->getModel('photos');

        if ($env->getConfig()->isEnvironment(
            RscSgg_Environment::ENV_DEVELOPMENT
        )
        ) {
            $photos->setDebugEnabled(true);
        }

        $attachment = get_post(sanitize_key($request->post->get('attachment_id')));
        $viewType = sanitize_text_field($request->post->get('view_type'));

        $stats = $this->getEnvironment()->getModule('stats');
        $stats->save('photos.add');

        $this->getModule('galleries')->cleanCache(sanitize_key($request->post->get('galleryId')));

		if (!$this->addPhotoResForAddAction($photos, $attachment, $request)) {
            $response = array(
                'error' => true,
                'photo' => null,
                'message' => sprintf(
                    $env->translate('Unable to save chosen photo %s: %s'),
                    esc_html($attachment->post_title),
                    esc_html($photos->getLastError())
                ),
            );
        } else {
            $response = array(
                'error' => false,
                'message' => sprintf(
                    $env->translate(
                        'Photo %s was successfully imported to the Grid Gallery'
                    ),
                    esc_html($attachment->post_title)
                ),
				'link' => $this->generateUrl(
					'galleries',
					'view',
					array('gallery_id' => sanitize_key($request->post->get('galleryId')))
				),
            );
        }

        if($request->post->get('attachType') && $request->post->get('galleryId')) {
            $this->getModel('resources')->attach(sanitize_key($request->post->get('galleryId')), 'photo', $photos->getByAttachmentId($attachment->ID)->id,true);
        }

		$imageParams = array(
			'gallery_id' => sanitize_key($request->post->get('galleryId')),
			'attachment' => $attachment,
		);
		do_action('sgg_add_new_image_to_gallery', $imageParams);

        return $this->response(RscSgg_Http_Response::AJAX, $response);
    }

    /**
     * Add Folder Action
     * Adds the new folder
     *
     * @param RscSgg_Http_Request $request
     * @return RscSgg_Http_Response
     */
    public function addFolderAction(RscSgg_Http_Request $request)
    {
        $env = $this->getEnvironment();
        $folders = new GridGallery_Photos_Model_Folders();

        $stats = $this->getEnvironment()->getModule('stats');
        $stats->save('folders.add');

        if ($env->getConfig()->isEnvironment(
            RscSgg_Environment::ENV_DEVELOPMENT
        )
        ) {
            $folders->setDebugEnabled(true);
        }

        $folderName = sanitize_text_field($request->post->get('folder_name'));
        $viewType = sanitize_text_field($request->post->get('view_type'));

        if (!$folders->add(
            ($folderName) ? $folderName : $env->translate('New Folder')
        )
        ) {
            $response = array(
                'error' => true,
                'folder' => null,
            );
        } else {
            $folder = $env->getTwig()->render(
                sprintf('@ui/%s/folder.twig', $viewType ? $viewType : 'block'),
                array('folder' => $folders->getById($folders->getInsertId()))
            );

            $response = array(
                'error' => false,
                'folder' => $folder,
                'id' => $folders->getInsertId(),
            );
        }

        return $this->response('ajax', $response);
    }

    /**
     * Delete Action
     * Deletes the specified folders and photos
     *
     * @param RscSgg_Http_Request $request
     * @return RscSgg_Http_Response
     */
    public function deleteAction(RscSgg_Http_Request $request)
    {
        $env = $this->getEnvironment();
        $data = $request->post->get('data');
        $debug = $env->getConfig()->isEnvironment(
            RscSgg_Environment::ENV_DEVELOPMENT
        );
        $photos = new GridGallery_Photos_Model_Photos($debug);
        $folders = new GridGallery_Photos_Model_Folders($debug);

        $stats = $this->getEnvironment()->getModule('stats');

        if (!$data) {
            return $this->response(
                'ajax',
                array(
                    'error' => true,
                )
            );
        }

        foreach ($data as $type => $identifies) {
            foreach ($identifies as $id) {
                if ($type === 'photo') {
                    $stats->save('photos.delete');
                    $photos->deleteById((int)$id);
                } else {
                    $stats->save('folders.delete');
                    $folders->deleteById((int)$id);
                }
            }
        }

        return $this->response(
            'ajax',
            array(
                'error' => false,
            )
        );
    }

    public function checkPhotoUsageAction(RscSgg_Http_Request $request)
    {
        $photoId = intval($request->post->get('photo_id'));
    
        $photos = $this->getModel('photos');
        $photo = $photos->getById($photoId);
    
        $resources = $this->getModel('resources');
    
        if ($photo && $photo->folder_id > 0) {
            $galleries = $resources->getGalleriesWithFolder($photo->folder_id);
        } elseif ($photo) {
            $galleries = $resources->getGalleriesWithPhoto($photo->id);
        } else {
            $galleries = array();
        }
    
        return $this->response(RscSgg_Http_Response::AJAX, array(
            'count' => count($galleries),
        ));
    }
    
    public function rotatePhotoAction(RscSgg_Http_Request $request)
    {
        $env = $this->getEnvironment();
        $ids = array_map('intval', (array)$request->post->get('ids'));
        $rotateType = sanitize_text_field($request->post->get('rotateType'));
        $rotated = 0;
        if (!empty($ids)) {
            $photos = $this->getModel('photos');
    
            foreach ($ids as $photoId) {
                $photo = $photos->getById($photoId);
                if ($photo && $photos->rotateAttachment($photo->attachment, $rotateType)) {
                    $rotated++;
                }
            }
        }
        $this->getModule('galleries')->cleanCache(intval($request->post->get('gallery_id')));
        return $this->response(RscSgg_Http_Response::AJAX, array('message' => sprintf($env->translate('There are %d photos successfully rotated'), $rotated)));
    }
    
    public function moveAction(RscSgg_Http_Request $request)
    {
        $photos = new GridGallery_Photos_Model_Photos();
        $error = true;
    
        $photoId = intval($request->post->get('photo_id'));
        $folderId = intval($request->post->get('folder_id'));
    
        if ($photos->toFolder($photoId, $folderId)) {
            $error = false;
        }
    
        return $this->response(
            'ajax',
            array(
                'error' => $error,
            )
        );
    }
    
    public function renderAction(RscSgg_Http_Request $request)
    {
        $photos = $request->post->get('photos');
    
        if (!is_array($photos)) {
            return $this->response(
                'ajax',
                array(
                    'error' => true,
                    'photos' => null,
                )
            );
        }
    
        $renders = array();
    
        foreach ($photos as $photo) {
            $renders[] = $this->getEnvironment()->getTwig()->render(
                '@photos/includes/photo.twig', array('photo' => $photo)
            );
        }
    
        return $this->response(
            'ajax',
            array(
                'error' => false,
                'photos' => $renders,
            )
        );
    }
    
    public function updateTitleAction(RscSgg_Http_Request $request)
    {
        $env = $this->getEnvironment();
        $folders = new GridGallery_Photos_Model_Folders();
        $title = sanitize_text_field($request->post->get('folder_name'));
        $folderId = intval($request->post->get('folder_id'));
    
        if (empty($title)) {
            return $this->response(
                'ajax',
                array(
                    'error' => true,
                    'message' => $env->translate('The title can\'t be empty'),
                )
            );
        }
    
        if ($folders->updateTitle($folderId, $title)) {
            return $this->response(
                'ajax',
                array(
                    'error' => false,
                    'message' => $env->translate('Title successfully updated'),
                )
            );
        }
    
        return $this->response(
            'ajax',
            array(
                'error' => true,
                'message' => $env->translate(
                    'Unable to update the title. Try again later'
                ),
            )
        );
    }
    
    public function isEmptyAction()
    {
        $debugEnabled = $this->getEnvironment()->isDev();
    
        $isEmpty = true;
        $photos = new GridGallery_Photos_Model_Photos($debugEnabled);
    
        $photoCount = $photos->getAllImgCount();
    
        if ($photoCount > 0) {
            $isEmpty = false;
        }    
        return $this->response(
            RscSgg_Http_Response::AJAX,
            array(
                'isEmpty' => $isEmpty,
            )
        );
    }
    
    protected function beforeUpdateAttachment(RscSgg_Http_Request $request){
     $photos = $this->getModel('photos');    
        if ($replaceAttachmentId = intval($request->post->get('replace_attachment_id'))) {
            $gallery = $this->getModule('galleries');
            $replacePost = get_post($replaceAttachmentId);
            $newAttachId = $gallery->media_sideload_image($replacePost->guid, 0);
            $photos->updateAttachmentId(intval($request->post->get('image_id')), $newAttachId);
            $request->post->set('attachment_id', $newAttachId);
            $request->post->set('replace_attachment_id', null);
        }
    }
    
    public function updateAttachmentAction(RscSgg_Http_Request $request) {
    
        $photos = $this->getModel('photos');
    
        $alt = sanitize_text_field($request->post->get('alt'));
        $attachmentId = intval($request->post->get('attachment_id'));
        $replaceAttachmentId = intval($request->post->get('replace_attachment_id'));
        if ($replaceAttachmentId) {
            $photos->updateAttachmentId(intval($request->post->get('image_id')), $replaceAttachmentId);
            $attachmentId = $replaceAttachmentId;
        }
        $caption = sanitize_text_field($request->post->get('caption'));
        $description = sanitize_textarea_field($request->post->get('description'));
        $target = sanitize_text_field($request->post->get('target', '_self'));
        $link = esc_url_raw($request->post->get('link'));
        $captionEffect = sanitize_text_field($request->post->get('captionEffect'));
        $cropPosition = sanitize_text_field($request->post->get('cropPosition'));
    
        if ($link) {
            if (!empty($request->post->get('rel', ''))) {
                $rel = implode(' ', array_map('sanitize_text_field', (array)$request->post->get('rel', '')));
            } else {
                $rel = '';
            }
        } else {
            $rel = '';
        }
    
        $update = array();
        if (!is_null($request->post->get('alt'))) $update['alt'] = (empty($alt) ? " " : $alt);
        if (!is_null($request->post->get('caption'))) $update['caption'] = $caption;
        if (!is_null($request->post->get('description'))) $update['description'] = $description;
        if (!is_null($request->post->get('captionEffect'))) $update['captionEffect'] = $captionEffect;
        if (!is_null($request->post->get('cropPosition'))) $update['cropPosition'] = $cropPosition;
        if (!is_null($request->post->get('link'))) {
            $update['link'] = $link;
            $update['target'] = $target;
            $update['rel'] = $rel;
        }
        $update = $this->getEnvironment()->getDispatcher()->applyFilters('before_update_photo_attachment', $update, $attachmentId);
        $photos->updateMetadata($attachmentId, $update);
    
        $this->getModule('galleries')->cleanCache(intval($request->post->get('gallery_id')));
    
        return $this->response(RscSgg_Http_Response::AJAX);
    }
    
    public function updatePositionAction(RscSgg_Http_Request $request)
    {
        $response = $this->getErrorResponseData(
            $this->translate('Failed to update position.')
        );
        $data = (array)$request->post->get('data');
    
        if ($this->getModel('position')->replacePosition($data)) {
            $response = $this->getSuccessResponseData(
                $this->translate('Position updated successfully!')
            );
        }
        $this->getModule('galleries')->cleanCache($data['scope_id']);
    
        return $this->response(RscSgg_Http_Response::AJAX, $response);
    }
}