ListScreenAdmin.php
74 lines
| 1 | <?php |
| 2 | |
| 3 | namespace AC\Controller\Middleware; |
| 4 | |
| 5 | use AC\Admin\Preference; |
| 6 | use AC\ListScreenRepository\Storage; |
| 7 | use AC\ListScreenTypes; |
| 8 | use AC\Middleware; |
| 9 | use AC\Request; |
| 10 | use AC\Type\ListScreenId; |
| 11 | |
| 12 | class ListScreenAdmin implements Middleware { |
| 13 | |
| 14 | const PARAM_LIST_ID = 'list_id'; |
| 15 | const PARAM_LIST_KEY = 'list_key'; |
| 16 | |
| 17 | /** @var Storage */ |
| 18 | private $storage; |
| 19 | |
| 20 | /** @var Preference\ListScreen */ |
| 21 | private $preference; |
| 22 | |
| 23 | /** @var bool */ |
| 24 | private $is_network; |
| 25 | |
| 26 | public function __construct( Storage $storage, Preference\ListScreen $preference, $is_network = false ) { |
| 27 | $this->storage = $storage; |
| 28 | $this->preference = $preference; |
| 29 | $this->is_network = (bool) $is_network; |
| 30 | } |
| 31 | |
| 32 | public function handle( Request $request ) { |
| 33 | $list_key = $request->get( 'list_screen' ); |
| 34 | |
| 35 | if ( ! $list_key ) { |
| 36 | $list_key = $this->preference->get_last_visited_list_key(); |
| 37 | } |
| 38 | |
| 39 | if ( ! $list_key || ! ListScreenTypes::instance()->get_list_screen_by_key( $list_key, $this->is_network ) ) { |
| 40 | $args = $this->is_network |
| 41 | ? [ 'network_only' => true ] |
| 42 | : [ 'site_only' => true ]; |
| 43 | |
| 44 | $list_key = current( ListScreenTypes::instance()->get_list_screens( $args ) )->get_key(); |
| 45 | } |
| 46 | |
| 47 | if ( ! $list_key ) { |
| 48 | return; |
| 49 | } |
| 50 | |
| 51 | $list_id = $request->get( 'layout_id' ); |
| 52 | |
| 53 | if ( ! ListScreenId::is_valid_id( $list_id ) ) { |
| 54 | $list_id = $this->preference->get_list_id( $list_key ); |
| 55 | } |
| 56 | |
| 57 | if ( ! ListScreenId::is_valid_id( $list_id ) || ! $this->storage->exists( new ListScreenId( $list_id ) ) ) { |
| 58 | |
| 59 | $list_screens = $this->storage->find_all( [ |
| 60 | Storage::KEY => $list_key, |
| 61 | ] ); |
| 62 | |
| 63 | $list_id = $list_screens->count() > 0 |
| 64 | ? $list_screens->get_first()->get_id()->get_id() |
| 65 | : null; |
| 66 | } |
| 67 | |
| 68 | $request->get_parameters()->merge( [ |
| 69 | self::PARAM_LIST_ID => $list_id, |
| 70 | self::PARAM_LIST_KEY => $list_key, |
| 71 | ] ); |
| 72 | } |
| 73 | |
| 74 | } |