2016-04-19 03:38:38 +00:00
< ? php
2021-12-03 03:01:39 +00:00
2022-02-16 04:08:28 +00:00
namespace Code\Module ;
2016-04-19 03:38:38 +00:00
2019-04-17 23:54:06 +00:00
use App ;
2022-02-16 04:08:28 +00:00
use Code\Access\AccessControl ;
use Code\Web\Controller ;
use Code\Lib\Libprofile ;
use Code\Lib\Channel ;
use Code\Lib\Libacl ;
use Code\Lib\Menu ;
2022-09-04 00:01:52 +00:00
use Code\Lib\MenuItem ;
2022-02-16 04:08:28 +00:00
use Code\Render\Theme ;
2022-02-12 20:43:29 +00:00
2016-04-19 03:38:38 +00:00
2021-12-02 23:02:31 +00:00
class Mitem extends Controller
{
public function init ()
{
if ( argc () > 1 && argv ( 1 ) === 'sys' && is_site_admin ()) {
2022-01-25 01:26:12 +00:00
$sys = Channel :: get_system ();
2021-12-02 23:02:31 +00:00
if ( $sys && intval ( $sys [ 'channel_id' ])) {
App :: $is_sys = true ;
}
}
2021-12-03 03:01:39 +00:00
if ( argc () > 1 ) {
2021-12-02 23:02:31 +00:00
$which = argv ( 1 );
2021-12-03 03:01:39 +00:00
} else {
2021-12-02 23:02:31 +00:00
return ;
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
Libprofile :: load ( $which );
2021-12-03 03:01:39 +00:00
if ( argc () < 3 ) {
2021-12-02 23:02:31 +00:00
return ;
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
2022-01-26 05:43:05 +00:00
$m = Menu :: fetch_id ( intval ( argv ( 2 )), App :: $profile [ 'channel_id' ]);
2021-12-02 23:02:31 +00:00
if ( ! $m ) {
notice ( t ( 'Menu not found.' ) . EOL );
return '' ;
}
App :: $data [ 'menu' ] = $m ;
}
public function post ()
{
if ( ! App :: $profile ) {
return ;
}
$which = argv ( 1 );
$uid = App :: $profile [ 'channel_id' ];
if ( array_key_exists ( 'sys' , $_REQUEST ) && $_REQUEST [ 'sys' ] && is_site_admin ()) {
2022-01-25 01:26:12 +00:00
$sys = Channel :: get_system ();
2021-12-02 23:02:31 +00:00
$uid = intval ( $sys [ 'channel_id' ]);
App :: $is_sys = true ;
}
2021-12-03 03:01:39 +00:00
if ( ! $uid ) {
2021-12-02 23:02:31 +00:00
return ;
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
2021-12-03 03:01:39 +00:00
if ( ! App :: $data [ 'menu' ]) {
2021-12-02 23:02:31 +00:00
return ;
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
if ( ! $_REQUEST [ 'mitem_desc' ] || ! $_REQUEST [ 'mitem_link' ]) {
notice ( t ( 'Unable to create element.' ) . EOL );
return ;
}
$_REQUEST [ 'mitem_channel_id' ] = $uid ;
$_REQUEST [ 'menu_id' ] = App :: $data [ 'menu' ][ 'menu_id' ];
$_REQUEST [ 'mitem_flags' ] = 0 ;
2021-12-03 03:01:39 +00:00
if ( $_REQUEST [ 'usezid' ]) {
2021-12-02 23:02:31 +00:00
$_REQUEST [ 'mitem_flags' ] |= MENU_ITEM_ZID ;
2021-12-03 03:01:39 +00:00
}
if ( $_REQUEST [ 'newwin' ]) {
2021-12-02 23:02:31 +00:00
$_REQUEST [ 'mitem_flags' ] |= MENU_ITEM_NEWWIN ;
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
$mitem_id = (( argc () > 3 ) ? intval ( argv ( 3 )) : 0 );
if ( $mitem_id ) {
$_REQUEST [ 'mitem_id' ] = $mitem_id ;
2022-01-26 05:43:05 +00:00
$r = MenuItem :: edit ( $_REQUEST [ 'menu_id' ], $uid , $_REQUEST );
2021-12-02 23:02:31 +00:00
if ( $r ) {
2022-01-26 05:43:05 +00:00
Menu :: sync_packet ( $uid , get_observer_hash (), $_REQUEST [ 'menu_id' ]);
2021-12-02 23:02:31 +00:00
//info( t('Menu element updated.') . EOL);
goaway ( z_root () . '/mitem/' . $which . '/' . $_REQUEST [ 'menu_id' ] . (( App :: $is_sys ) ? '?f=&sys=1' : '' ));
2021-12-03 03:01:39 +00:00
} else {
2021-12-02 23:02:31 +00:00
notice ( t ( 'Unable to update menu element.' ) . EOL );
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
} else {
2022-01-26 05:43:05 +00:00
$r = MenuItem :: add ( $_REQUEST [ 'menu_id' ], $uid , $_REQUEST );
2021-12-02 23:02:31 +00:00
if ( $r ) {
2022-01-26 05:43:05 +00:00
Menu :: sync_packet ( $uid , get_observer_hash (), $_REQUEST [ 'menu_id' ]);
2021-12-02 23:02:31 +00:00
//info( t('Menu element added.') . EOL);
if ( $_REQUEST [ 'submit' ]) {
goaway ( z_root () . '/menu/' . $which . (( App :: $is_sys ) ? '?f=&sys=1' : '' ));
}
if ( $_REQUEST [ 'submit-more' ]) {
goaway ( z_root () . '/mitem/' . $which . '/' . $_REQUEST [ 'menu_id' ] . '?f=&display=block' . (( App :: $is_sys ) ? '&sys=1' : '' ));
}
2021-12-03 03:01:39 +00:00
} else {
2021-12-02 23:02:31 +00:00
notice ( t ( 'Unable to add menu element.' ) . EOL );
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
}
}
public function get ()
{
$uid = local_channel ();
$owner = App :: $profile [ 'channel_id' ];
2022-01-25 01:26:12 +00:00
$channel = Channel :: from_id ( $owner );
2021-12-02 23:02:31 +00:00
$observer = App :: get_observer ();
$which = argv ( 1 );
$ob_hash = (( $observer ) ? $observer [ 'xchan_hash' ] : '' );
if ( App :: $is_sys && is_site_admin ()) {
2022-01-25 01:26:12 +00:00
$sys = Channel :: get_system ();
2021-12-02 23:02:31 +00:00
$uid = intval ( $sys [ 'channel_id' ]);
$channel = $sys ;
$ob_hash = $sys [ 'xchan_hash' ];
}
if ( ! $uid ) {
notice ( t ( 'Permission denied.' ) . EOL );
return '' ;
}
if ( argc () < 3 || ( ! App :: $data [ 'menu' ])) {
notice ( t ( 'Not found.' ) . EOL );
return '' ;
}
2022-01-26 05:43:05 +00:00
$m = Menu :: fetch ( App :: $data [ 'menu' ][ 'menu_name' ], $owner , $ob_hash );
2021-12-02 23:02:31 +00:00
App :: $data [ 'menu_item' ] = $m ;
2022-01-26 05:43:05 +00:00
$menu_list = Menu :: list ( $owner );
2021-12-02 23:02:31 +00:00
foreach ( $menu_list as $menus ) {
2021-12-03 03:01:39 +00:00
if ( $menus [ 'menu_name' ] != $m [ 'menu' ][ 'menu_name' ]) {
2021-12-02 23:02:31 +00:00
$menu_names [] = $menus [ 'menu_name' ];
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
}
$acl = new AccessControl ( $channel );
$lockstate = (( $channel [ 'channel_allow_cid' ] || $channel [ 'channel_allow_gid' ] || $channel [ 'channel_deny_cid' ] || $channel [ 'channel_deny_gid' ]) ? 'lock' : 'unlock' );
if ( argc () == 3 ) {
2021-12-03 03:01:39 +00:00
$r = q (
" select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d order by mitem_order asc, mitem_desc asc " ,
2021-12-02 23:02:31 +00:00
intval ( App :: $data [ 'menu' ][ 'menu_id' ]),
intval ( $owner )
);
if ( $_GET [ 'display' ]) {
$display = $_GET [ 'display' ];
} else {
$display = (( $r ) ? 'none' : 'block' );
}
2022-09-04 00:01:52 +00:00
$create = replace_macros ( Theme :: get_template ( 'mitemedit.tpl' ), [
2021-12-02 23:02:31 +00:00
'$menu_id' => App :: $data [ 'menu' ][ 'menu_id' ],
'$permissions' => t ( 'Menu Item Permissions' ),
'$permdesc' => t ( " \x28 click to open/close \x29 " ),
2022-01-25 20:51:37 +00:00
'$aclselect' => Libacl :: populate ( $acl -> get (), false ),
2021-12-02 23:02:31 +00:00
'$allow_cid' => acl2json ( $acl -> get ()[ 'allow_cid' ]),
'$allow_gid' => acl2json ( $acl -> get ()[ 'allow_gid' ]),
'$deny_cid' => acl2json ( $acl -> get ()[ 'deny_cid' ]),
'$deny_gid' => acl2json ( $acl -> get ()[ 'deny_gid' ]),
2022-09-04 00:01:52 +00:00
'$mitem_desc' => [ 'mitem_desc' , t ( 'Link Name' ), '' , 'Visible name of the link' , '*' ],
'$mitem_link' => [ 'mitem_link' , t ( 'Link or Submenu Target' ), '' , t ( 'Enter URL of the link or select a menu name to create a submenu' ), '*' , 'list="menu-names"' ],
'$usezid' => [ 'usezid' , t ( 'Use magic-auth if available' ), true , '' , [ t ( 'No' ), t ( 'Yes' )]],
'$newwin' => [ 'newwin' , t ( 'Open link in new window' ), false , '' , [ t ( 'No' ), t ( 'Yes' )]],
'$mitem_order' => [ 'mitem_order' , t ( 'Order in list' ), '0' , t ( 'Higher numbers will sink to bottom of listing' )],
2021-12-02 23:02:31 +00:00
'$submit' => t ( 'Submit and finish' ),
'$submit_more' => t ( 'Submit and continue' ),
'$display' => $display ,
'$lockstate' => $lockstate ,
'$menu_names' => $menu_names ,
'$nick' => $which ,
'$sys' => App :: $is_sys
2022-09-04 00:01:52 +00:00
]);
2021-12-02 23:02:31 +00:00
2022-09-04 00:01:52 +00:00
$o = replace_macros ( Theme :: get_template ( 'mitemlist.tpl' ), [
2021-12-02 23:02:31 +00:00
'$title' => t ( 'Menu:' ),
'$create' => $create ,
'$nametitle' => t ( 'Link Name' ),
'$targettitle' => t ( 'Link Target' ),
'$menuname' => App :: $data [ 'menu' ][ 'menu_name' ],
'$menudesc' => App :: $data [ 'menu' ][ 'menu_desc' ],
'$edmenu' => t ( 'Edit menu' ),
'$menu_id' => App :: $data [ 'menu' ][ 'menu_id' ],
'$mlist' => $r ,
'$edit' => t ( 'Edit element' ),
'$drop' => t ( 'Drop element' ),
'$new' => t ( 'New element' ),
'$hintmenu' => t ( 'Edit this menu container' ),
'$hintnew' => t ( 'Add menu element' ),
'$hintdrop' => t ( 'Delete this menu item' ),
'$hintedit' => t ( 'Edit this menu item' ),
'$nick' => $which ,
2022-09-04 00:01:52 +00:00
]);
2021-12-02 23:02:31 +00:00
return $o ;
}
if ( argc () > 3 ) {
if ( intval ( argv ( 3 ))) {
2021-12-03 03:01:39 +00:00
$m = q (
" select * from menu_item where mitem_id = %d and mitem_channel_id = %d limit 1 " ,
2021-12-02 23:02:31 +00:00
intval ( argv ( 3 )),
intval ( $owner )
);
if ( ! $m ) {
notice ( t ( 'Menu item not found.' ) . EOL );
goaway ( z_root () . '/menu/' . $which . (( App :: $is_sys ) ? '?f=&sys=1' : '' ));
}
$mitem = $m [ 0 ];
$lockstate = (( $mitem [ 'allow_cid' ] || $mitem [ 'allow_gid' ] || $mitem [ 'deny_cid' ] || $mitem [ 'deny_gid' ]) ? 'lock' : 'unlock' );
if ( argc () == 5 && argv ( 4 ) == 'drop' ) {
2022-01-26 05:43:05 +00:00
Menu :: sync_packet ( $owner , get_observer_hash (), $mitem [ 'mitem_menu_id' ]);
$r = MenuItem :: delete ( $mitem [ 'mitem_menu_id' ], $owner , intval ( argv ( 3 )));
Menu :: sync_packet ( $owner , get_observer_hash (), $mitem [ 'mitem_menu_id' ]);
2021-12-03 03:01:39 +00:00
if ( $r ) {
2021-12-02 23:02:31 +00:00
info ( t ( 'Menu item deleted.' ) . EOL );
2021-12-03 03:01:39 +00:00
} else {
2021-12-02 23:02:31 +00:00
notice ( t ( 'Menu item could not be deleted.' ) . EOL );
2021-12-03 03:01:39 +00:00
}
2021-12-02 23:02:31 +00:00
goaway ( z_root () . '/mitem/' . $which . '/' . $mitem [ 'mitem_menu_id' ] . (( App :: $is_sys ) ? '?f=&sys=1' : '' ));
}
// edit menu item
2022-09-04 00:01:52 +00:00
$o = replace_macros ( Theme :: get_template ( 'mitemedit.tpl' ), [
2021-12-02 23:02:31 +00:00
'$header' => t ( 'Edit Menu Element' ),
'$menu_id' => App :: $data [ 'menu' ][ 'menu_id' ],
'$permissions' => t ( 'Menu Item Permissions' ),
'$permdesc' => t ( " \x28 click to open/close \x29 " ),
2022-01-25 20:51:37 +00:00
'$aclselect' => Libacl :: populate ( $mitem , false ),
2021-12-02 23:02:31 +00:00
'$allow_cid' => acl2json ( $mitem [ 'allow_cid' ]),
'$allow_gid' => acl2json ( $mitem [ 'allow_gid' ]),
'$deny_cid' => acl2json ( $mitem [ 'deny_cid' ]),
'$deny_gid' => acl2json ( $mitem [ 'deny_gid' ]),
'$mitem_id' => intval ( argv ( 3 )),
2022-09-04 00:01:52 +00:00
'$mitem_desc' => [ 'mitem_desc' , t ( 'Link text' ), $mitem [ 'mitem_desc' ], '' , '*' ],
'$mitem_link' => [ 'mitem_link' , t ( 'Link or Submenu Target' ), $mitem [ 'mitem_link' ], 'Enter URL of the link or select a menu name to create a submenu' , '*' , 'list="menu-names"' ],
'$usezid' => [ 'usezid' , t ( 'Use magic-auth if available' ), (( $mitem [ 'mitem_flags' ] & MENU_ITEM_ZID ) ? 1 : 0 ), '' , [ t ( 'No' ), t ( 'Yes' )]],
'$newwin' => [ 'newwin' , t ( 'Open link in new window' ), (( $mitem [ 'mitem_flags' ] & MENU_ITEM_NEWWIN ) ? 1 : 0 ), '' , [ t ( 'No' ), t ( 'Yes' )]],
'$mitem_order' => [ 'mitem_order' , t ( 'Order in list' ), $mitem [ 'mitem_order' ], t ( 'Higher numbers will sink to bottom of listing' )],
2021-12-02 23:02:31 +00:00
'$submit' => t ( 'Submit' ),
'$lockstate' => $lockstate ,
'$menu_names' => $menu_names ,
'$nick' => $which
2022-09-04 00:01:52 +00:00
]);
2021-12-02 23:02:31 +00:00
return $o ;
}
}
}
2016-04-19 03:38:38 +00:00
}