public static function eagerLoadingPlaylistTags(&$result) { if (!$result) { return; } $playlistIds = array(); foreach ($result['rows'] as $k => $item) { $result['rows'][$k]['tags'] = array(); $playlistIds[$item['id']] = $k; } $idsAux = array_keys($playlistIds); $tags = PlaylistTag::tableAlias('pt')->whereIn('pt.playlist_id', $idsAux)->join('tag', 't.id = tag_id', 't')->selectExpr('pt.playlist_id', 'id')->select('t.name')->findMany(); foreach ($tags as $item) { $result['rows'][$playlistIds[$item->id]]['tags'][] = $item->name; } }
/** * Edit a playlist */ private function edit() { Base::requireLogged(); if (LOGGED !== $this->playlist->user_id) { Base::requireAdmin(); } // Set page title View::set('page_title', 'Edit playlist'); // Set playlist $playlist = $this->playlist->asArray(); $playlist['tracks'] = $this->playlist->tracks(); $tags = $this->playlist->tags(); if ($tags) { $playlist['tags'] = implode(', ', $tags); } View::set('playlist', $playlist); // Not submitted if (!isset($_POST['playlist']) && !isset($_POST['draft'])) { View::show('playlist/edit'); } /** * Add playlist title and playlist description */ if (!Validate::len($_POST['title'], 2, 64)) { $error = 'Playlist title must be between 2 and 64 chars'; } elseif (!Validate::len($_POST['description'], 0, 512)) { $error = 'Playlist description must be lesser than 512 chars'; } if ($error) { View::error('playlist/edit', $error); } // Raw HTML may enter the db but it's automatically // encoded at output by Mustache $this->playlist->title = $_POST['title']; $this->playlist->description = $_POST['description']; /** * Uploads cover image */ if (!empty($_FILES['cover']) && $_FILES['cover']['size'] > 0) { Base::uploadImage($_FILES['cover'], $cover, $error); if ($error) { View::error('playlist/edit', $error); } $this->playlist->cover = $cover; } /** * Inserts tags into database */ if (!empty($_POST['tags'])) { // Separates tags by commas $tags = strtolower($_POST['tags']); $tags = explode(',', $tags, 6); // Tag limit $tags = array_slice($tags, 0, 5); // Filter tags foreach ($tags as $k => &$tag) { if (!ADMIN && $tag === 'staff') { continue; } $tag = preg_replace('/[^a-z]+/', ' ', $tag); $tag = trim($tag, ' '); // Tag must have at least 2 chars // And it must be lesser than 32 chars if (!Validate::len($tag, 1, 32)) { unset($tags[$k]); } } if (!empty($tags)) { // Remove tags from PlaylistTag PlaylistTag::where('playlist_id', $this->playlist->id)->deleteMany(); // Insert tags $sql = str_repeat(',(?)', count($tags)); $sql[0] = ' '; Tag::rawExecute("INSERT IGNORE INTO tag(name) VALUES {$sql}", $tags); // Get inserted tags ids and point them to the new playlist $tags = Tag::select('id')->whereIn('name', $tags)->findMany(); foreach ($tags as $tag) { $link = PlaylistTag::create(); $link->playlist_id = $this->playlist->id; $link->tag_id = $tag->id; $link->save(); } } } // Published status $this->playlist->published = isset($_POST['playlist']); /** * Add tracks into db */ if (!isset($_POST['tracks'])) { $error = 'You can\'t publish without any tracks'; $this->playlist->published = 0; } else { if (is_array($_POST['tracks'])) { $max = Base::$g['playlist_max_tracks']; $min = Base::$g['playlist_min_tracks']; $tracks = $_POST['tracks']; if (!isset($tracks[$min - 1])) { $error = "You can't publish without at least {$min} tracks"; $this->playlist->published = 0; } elseif (isset($track[$max])) { $error = "You can't have more than {$max} tracks in a playlist"; $tracks = array_slice($tracks, 0, $max); } /** * Check for haxing */ foreach ($tracks as $k => &$item) { $item = Validate::int($item); if ($item === false) { unset($tracks[$k]); } } // Also get duration $row = Track::whereIn('id', $tracks)->selectExpr('COUNT(id)', 'count')->selectExpr('SUM(duration)', 'duration')->findOne(); if ($row->count != count(array_unique($tracks))) { View::error('playlist/edit', 'Massive error 2. Contact the admin'); } // Store duration in minutes $this->playlist->tracks_count = $row->count; $this->playlist->duration = $row->duration / 60; // Delete the ones already in PlaylistTrack::where('playlist_id', $this->playlist->id)->deleteMany(); // Add new ones foreach ($tracks as $track) { $table = PlaylistTrack::create(); $table->playlist_id = $this->playlist->id; $table->track_id = $track; $table->save(); } } else { View::error('playlist/edit', 'Massive error. Contact the admin'); } } /** * Update playlist in database */ $this->playlist->save(); $msg = $error ?: 'Playlist succesfully edited'; Base::redirect('/' . $this->playlist->id, $msg); }