Issues (55)

src/Task/SlideLinkTask.php (1 issue)

Severity
1
<?php
2
3
namespace Dynamic\Flexslider\Task;
4
5
use Dynamic\FlexSlider\Model\SlideImage;
6
use Sheadawson\Linkable\Models\Link;
7
use SilverStripe\CMS\Model\SiteTree;
8
use SilverStripe\Dev\BuildTask;
9
use SilverStripe\ORM\DB;
10
11
/**
12
 * Class SlideLinkTask
13
 * @package Dynamic\Flexslider\Task
14
 */
15
class SlideLinkTask extends BuildTask
16
{
17
    /**
18
     * @var string
19
     */
20
    protected $title = 'Flexslider - Slide Link Migration Task';
21
22
    /**
23
     * @var string
24
     */
25
    private static $segment = 'slide-link-migration-task';
0 ignored issues
show
The private property $segment is not used, and could be removed.
Loading history...
26
27
    /**
28
     * @var array
29
     */
30
    private $known_links = [];
31
32
    /**
33
     * @param \SilverStripe\Control\HTTPRequest $request
34
     * @throws \SilverStripe\ORM\ValidationException
35
     */
36
    public function run($request)
37
    {
38
        $this->migrateLinks();
39
    }
40
41
    /**
42
     * @throws \SilverStripe\ORM\ValidationException
43
     */
44
    protected function migrateLinks()
45
    {
46
        $baseTable = SlideImage::singleton()->baseTable();
47
48
        $tables = [
49
            $baseTable,
50
            "{$baseTable}_Versions",
51
            "{$baseTable}_Live",
52
        ];
53
54
        foreach ($tables as $table) {
55
            foreach ($this->yieldSingle(DB::query("SELECT * FROM \"{$table}\"")) as $record) {
56
                $linkID = $record['PageLinkID'];
57
                $linkLabel = isset($record['LinkLabel']) ? $record['LinkLabel'] : null;
58
59
                $slideLink = $this->findOrMakeLink($linkID, $linkLabel);
60
61
                if ($slideLink !== false && $slideLink instanceof Link) {
62
                    DB::prepared_query(
63
                        "UPDATE \"{$table}\" SET \"SlideLinkID\" = ? WHERE \"ID\" = ?",
64
                        [$slideLink->ID, $record['ID']]
65
                    );
66
                }
67
            }
68
        }
69
    }
70
71
    /**
72
     * @param $list
73
     * @return \Generator
74
     */
75
    private function yieldSingle($list)
76
    {
77
        foreach ($list as $item) {
78
            yield $item;
79
        }
80
    }
81
82
    /**
83
     * @param int $linkID
84
     * @param string $linkLabel
85
     * @return bool|mixed|Link
86
     * @throws \SilverStripe\ORM\ValidationException
87
     */
88
    private function findOrMakeLink($linkID = 0, $linkLabel = '')
89
    {
90
        if (!$linkID || !($page = SiteTree::get()->byID($linkID))) {
91
            return false;
92
        }
93
94
        if (isset($this->getKnownLinks()[$linkID])) {
95
            return $this->getKnownLinks()[$linkID];
96
        }
97
98
        $link = Link::create();
99
        $link->Type = 'SiteTree';
100
        $link->SiteTreeID = $linkID;
101
        $link->Template = 'button';
102
103
        if ($linkLabel !== null && $linkLabel !== '') {
104
            $link->Title = $linkLabel;
105
        } else {
106
            $link->Title = $page->Title;
107
        }
108
109
        $link->write();
110
111
        $this->addKnownLink($linkID, $link);
112
113
        return $link;
114
    }
115
116
    /**
117
     * @param $linkID
118
     * @param $linkableLinkID
119
     * @return $this
120
     */
121
    private function addKnownLink($linkID, $linkableLinkID)
122
    {
123
        $this->known_links[$linkID] = $linkableLinkID;
124
125
        return $this;
126
    }
127
128
    /**
129
     * @return array
130
     */
131
    private function getKnownLinks()
132
    {
133
        return $this->known_links;
134
    }
135
}
136