dynamic/silverstripe-locator-frontend-react

View on GitHub
src/Extensions/LocationExtension.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Dynamic\Locator\React\Extensions;

use Dynamic\Locator\Location;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldSortableHeader;
use SilverStripe\ORM\DataExtension;
use Symbiote\GridFieldExtensions\GridFieldOrderableRows;
use Symbiote\GridFieldExtensions\GridFieldTitleHeader;

/**
 * Class LocationExtension
 * @package Dynamic\Locator\React\Extensions
 *
 * @property int MarkerIconImageID
 * @method Image MarkerIconImage()
 *
 * @property-read Location|LocationExtension $owner
 */
class LocationExtension extends DataExtension
{

    /**
     * @var array
     */
    private static $has_one = [
        'MarkerIconImage' => Image::class,
    ];

    /**
     * @var array
     */
    private static $owns = [
        'MarkerIconImage',
    ];

    /**
     * @var array
     */
    private static $many_many_extraFields = [
        'Categories' => [
            'Sort' => 'Int',
        ],
    ];

    /**
     * @param FieldList $fields
     */
    public function updateCMSFields(FieldList $fields)
    {
        parent::updateCMSFields($fields);

        if ($this->owner->ID) {

            /** @var GridField $categoryField */
            $categoryField = $fields->dataFieldByName('Categories');
            $categoryField->getConfig()->removeComponentsByType([
                GridFieldSortableHeader::class,
            ])->addComponents([
                new GridFieldOrderableRows(),
                new GridFieldTitleHeader(),
            ]);
        }
    }

    /**
     * @return Image|string
     */
    public function getMarkerIcon()
    {
        if ($this->owner->MarkerIconImageID) {
            return $this->owner->MarkerIconImage()->getURL();
        }

        if ($this->owner->Categories()->count()) {
            $icon = $this->owner->Categories()->sort('Sort')->first()->MarkerIconImage();
            return $icon->getURL();
        }

        $imageURL = '';
        $this->owner->extend('updateMarkerIconURL', $imageURL);
        return $imageURL;
    }

    /**
     * @return array
     */
    public function getCategoryData($json = true)
    {
        if ($this->owner->Categories()->count()) {
            $names = $this->owner->Categories()->map('ID', 'Name')->toArray();
            return $json ? json_encode($names) : $names;
        }
        return $json ? json_encode([]) : [];
    }
}