# Mesch URL Director - mesch_url_director # Logs 404 - Page Not Found Events and allows you to permaently redirect future Requests to another Site. Can also be used to manually create redirects for example as short URLs. ## Features - Logging of 404 Page not found events - Permanent redirect requests - Creating custom redirect - Bulk-Processing of 404 events ## Installation Install package with composer. ```JSON { "require": { "mesch/mesch_url_director": "3.0.0" } } ``` ## Requirements ```Javascript import {Marked} from "marked"; import {markedHighlight} from "marked-highlight"; import hljs from 'highlight.js'; import 'highlight.js/styles/a11y-dark.css'; document.addEventListener('DOMContentLoaded', () => { const marked = new Marked( markedHighlight({ emptyLangClass: 'hljs', langPrefix: 'hljs language-', highlight(code, lang, info) { const language = hljs.getLanguage(lang) ? lang : 'plaintext'; return hljs.highlight(code, {language}).value; } }) ); const contentList = document.querySelectorAll('.readme-content-test'); contentList.forEach(element => { element.innerHTML = marked.parse(element.textContent); }); }); ``` ### 3.0.0 - ConcreteCMS: `>= 8.5` - PHP: `>= 7.3.22` - mesch/mesch_devtools: `^1.4` - composer/installers: `^1` ### 2.97.0 - ConcreteCMS: `>= 5.7.4` - PHP: `>= 5.3.3` - composer/installers: `^1` ## Authors - [Mesch Web Consulting & Design – Digitalagentur Luzern](https://www.mesch.ch/)
<?php

namespace Concrete\Package\XwTimeline;

use Concrete\Core\Database\EntityManager\Provider\ProviderInterface;
use Concrete\Core\Entity\Package;
use Concrete\Core\Package\Package as PackageController;
use Xanweb\Timeline\Module\Module;
use Xanweb\TmlModule\Installer;
use Xanweb\TmlModule\Uninstaller;

class Controller extends PackageController implements ProviderInterface
{
    protected $pkgHandle = 'xw_timeline';
    protected $appVersionRequired = '9.0.0';
    protected $pkgVersion = '2.0';

    public function getPackageDescription(): string
    {
        return t('Dynamic, responsive package displays items in a horizontal slider.');
    }

    public function getPackageName(): string
    {
        return t('Timeline');
    }

    public function on_start()
    {
        Module::boot();
    }

    public function validate_install()
    {
        if (PHP_VERSION_ID < 70400) {
            return $this->app['error']->addError(t('This package requires PHP version %s or greater.', '7.4.0'));
        }
    }

    public function install()
    {
        $pkg = parent::install();

        $this->installComponents($pkg);

        return $pkg;
    }

    public function upgrade()
    {
        parent::upgrade();

        $this->installComponents($this->getPackageEntity());
    }

    public function uninstall()
    {
        parent::uninstall();

        Uninstaller::dropTables('btXwTimelineSlider', 'btXwTimelineSliderEntries');
    }

    /**
     * {@inheritdoc}
     */
    public function getDrivers(): array
    {
        return [];
    }

    /**
     * {@inheritdoc}
     */
    public function getPackageAutoloaderRegistries(): array
    {
        return [
            'src/Xanweb/Timeline' => 'Xanweb\Timeline',
            'vendor/xanweb/tml_module' => 'Xanweb\TmlModule',
            'vendor/xanweb/tml_block' => 'Xanweb\TmlBlock',
            'vendor/xanweb/tml_common' => 'Xanweb\TmlCommon',
            'vendor/xanweb/tml_request' => 'Xanweb\TmlRequest',
            'vendor/xanweb/tml_html_helpers/src' => 'Xanweb\TmlHtmlHelper',
            'vendor/xanweb/tml_js_localization' => 'Xanweb\TmlJsLocalization',
            'vendor/xanweb/tml_v_item_list/src' => 'Xanweb\TmlVueItemList',
        ];
    }

    /**
     * Install or Update package components.
     */
    private function installComponents(Package $pkg): void
    {
        $installer = new Installer($pkg);
        $installer->installBlockType('xw_timeline_slider', 'multimedia');
    }
}
<?php

namespace Concrete\Package\ConcreteContentbox;

defined('C5_EXECUTE') or die(_("Access Denied."));

use Concrete\Core\Block\BlockType\BlockType;
use Concrete\Core\Block\BlockType\Set as BlockTypeSet;
use Concrete\Core\Http\Request;
use Concrete\Core\Package\Package as PackageInstaller;
use Concrete\Core\Support\Facade\Application;
use Doctrine\ORM\EntityManagerInterface;

class Controller extends PackageInstaller
{
	protected $pkgHandle = 'concrete_contentbox';
	protected $appVersionRequired = '9.2.0';
	protected $pkgVersion = '1.0.0';

	public function getPackageName()
	{
		return tc('concrete-contentbox', 'ConcreteCMS Contentbox');
	}

	public function getPackageDescription()
	{
		return tc('concrete-contentbox', 'Add image, text and button with only one block.');
	}

	public function install()
	{
		$pkg = parent::install();

        $bt = BlockType::getByHandle('concrete_contentbox');
        
        if (!is_object($bt)) {
            $bt = BlockType::installBlockType('concrete_contentbox', $pkg);
        }

        $bts = BlockTypeSet::getByHandle('basic');
        
        if ($bts) {
            if (!$bts->contains($bt)) {
                $bts->addBlockType($bt);
            }
        }
	}

	public function uninstall()
	{
		parent::uninstall();

        $app = Application::getFacadeApplication();
        $request = $app->make(Request::class);

        if ($request->request->get('remove-db-tables')) {
            $db = $app->make(EntityManagerInterface::class)->getConnection();
            $db->executeQuery('DROP TABLE IF EXISTS btConcreteContentbox');
        }
	}
}
<?php namespace Concrete\Package\GrandGallery;

use Concrete\Core\Package\Package;
use Concrete\Core\Page\Single as SinglePage;
use Concrete\Core\Block\BlockType\BlockType;
use Concrete\Core\Backup\ContentImporter;

defined('C5_EXECUTE') or die('Access Denied.');

class Controller extends Package
{
    protected $pkgHandle = 'grand_gallery';
    protected $appVersionRequired = '9.0.0';
    protected $pkgVersion = '2.1.1';

    protected $pkgAutoloaderRegistries = [
        'src/GrandGallery' => 'GrandGallery',
        'src/JasonGrimes'  => 'JasonGrimes'
    ];

    public function getPackageName() {
        return t('Grand Gallery');
    }

    public function getPackageDescription() {
        return t('Easy-to-use Image Gallery based on selected Files, Folder or File Set.');
    }

    public function on_start() {

        $this->app->make('Concrete\Core\Routing\RouterInterface')->registerMultiple([

            'grand-gallery/edit-folder'   => ['Concrete\Package\GrandGallery\Controller\Ajax::editFolder'],
            'grand-gallery/delete-folder' => ['Concrete\Package\GrandGallery\Controller\Ajax::deleteFolder'],
            'grand-gallery/create-folder' => ['Concrete\Package\GrandGallery\Controller\Ajax::createFolder'],

            'grand-gallery/edit-fileset'   => ['Concrete\Package\GrandGallery\Controller\Ajax::editFileset'],
            'grand-gallery/delete-fileset' => ['Concrete\Package\GrandGallery\Controller\Ajax::deleteFileset'],
            'grand-gallery/create-fileset' => ['Concrete\Package\GrandGallery\Controller\Ajax::createFileset'],

            'grand-gallery/delete-file' => ['Concrete\Package\GrandGallery\Controller\Ajax::deleteFile'],

            'grand-gallery/display-thumbnails'        => ['Concrete\Package\GrandGallery\Controller\Ajax::displayThumbnails'],
            'grand-gallery/add-thumbnail-to-preview'  => ['Concrete\Package\GrandGallery\Controller\Ajax::addThumbnailToPreview'],
            'grand-gallery/add-thumbnails-to-preview' => ['Concrete\Package\GrandGallery\Controller\Ajax::addThumbnailsToPreview'],

            'grand-gallery/get-topic-list' => ['Concrete\Package\GrandGallery\Controller\Ajax::getTopicList'],

            'grand-gallery/get-image-tags'    => ['Concrete\Package\GrandGallery\Controller\Ajax::getImageTags'],
            'grand-gallery/update-image-tags' => ['Concrete\Package\GrandGallery\Controller\Ajax::updateImageTags'],

            'grand-gallery/localization/photo-swipe'    => ['Concrete\Package\GrandGallery\Controller\Localization::photoSwipe'],
            'grand-gallery/localization/magnific-popup' => ['Concrete\Package\GrandGallery\Controller\Localization::magnificPopup'],

            'grand-gallery/global-css-settings'             => ['Concrete\Package\GrandGallery\Controller\GlobalCssSettings::view'],
            'grand-gallery/global-css-settings/photo-swipe' => ['Concrete\Package\GrandGallery\Controller\GlobalCssSettings::photoSwipe'],

            'grand-gallery/global-js-settings/photo-swipe' => ['Concrete\Package\GrandGallery\Controller\GlobalJsSettings::photoSwipe']

        ]);

    }

    public function install() {

        $pkg = parent::install();

        // Install single pages
        $page = SinglePage::add('/dashboard/grand_gallery', $pkg);
        $page->updateCollectionName(t('Grand Gallery'));
        $page = SinglePage::add('/dashboard/grand_gallery/basic_settings', $pkg);
        $page->updateCollectionName(t('Basic Settings'));
        $page = SinglePage::add('/dashboard/grand_gallery/block_settings', $pkg);
        $page->updateCollectionName(t('Block Settings'));
        $page = SinglePage::add('/dashboard/grand_gallery/reset_global_settings', $pkg);
        $page->updateCollectionName(t('Reset Global Settings'));

        // Install blocks
        if ( ! is_object(BlockType::getByHandle('grand_gallery'))) {
            BlockType::installBlockType('grand_gallery', $pkg);
        }

        // Do things that need to be executed in fresh install or upgrade
        $this->installOrUpgrade();

    }

    public function uninstall() {

        parent::uninstall();

        $db = $this->app->make('database')->connection();

        // Delete package tables
        $db->executeQuery('DROP TABLE IF EXISTS btGrandGallery, btGrandGalleryImages');

        // Remove all config values
        $grandGallerySettings = $this->app->build('GrandGallery\Settings');
        $grandGallerySettings->removeAll();

    }

    public function upgrade() {

        parent::upgrade();

        $this->installOrUpgrade();

    }

    private function installOrUpgrade() {

        $pkg = \Concrete\Core\Support\Facade\Package::getByHandle('grand_gallery');

        // Set default global settings (initial settings + added in consecutive patches)
        $grandGallerySettings = $this->app->build('GrandGallery\Settings');
        $grandGallerySettings->setDefaultValues($pkg, false);

        // Install attribute "Gallery Tags" (1.1.0)
        $ci = new ContentImporter();
        $ci->importContentFile($pkg->getPackagePath() . '/config/install/base/attributes.xml');

    }

}