85ddc2608297423ef32210a2341e4c2600553200
[yaffs-website] / web / core / modules / search / src / Entity / SearchPage.php
1 <?php
2
3 namespace Drupal\search\Entity;
4
5 use Drupal\Core\Config\Entity\ConfigEntityBase;
6 use Drupal\Core\Config\Entity\ConfigEntityInterface;
7 use Drupal\Core\Entity\EntityStorageInterface;
8 use Drupal\Core\Entity\EntityWithPluginCollectionInterface;
9 use Drupal\search\Plugin\SearchIndexingInterface;
10 use Drupal\search\Plugin\SearchPluginCollection;
11 use Drupal\search\SearchPageInterface;
12
13 /**
14  * Defines a configured search page.
15  *
16  * @ConfigEntityType(
17  *   id = "search_page",
18  *   label = @Translation("Search page"),
19  *   handlers = {
20  *     "access" = "Drupal\search\SearchPageAccessControlHandler",
21  *     "list_builder" = "Drupal\search\SearchPageListBuilder",
22  *     "form" = {
23  *       "add" = "Drupal\search\Form\SearchPageAddForm",
24  *       "edit" = "Drupal\search\Form\SearchPageEditForm",
25  *       "delete" = "Drupal\Core\Entity\EntityDeleteForm"
26  *     }
27  *   },
28  *   admin_permission = "administer search",
29  *   links = {
30  *     "edit-form" = "/admin/config/search/pages/manage/{search_page}",
31  *     "delete-form" = "/admin/config/search/pages/manage/{search_page}/delete",
32  *     "enable" = "/admin/config/search/pages/manage/{search_page}/enable",
33  *     "disable" = "/admin/config/search/pages/manage/{search_page}/disable",
34  *     "set-default" = "/admin/config/search/pages/manage/{search_page}/set-default",
35  *     "collection" = "/admin/config/search/pages",
36  *   },
37  *   config_prefix = "page",
38  *   entity_keys = {
39  *     "id" = "id",
40  *     "label" = "label",
41  *     "weight" = "weight",
42  *     "status" = "status"
43  *   },
44  *   config_export = {
45  *     "id",
46  *     "label",
47  *     "path",
48  *     "weight",
49  *     "plugin",
50  *     "configuration",
51  *   }
52  * )
53  */
54 class SearchPage extends ConfigEntityBase implements SearchPageInterface, EntityWithPluginCollectionInterface {
55
56   /**
57    * The name (plugin ID) of the search page entity.
58    *
59    * @var string
60    */
61   protected $id;
62
63   /**
64    * The label of the search page entity.
65    *
66    * @var string
67    */
68   protected $label;
69
70   /**
71    * The configuration of the search page entity.
72    *
73    * @var array
74    */
75   protected $configuration = [];
76
77   /**
78    * The search plugin ID.
79    *
80    * @var string
81    */
82   protected $plugin;
83
84   /**
85    * The path this search page will appear upon.
86    *
87    * This value is appended to 'search/' when building the path.
88    *
89    * @var string
90    */
91   protected $path;
92
93   /**
94    * The weight of the search page.
95    *
96    * @var int
97    */
98   protected $weight;
99
100   /**
101    * The plugin collection that stores search plugins.
102    *
103    * @var \Drupal\search\Plugin\SearchPluginCollection
104    */
105   protected $pluginCollection;
106
107   /**
108    * {@inheritdoc}
109    */
110   public function getPlugin() {
111     return $this->getPluginCollection()->get($this->plugin);
112   }
113
114   /**
115    * Encapsulates the creation of the search page's LazyPluginCollection.
116    *
117    * @return \Drupal\Component\Plugin\LazyPluginCollection
118    *   The search page's plugin collection.
119    */
120   protected function getPluginCollection() {
121     if (!$this->pluginCollection) {
122       $this->pluginCollection = new SearchPluginCollection($this->searchPluginManager(), $this->plugin, $this->configuration, $this->id());
123     }
124     return $this->pluginCollection;
125   }
126
127   /**
128    * {@inheritdoc}
129    */
130   public function getPluginCollections() {
131     return ['configuration' => $this->getPluginCollection()];
132   }
133
134   /**
135    * {@inheritdoc}
136    */
137   public function setPlugin($plugin_id) {
138     $this->plugin = $plugin_id;
139     $this->getPluginCollection()->addInstanceID($plugin_id);
140   }
141
142   /**
143    * {@inheritdoc}
144    */
145   public function isIndexable() {
146     return $this->status() && $this->getPlugin() instanceof SearchIndexingInterface;
147   }
148
149   /**
150    * {@inheritdoc}
151    */
152   public function isDefaultSearch() {
153     return $this->searchPageRepository()->getDefaultSearchPage() == $this->id();
154   }
155
156   /**
157    * {@inheritdoc}
158    */
159   public function getPath() {
160     return $this->path;
161   }
162
163   /**
164    * {@inheritdoc}
165    */
166   public function getWeight() {
167     return $this->weight;
168   }
169
170   /**
171    * {@inheritdoc}
172    */
173   public function postCreate(EntityStorageInterface $storage) {
174     parent::postCreate($storage);
175
176     // @todo Use self::applyDefaultValue() once
177     //   https://www.drupal.org/node/2004756 is in.
178     if (!isset($this->weight)) {
179       $this->weight = $this->isDefaultSearch() ? -10 : 0;
180     }
181   }
182
183   /**
184    * {@inheritdoc}
185    */
186   public function postSave(EntityStorageInterface $storage, $update = TRUE) {
187     parent::postSave($storage, $update);
188     $this->routeBuilder()->setRebuildNeeded();
189   }
190
191   /**
192    * {@inheritdoc}
193    */
194   public static function postDelete(EntityStorageInterface $storage, array $entities) {
195     parent::postDelete($storage, $entities);
196
197     $search_page_repository = \Drupal::service('search.search_page_repository');
198     if (!$search_page_repository->isSearchActive()) {
199       $search_page_repository->clearDefaultSearchPage();
200     }
201   }
202
203   /**
204    * {@inheritdoc}
205    */
206   public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
207     /** @var $a \Drupal\search\SearchPageInterface */
208     /** @var $b \Drupal\search\SearchPageInterface */
209     $a_status = (int) $a->status();
210     $b_status = (int) $b->status();
211     if ($a_status != $b_status) {
212       return ($a_status > $b_status) ? -1 : 1;
213     }
214     return parent::sort($a, $b);
215   }
216
217   /**
218    * Wraps the route builder.
219    *
220    * @return \Drupal\Core\Routing\RouteBuilderInterface
221    *   An object for state storage.
222    */
223   protected function routeBuilder() {
224     return \Drupal::service('router.builder');
225   }
226
227   /**
228    * Wraps the config factory.
229    *
230    * @return \Drupal\Core\Config\ConfigFactoryInterface
231    *   A config factory object.
232    */
233   protected function configFactory() {
234     return \Drupal::service('config.factory');
235   }
236
237   /**
238    * Wraps the search page repository.
239    *
240    * @return \Drupal\search\SearchPageRepositoryInterface
241    *   A search page repository object.
242    */
243   protected function searchPageRepository() {
244     return \Drupal::service('search.search_page_repository');
245   }
246
247   /**
248    * Wraps the search plugin manager.
249    *
250    * @return \Drupal\Component\Plugin\PluginManagerInterface
251    *   A search plugin manager object.
252    */
253   protected function searchPluginManager() {
254     return \Drupal::service('plugin.manager.search');
255   }
256
257 }