Files
IPB/system/Helpers/Menu/Link.php
T
2025-12-19 17:12:27 -08:00

132 lines
3.0 KiB
PHP

<?php
namespace IPS\Helpers\Menu;
use IPS\Http\Url;
use IPS\Member;
use IPS\Theme;
class Link extends MenuItem
{
/**
* Target
*
* @var Url|string
*/
public Url|string $url = '';
public string $extraHtml = '';
public string $identifier = '';
public string $notificationIcon = '';
public array $dataAttributes = [];
public array $wrapperDataAttributes = [];
public ?string $id = null;
public ?string $css = null;
/**
* Add an attribute to the link
*
* @param string $key
* @param string $value
* @return $this
*/
public function addAttribute( string $key, string $value = '' ): self
{
$this->dataAttributes[ $key ] = $value;
return $this;
}
/**
* Adds all necessary attributes for a confirmation box
* @param string|null $desc
* @return $this
*/
public function requiresConfirm( ?string $desc=null ): self
{
$this->addAttribute( 'data-confirm');
if( $desc !== null )
{
$this->addAttribute( 'data_confirmSubmessage', Member::loggedIn()->language()->addToStack( $desc ) );
}
return $this;
}
/**
* Adds all necessary attributes for a dialog
*
* @param string|NULL $title
* @param string $size
* @param bool $destruct
* @param string|NULL $contentSelector
* @param bool $remoteSubmit
* @return $this
*/
public function opensDialog( string $title = NULL, string $size = 'medium', bool $destruct = FALSE, string $contentSelector = NULL, bool $remoteSubmit = FALSE ): self
{
$this->addAttribute( 'data-ipsDialog')
->addAttribute( 'data-ipsDialog-size', $size )
->addAttribute( 'data-ipsDialog-title', Member::loggedIn()->language()->addToStack( $title ?? $this->title ) );
if( $contentSelector )
{
$this->addAttribute( 'data-ipsDialog-content', $contentSelector );
}
if( $destruct )
{
$this->addAttribute( 'data-ipsDialog-destructOnClose', 'true' );
}
if( $remoteSubmit )
{
$this->addAttribute( 'data-ipsDialog-remoteSubmit', 'true' );
}
return $this;
}
/**
* @param Url|string $url
* @param string $languageString
* @param string $css
* @param array $dataAttributes
* @param bool $opensDialog
* @param string|null $icon
* @param string|NULL $id
* @param string $identifier
*/
public function __construct( Url|string $url, string $languageString, string $css ='ipsMenu_item', array $dataAttributes = [], bool $opensDialog = FALSE, ?string $icon = NULL, string $id = NULL, string $identifier = '' )
{
$this->url = $url;
$this->title = $languageString;
$this->css = $css;
$this->dataAttributes = $dataAttributes;
$this->icon = $icon;
$this->menuItem = $identifier ?: $languageString;
if( !$id )
{
$id = 'menuLink_' . md5($languageString ) . '_' . $this->identifier;
}
$this->id = $id;
if( $opensDialog )
{
$this->opensDialog();
}
$this->addAttribute( 'data-menuItem', $languageString);
}
/**
* Return the parsed element
*
* @return string
*/
function __toString(): string
{
return Theme::i()->getTemplate( 'menu', 'core', 'front' )->row( $this );
}
}