Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F5977145
GroupElement.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
GroupElement.php
View Options
<?php
namespace
OOUI
;
/**
* Element containing a sequence of child elements.
*
* @abstract
*/
trait
GroupElement
{
/**
* List of items in the group as Elements.
*
* @var Element[]
*/
protected
$items
=
[];
/**
* @var Tag
*/
protected
$group
;
/**
* @param array $config Configuration options
*/
public
function
initializeGroupElement
(
array
$config
=
[]
)
{
// Properties
$this
->
group
=
$config
[
'group'
]
??
new
Tag
(
'div'
);
$this
->
registerConfigCallback
(
function
(
&
$config
)
{
$config
[
'items'
]
=
$this
->
items
;
}
);
}
/**
* Check if there are no items.
*
* @return bool Group is empty
*/
public
function
isEmpty
()
{
return
$this
->
items
===
[];
}
/**
* Get items.
*
* @return Element[] Items
*/
public
function
getItems
()
{
return
$this
->
items
;
}
/**
* @param mixed $data
* @return Element|null
*/
public
function
findItemFromData
(
$data
)
{
$items
=
$this
->
getItems
();
// TODO: Support non-string $data using a hash (e.g. json_encode)
foreach
(
$items
as
$item
)
{
if
(
$item
->
getData
()
===
$data
)
{
return
$item
;
}
}
return
null
;
}
/**
* Add items.
*
* Adding an existing item will move it.
*
* @param Element[] $items Items
* @param int|null $index Index to insert items at
* @return $this
*/
public
function
addItems
(
array
$items
,
$index
=
null
)
{
foreach
(
$items
as
$item
)
{
// Check if item exists then remove it first, effectively "moving" it
$currentIndex
=
array_search
(
$item
,
$this
->
items
,
true
);
if
(
$currentIndex
!==
false
)
{
$this
->
removeItems
(
[
$item
]
);
// Adjust index to compensate for removal
if
(
$currentIndex
<
$index
)
{
$index
--;
}
}
// Add the item
$item
->
setElementGroup
(
$this
);
}
if
(
$index
===
null
||
$index
<
0
||
$index
>=
count
(
$this
->
items
)
)
{
$this
->
items
=
array_merge
(
$this
->
items
,
$items
);
}
else
{
array_splice
(
$this
->
items
,
$index
,
0
,
$items
);
}
// Update actual target element contents to reflect our list
$this
->
group
->
clearContent
();
$this
->
group
->
appendContent
(
$this
->
items
);
return
$this
;
}
/**
* Remove items.
*
* @param Element[] $items Items to remove
* @return $this
*/
public
function
removeItems
(
$items
)
{
foreach
(
$items
as
$item
)
{
$index
=
array_search
(
$item
,
$this
->
items
,
true
);
if
(
$index
!==
false
)
{
$item
->
setElementGroup
(
null
);
array_splice
(
$this
->
items
,
$index
,
1
);
}
}
// Update actual target element contents to reflect our list
$this
->
group
->
clearContent
();
$this
->
group
->
appendContent
(
$this
->
items
);
return
$this
;
}
/**
* Clear all items.
*
* Items will be detached, not removed, so they can be used later.
*
* @return $this
*/
public
function
clearItems
()
{
foreach
(
$this
->
items
as
$item
)
{
$item
->
setElementGroup
(
null
);
}
$this
->
items
=
[];
$this
->
group
->
clearContent
();
return
$this
;
}
/**
* @param callable $func
*/
abstract
public
function
registerConfigCallback
(
callable
$func
);
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Oct 3, 19:42 (2 d, 21 h ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
57/4e/0b4b6005bf19265e1db8d60bb908
Default Alt Text
GroupElement.php (2 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment