Server : Apache System : Linux 145.162.205.92.host.secureserver.net 5.14.0-611.45.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Apr 1 05:56:53 EDT 2026 x86_64 User : tradze ( 1001) PHP Version : 8.1.34 Disable Function : NONE Directory : /home/tradze/public_html/test.tradze.com/Backup25feb2025/vendor/caffeinated/menus/src/ |
<?php
namespace Caffeinated\Menus;
use Illuminate\Support\Facades\Request;
class Item
{
/**
* @var \Caffeinated\Menus\Builder
*/
protected $builder;
/**
* @var int
*/
public $id;
/**
* @var string
*/
public $title;
/**
* @var string
*/
public $slug;
/**
* @var array
*/
public $divider = array();
/**
* @var int
*/
public $parent;
/**
* @var array
*/
protected $data = array();
/**
* @var array
*/
public $attributes = array();
/**
* Constructor.
*
* @param \Caffeinated\Menus\Builder $builder
* @param int $id
* @param string $title
* @param array|string $options
*/
public function __construct($builder, $id, $title, $options)
{
$this->builder = $builder;
$this->id = $id;
$this->title = $title;
$this->slug = camel_case(str_slug($title, ' '));
$this->attributes = $this->builder->extractAttributes($options);
$this->parent = (is_array($options) and isset($options['parent'])) ? $options['parent'] : null;
$this->configureLink($options);
}
public function builder()
{
return $this->builder;
}
/**
* Configures the link for the menu item.
*
* @param array|string $options
* @return null
*/
public function configureLink($options)
{
if (! is_array($options)) {
$path = ['url' => $options];
} elseif (isset($options['raw']) and $options['raw'] == true) {
$path = null;
} else {
$path = array_only($options, ['url', 'route', 'action', 'secure']);
}
if (! is_null($path)) {
$path['prefix'] = $this->builder->getLastGroupPrefix();
}
$this->link = isset($path) ? new Link($path) : null;
$this->checkActiveStatus();
}
/**
* Adds a sub item to the menu.
*
* @param string $title
* @param array|string $options
* @return \Caffeinated\Menus\Item
*/
public function add($title, $options = '')
{
if (! is_array($options)) {
$url = $options;
$options = array();
$options['url'] = $url;
}
$options['parent'] = $this->id;
return $this->builder->add($title, $options);
}
/**
* Fetch the formatted attributes for the item in HTML.
*
* @return string
*/
public function attributes()
{
return $this->builder->attributes($this->attributes);
}
/**
* Get all attributes.
*
* @return array
*/
public function getAttributes()
{
return $this->attributes;
}
/**
* Assign or fetch the desired attribute.
*
* @param array|string $attribute
* @param string $value
* @return mixed
*/
public function attribute($attribute, $value = null)
{
if (isset($attribute) and is_array($attribute)) {
if (array_key_exists('class', $attribute)) {
$this->attributes['class'] = $this->builder->formatGroupClass(['class' => $attribute['class']], $this->attributes);
unset ($attribute['class']);
}
$this->attributes = array_merge($this->attributes, $attribute);
return $this;
} elseif (isset($attribute) and isset($value)) {
if ($attribute == 'class') {
$this->attributes['class'] = $this->builder->formatGroupClass(['class' => $value], $this->attributes);
} else {
$this->attributes[$attribute] = $value;
}
return $this;
}
return isset($this->attributes[$attribute]) ? $this->attributes[$attribute] : null;
}
/**
* Generates a valid URL for the menu item.
*
* @return string
*/
public function url()
{
if (! is_null($this->link)) {
if ($this->link->href) {
return $this->link->href;
}
return $this->builder->dispatch($this->link->path);
}
}
/**
* Prepends HTML to the item.
*
* @param string $html
* @return \Caffeinated\Menus\Item
*/
public function prepend($html)
{
$this->title = $html.' '.$this->title;
return $this;
}
/**
* Appends HTML to the item.
*
* @param string $html
* @return \Caffeinated\Menus\Item
*/
public function append($html)
{
$this->title = $this->title.' '.$html;
return $this;
}
/**
* Appends the specified icon to the item.
*
* @param string $icon
* @param string $type Can be either "fontawesome" or "glyphicon"
* @return \Caffeinated\Menus\Item
*/
public function icon($icon, $type = 'fontawesome')
{
switch ($type) {
case 'fontawesome':
$html = '<i class="fa fa-'.$icon.' fa-fw"></i>';
break;
case 'glyphicon':
$html = '<span class="glyphicon glyphicon-'.$icon.'" aria-hidden="true"></span>';
break;
case 'entypo':
$html = '<i class="entypo-'.$icon.'"></i>';
break;
default:
$html = '<i class="'.$icon.'"></i>';
break;
}
return $this->data('icon', $html);
}
/**
* Return the title with the icon prepended automatically.
*
* @return string
*/
public function prependIcon()
{
return $this->prepend($this->data('icon'));
}
/**
* Return the title with the icon appended automatically.
*
* @return string
*/
public function appendIcon()
{
return $this->append($this->data('icon'));
}
/**
* Insert a divider after the item.
*
* @param array $attributes
* @return void
*/
public function divide($attributes = array())
{
$attributes['class'] = $this->builder->formatGroupClass($attributes, ['class' => 'divider']);
$this->divider = $attributes;
return $this;
}
/**
* Determines if the menu item has children.
*
* @return bool
*/
public function hasChildren()
{
return count($this->builder->whereParent($this->id)) or false;
}
/**
* Returns all children underneath the menu item.
*
* @return \Caffeinated\Menus\Collection
*/
public function children()
{
return $this->builder->whereParent($this->id);
}
/**
* Set or get an item's metadata.
*
* @param mixed
* @return string|\Caffeinated\Menus\Item
*/
public function data()
{
$args = func_get_args();
if (isset($args[0]) and is_array($args[0])) {
$this->data = array_merge($this->data, array_change_key_case($args[0]));
return $this;
} elseif (isset($args[0]) and isset($args[1])) {
$this->data[strtolower($args[0])] = $args[1];
return $this;
} elseif (isset($args[0])) {
return isset($this->data[$args[0]]) ? $this->data[$args[0]] : null;
}
return $this->data;
}
/**
* Decide if the item should be active.
*
* @return null
*/
public function checkActiveStatus()
{
$path = ltrim(parse_url($this->url(), PHP_URL_PATH), '/');
$requestPath = Request::path();
if ($this->builder->config['rest_base']) {
$base = (is_array($this->builder->config['rest_base'])) ? implode('|', $this->builder->config['rest_base']) : $this->builder->conf['rest_base'];
list($path, $requestPath) = preg_replace('@^('.$base.')/@', '', [$path, $requestPath], 1);
}
if ($this->url() == Request::url() || $this->url() == \URL::secure(Request::path())) {
$this->activate();
}
}
public function activate(Item $item = null)
{
$item = (is_null($item)) ? $this : $item;
$item->active();
$item->data('active', true);
if ($item->parent) {
$parent = $this->builder->whereId($item->parent)->first();
$parent->attributes['class'] = $parent->builder->formatGroupClass(['class' => 'opened'], $parent->attributes);
$this->activate($parent);
}
}
public function active($pattern = null)
{
if (! is_null($pattern)) {
$pattern = ltrim(preg_replace('/\/\*/', '(/.*)?', $pattern), '/');
if (preg_match("@{$pattern}\z@", Request::path())) {
$this->activate();
}
return $this;
}
$this->attributes['class'] = $this->builder->formatGroupClass(['class' => 'active'], $this->attributes);
return $this;
}
/**
* Returns bool value if item is active or not.
*
* @return bool
*/
public function isActive()
{
return $this->data('active');
}
public function can($permissions)
{
return $this->data('can', $permissions);
}
public function canAtLeast($permissions)
{
return $this->data('canatleast', $permissions);
}
/**
* Return either a property or attribute item value.
*
* @param string $property
* @return string
*/
public function __get($property)
{
if (property_exists($this, $property)) {
return $this->$property;
}
return $this->data($property);
}
}