Files
IPB/applications/core/modules/admin/developer/acpsearch.php
T
2025-12-19 16:27:35 -08:00

206 lines
5.6 KiB
PHP

<?php
/**
* @brief acpsearch
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @since 05 Feb 2024
*/
namespace IPS\core\modules\admin\developer;
use IPS\Developer\Controller;
use IPS\Helpers\Form;
use IPS\Helpers\Form\Select;
use IPS\Helpers\Form\Text;
use IPS\Helpers\Table\Custom;
use IPS\Http\Url;
use IPS\Member;
use IPS\Output;
use IPS\Request;
use function defined;
use const IPS\ROOT_PATH;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* acpsearch
*/
class acpsearch extends Controller
{
/**
* @var bool
*/
public static bool $csrfProtected = true;
/**
* ...
*
* @return void
*/
protected function manage() : void
{
$json = $this->_getJson( ROOT_PATH . "/applications/{$this->application->directory}/data/acpsearch.json" );
$data = array();
foreach( $json as $k => $v )
{
$data[ $k ] = array(
'controller' => $k,
'lang' => $v['lang_key'],
'keywords' => implode( ", ", $v['keywords'] ),
'restriction' => $v['restriction']
);
}
$table = new Custom( $data, $this->url );
$table->quickSearch = 'keywords';
$table->include = [ 'controller', 'keywords' ];
$table->langPrefix = 'dev_acpsearch_';
$table->parsers = [
'controller' => function( $val, $row )
{
parse_str( $row['controller'], $params );
if( ( isset( $params['app'] ) and isset( $params['module'] ) ) and ( !isset( $row['restriction'] ) or Member::loggedIn()->hasAcpRestriction( $params['app'], $params['module'], $row['restriction'] ) ) )
{
$title = "<a href='" . Url::internal( $row['controller'] ) . "' target='_blank'>" . Member::loggedIn()->language()->addToStack( $row['lang'] ) . "</a>";
}
$title = Member::loggedIn()->language()->addToStack( $row['lang'] );
return $title . "<div class='i-font-size_-2 i-color_soft'>{$row['controller']}</div>";
}
];
$table->rootButtons = array(
'add' => array(
'icon' => 'plus',
'title' => 'add',
'link' => $this->url->setQueryString( 'do', 'form' ),
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => Member::loggedIn()->language()->addToStack('add') )
)
);
$url = $this->url;
$table->rowButtons = function( $row ) use ( $url )
{
return array(
'view' => array(
'icon' => 'search',
'title' => 'view',
'link' => Url::internal( $row['controller'] ),
'target' => '_blank'
),
'edit' => array(
'icon' => 'pencil',
'title' => 'edit',
'link' => $url->setQueryString( array( 'do' => 'form', 'key' => urlencode( $row['controller'] ) ) ),
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => Member::loggedIn()->language()->addToStack('edit') )
),
'delete' => array(
'icon' => 'times-circle',
'title' => 'delete',
'link' => $url->setQueryString( array( 'do' => 'delete', 'key' => urlencode( $row['controller'] ) ) )->csrf(),
'data' => array( 'confirm' => '' )
)
);
};
Output::i()->output = (string) $table;
}
/**
* @return void
*/
protected function form() : void
{
$jsonFile = ROOT_PATH . "/applications/{$this->application->directory}/data/acpsearch.json";
$json = $this->_getJson( $jsonFile );
$controller = isset( Request::i()->key ) ? urldecode( Request::i()->key ) : null;
$row = ( $controller !== null and isset( $json[ $controller ] ) ) ? $json[ $controller ] : array();
$restrictions = array( '' => 'no_restriction' );
foreach( $this->application->modules( 'admin' ) as $module )
{
$moduleKey = 'menu__' . $this->application->directory . '_' . $module->key;
$moduleRestrictions = array();
foreach( $this->_getRestrictions( $module ) as $group => $r )
{
foreach( $r as $k => $v )
{
$moduleRestrictions[ $k ] = $v;
}
}
if( count( $moduleRestrictions ) )
{
$restrictions[ $moduleKey ] = $moduleRestrictions;
}
}
$form = new Form;
$form->add( new Text( 'dev_acpsearch_controller', $controller, true ) );
$form->add( new Text( 'dev_acpsearch_lang', $row['lang_key'] ?? null, true ) );
$form->add( new Select( 'dev_acpsearch_restriction', $row['restriction'] ?? null, false, array(
'options' => $restrictions
) ) );
$form->add( new Form\Stack( 'dev_acpsearch_keywords', $row['keywords'] ?? null, true ) );
if( $values = $form->values() )
{
$keywordData = [
'lang_key' => $values['dev_acpsearch_lang'],
'restriction' => $values['dev_acpsearch_restriction'] ?? null,
'keywords' => $values['dev_acpsearch_keywords']
];
if( $controller == $values['dev_acpsearch_controller'] )
{
$json[ $controller ] = $keywordData;
}
else
{
$json[ $values['dev_acpsearch_controller'] ] = $keywordData;
if( isset( $json[ $controller ] ) )
{
unset( $json[ $controller ] );
}
}
$this->_writeJson( $jsonFile, $json );
Output::i()->redirect( $this->url );
}
Output::i()->output = (string) $form;
}
/**
* @return void
*/
protected function delete() : void
{
Request::i()->confirmedDelete();
$jsonFile = ROOT_PATH . "/applications/{$this->application->directory}/data/acpsearch.json";
$json = $this->_getJson( $jsonFile );
$controller = isset( Request::i()->key ) ? urldecode( Request::i()->key ) : null;
if( isset( $json[ $controller ] ) )
{
unset( $json[ $controller ] );
}
$this->_writeJson( $jsonFile, $json );
Output::i()->redirect( $this->url );
}
}