diff options
Diffstat (limited to 'mod/impel.php')
-rw-r--r-- | mod/impel.php | 191 |
1 files changed, 135 insertions, 56 deletions
diff --git a/mod/impel.php b/mod/impel.php index 1b641b301..0b29bcf02 100644 --- a/mod/impel.php +++ b/mod/impel.php @@ -2,6 +2,7 @@ // import page design element +require_once('include/menu.php'); function impel_init(&$a) { @@ -21,10 +22,13 @@ function impel_init(&$a) { if(! $j) json_return_and_die($ret); - $channel = $a->get_channel(); $arr = array(); + $is_menu = false; + + // a portable menu has its links rewritten with the local baseurl + $portable_menu = false; switch($j['type']) { case 'webpage': @@ -42,80 +46,155 @@ function impel_init(&$a) { $namespace = 'PDL'; $installed_type = t('layout'); break; + case 'portable-menu': + $portable_menu = true; + // fall through + case 'menu': + $is_menu = true; + $installed_type = t('menu'); + break; default: logger('mod_impel: unrecognised element type' . print_r($j,true)); break; } - $arr['uid'] = local_channel(); - $arr['aid'] = $channel['channel_account_id']; - $arr['title'] = $j['title']; - $arr['body'] = $j['body']; - $arr['term'] = $j['term']; - $arr['created'] = datetime_convert('UTC','UTC', $j['created']); - $arr['edited'] = datetime_convert('UTC','UTC',$j['edited']); - $arr['owner_xchan'] = get_observer_hash(); - $arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash()); - $arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode'); - - if(! $j['mid']) - $j['mid'] = item_message_id(); - - $arr['mid'] = $arr['parent_mid'] = $j['mid']; - - - if($j['pagetitle']) { - require_once('library/urlify/URLify.php'); - $pagetitle = strtolower(URLify::transliterate($j['pagetitle'])); + + if($is_menu) { + $m = array(); + $m['menu_channel_id'] = local_channel(); + $m['menu_name'] = $j['pagetitle']; + $m['menu_desc'] = $j['desc']; + if($j['created']) + $m['menu_created'] = datetime_convert($j['created']); + if($j['edited']) + $m['menu_edited'] = datetime_convert($j['edited']); + + $m['menu_flags'] = 0; + if($j['flags']) { + if(in_array('bookmark',$j['flags'])) + $m['menu_flags'] |= MENU_BOOKMARK; + if(in_array('system',$j['flags'])) + $m['menu_flags'] |= MENU_SYSTEM; + + } + + $menu_id = menu_create($m); + + if($menu_id) { + if(is_array($j['items'])) { + foreach($j['items'] as $it) { + $mitem = array(); + + $mitem['mitem_link'] = str_replace('[baseurl]',z_root(),$it['link']); + $mitem['mitem_desc'] = escape_tags($it['desc']); + $mitem['mitem_order'] = intval($it['order']); + if(is_array($it['flags'])) { + $mitem['mitem_flags'] = 0; + if(in_array('zid',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_ZID; + if(in_array('new-window',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_NEWWIN; + if(in_array('chatroom',$it['flags'])) + $mitem['mitem_flags'] |= MENU_ITEM_CHATROOM; + } + menu_add_item($menu_id,local_channel(),$mitem); + } + if($j['edited']) { + $x = q("update menu set menu_edited = '%s' where menu_id = %d and menu_channel_id = %d", + dbesc(datetime_convert('UTC','UTC',$j['edited'])), + intval($menu_id), + intval(local_channel()) + ); + } + } + $ret['success'] = true; + } + $x = $ret; } + else { + $arr['uid'] = local_channel(); + $arr['aid'] = $channel['channel_account_id']; + $arr['title'] = $j['title']; + $arr['body'] = $j['body']; + $arr['term'] = $j['term']; + $arr['layout_mid'] = $j['layout_mid']; + $arr['created'] = datetime_convert('UTC','UTC', $j['created']); + $arr['edited'] = datetime_convert('UTC','UTC',$j['edited']); + $arr['owner_xchan'] = get_observer_hash(); + $arr['author_xchan'] = (($j['author_xchan']) ? $j['author_xchan'] : get_observer_hash()); + $arr['mimetype'] = (($j['mimetype']) ? $j['mimetype'] : 'text/bbcode'); + + if(! $j['mid']) + $j['mid'] = item_message_id(); + + $arr['mid'] = $arr['parent_mid'] = $j['mid']; + + + if($j['pagetitle']) { + require_once('library/urlify/URLify.php'); + $pagetitle = strtolower(URLify::transliterate($j['pagetitle'])); + } - // Verify ability to use html or php!!! + // Verify ability to use html or php!!! - $execflag = false; + $execflag = false; + + if($arr['mimetype'] === 'application/x-php') { + $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1", + intval(local_channel()) + ); + + if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) { + $execflag = true; + } + } - if($arr['mimetype'] === 'application/x-php') { - $z = q("select account_id, account_roles, channel_pageflags from account left join channel on channel_account_id = account_id where channel_id = %d limit 1", + $remote_id = 0; + + $z = q("select * from item_id where sid = '%s' and service = '%s' and uid = %d limit 1", + dbesc($pagetitle), + dbesc($namespace), + intval(local_channel()) + ); + $i = q("select id, edited, item_restrict from item where mid = '%s' and uid = %d limit 1", + dbesc($arr['mid']), intval(local_channel()) ); - if($z && (($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE) || ($z[0]['channel_pageflags'] & PAGE_ALLOWCODE))) { - $execflag = true; + if($z && $i) { + $remote_id = $z[0]['id']; + $arr['id'] = $i[0]['id']; + // don't update if it has the same timestamp as the original + if($arr['edited'] > $i[0]['edited']) + $x = item_store_update($arr,$execflag); + } + else { + if(($i) && ($i[0]['item_restrict'] & ITEM_DELETED)) { + // was partially deleted already, finish it off + q("delete from item where mid = '%s' and uid = %d", + dbesc($arr['mid']), + intval(local_channel()) + ); + } + $x = item_store($arr,$execflag); + } + + if($x['success']) { + $item_id = $x['item_id']; + update_remote_id($channel,$item_id,$arr['item_restrict'],$pagetitle,$namespace,$remote_id,$arr['mid']); } } - $remote_id = 0; - - $z = q("select * from item_id where sid = '%s' and service = '%s' and uid = %d limit 1", - dbesc($pagetitle), - dbesc($namespace), - intval(local_channel()) - ); - $i = q("select id from item where mid = '%s' and uid = %d limit 1", - dbesc($arr['mid']), - intval(local_channel()) - ); - if($z && $i) { - $remote_id = $z[0]['id']; - $arr['id'] = $i[0]['id']; - // don't update if it has the same timestamp as the original - if($arr['edited'] > $i[0]['edited']) - $x = item_store_update($arr,$execflag); + if($x['success']) { + $ret['success'] = true; + info( sprintf( t('%s element installed'), $installed_type)); } else { - $x = item_store($arr,$execflag); + notice( sprintf( t('%s element installation failed'), $installed_type)); } - if($x['success']) - $item_id = $x['item_id']; - - - update_remote_id($channel,$item_id,$arr['item_restrict'],$pagetitle,$namespace,$remote_id,$arr['mid']); - - - $ret['success'] = true; - - info( sprintf( t('%s element installed'), $installed_type)); +//??? should perhaps return ret? json_return_and_die(true); -}
\ No newline at end of file +} |