Merge https://github.com/friendica/friendica into pull
This commit is contained in:
commit
776552226b
25 changed files with 869 additions and 293 deletions
53
.gitignore
vendored
53
.gitignore
vendored
|
@ -1,26 +1,27 @@
|
|||
favicon.*
|
||||
.htconfig.php
|
||||
\#*
|
||||
include/jquery-1.4.2.min.js
|
||||
*.log
|
||||
*.out
|
||||
*.version*
|
||||
favicon.*
|
||||
home.html
|
||||
addon
|
||||
*~
|
||||
|
||||
#ignore documentation, it should be newly built
|
||||
doc/api
|
||||
|
||||
#ignore reports, should be generted with every build
|
||||
report/
|
||||
|
||||
#ignore config files from eclipse, we don't want IDE files in our repository
|
||||
.project
|
||||
.buildpath
|
||||
.externalToolBuilders
|
||||
.settings
|
||||
#ignore OSX .DS_Store files
|
||||
.DS_Store
|
||||
|
||||
favicon.*
|
||||
.htconfig.php
|
||||
\#*
|
||||
include/jquery-1.4.2.min.js
|
||||
*.log
|
||||
*.out
|
||||
*.version*
|
||||
favicon.*
|
||||
home.html
|
||||
addon
|
||||
*~
|
||||
|
||||
#ignore documentation, it should be newly built
|
||||
doc/api
|
||||
|
||||
#ignore reports, should be generted with every build
|
||||
report/
|
||||
|
||||
#ignore config files from eclipse, we don't want IDE files in our repository
|
||||
.project
|
||||
.buildpath
|
||||
.externalToolBuilders
|
||||
.settings
|
||||
#ignore OSX .DS_Store files
|
||||
.DS_Store
|
||||
|
||||
/nbproject/private/
|
14
boot.php
14
boot.php
|
@ -385,7 +385,7 @@ if(! class_exists('App')) {
|
|||
|
||||
function __construct() {
|
||||
|
||||
global $default_timezone;
|
||||
global $default_timezone, $argv, $argc;
|
||||
|
||||
$this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
|
||||
|
||||
|
@ -428,6 +428,9 @@ if(! class_exists('App')) {
|
|||
if(isset($path) && strlen($path) && ($path != $this->path))
|
||||
$this->path = $path;
|
||||
}
|
||||
if (is_array($argv) && $argc>1 && !x($_SERVER,'SERVER_NAME') && substr(end($argv), 0, 4)=="http" ) {
|
||||
$this->set_baseurl(array_pop($argv) );
|
||||
}
|
||||
|
||||
set_include_path(
|
||||
"include/$this->hostname" . PATH_SEPARATOR
|
||||
|
@ -436,6 +439,7 @@ if(! class_exists('App')) {
|
|||
. 'library/phpsec' . PATH_SEPARATOR
|
||||
. 'library/langdet' . PATH_SEPARATOR
|
||||
. '.' );
|
||||
|
||||
|
||||
if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
|
||||
$this->query_string = substr($_SERVER['QUERY_STRING'],2);
|
||||
|
@ -1501,9 +1505,15 @@ if(! function_exists('proc_run')) {
|
|||
|
||||
if(count($args) && $args[0] === 'php')
|
||||
$args[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
|
||||
for($x = 0; $x < count($args); $x ++)
|
||||
|
||||
// add baseurl to args. cli scripts can't construct it
|
||||
$args[] = $a->get_baseurl();
|
||||
|
||||
for($x = 0; $x < count($args); $x ++)
|
||||
$args[$x] = escapeshellarg($args[$x]);
|
||||
|
||||
|
||||
|
||||
$cmdline = implode($args," ");
|
||||
if(get_config('system','proc_windows'))
|
||||
proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo,dirname(__FILE__)));
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
require_once("boot.php");
|
||||
|
||||
|
||||
function cronhooks_run($argv, $argc){
|
||||
function cronhooks_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)) {
|
||||
|
|
|
@ -232,8 +232,9 @@ function q($sql) {
|
|||
|
||||
if($db && $db->connected) {
|
||||
$stmt = vsprintf($sql,$args);
|
||||
//logger("dba: q: $stmt", LOGGER_ALL);
|
||||
if($stmt === false)
|
||||
logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true));
|
||||
logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG);
|
||||
return $db->q($stmt);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ require_once("boot.php");
|
|||
require_once('include/queue_fn.php');
|
||||
require_once('include/html2plain.php');
|
||||
|
||||
function delivery_run($argv, $argc){
|
||||
function delivery_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)){
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
require_once("boot.php");
|
||||
|
||||
function directory_run($argv, $argc){
|
||||
function directory_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)) {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require_once("boot.php");
|
||||
|
||||
function expire_run($argv, $argc){
|
||||
function expire_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)) {
|
||||
|
|
|
@ -4,7 +4,7 @@ require_once("boot.php");
|
|||
require_once('include/Scrape.php');
|
||||
require_once('include/socgraph.php');
|
||||
|
||||
function gprobe_run($argv, $argc){
|
||||
function gprobe_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)) {
|
||||
|
|
|
@ -2168,9 +2168,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
|
|||
}
|
||||
|
||||
function local_delivery($importer,$data) {
|
||||
|
||||
$a = get_app();
|
||||
|
||||
logger(__function__, LOGGER_TRACE);
|
||||
|
||||
if($importer['readonly']) {
|
||||
// We aren't receiving stuff from this person. But we will quietly ignore them
|
||||
// rather than a blatant "go away" message.
|
||||
|
@ -2305,7 +2306,7 @@ function local_delivery($importer,$data) {
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
// Currently unsupported - needs a lot of work
|
||||
$reloc = $feed->get_feed_tags( NAMESPACE_DFRN, 'relocate' );
|
||||
if(isset($reloc[0]['child'][NAMESPACE_DFRN])) {
|
||||
|
@ -2315,23 +2316,79 @@ function local_delivery($importer,$data) {
|
|||
$newloc['cid'] = $importer['id'];
|
||||
$newloc['name'] = notags(unxmlify($base['name'][0]['data']));
|
||||
$newloc['photo'] = notags(unxmlify($base['photo'][0]['data']));
|
||||
$newloc['thumb'] = notags(unxmlify($base['thumb'][0]['data']));
|
||||
$newloc['micro'] = notags(unxmlify($base['micro'][0]['data']));
|
||||
$newloc['url'] = notags(unxmlify($base['url'][0]['data']));
|
||||
$newloc['request'] = notags(unxmlify($base['request'][0]['data']));
|
||||
$newloc['confirm'] = notags(unxmlify($base['confirm'][0]['data']));
|
||||
$newloc['notify'] = notags(unxmlify($base['notify'][0]['data']));
|
||||
$newloc['poll'] = notags(unxmlify($base['poll'][0]['data']));
|
||||
$newloc['site-pubkey'] = notags(unxmlify($base['site-pubkey'][0]['data']));
|
||||
$newloc['pubkey'] = notags(unxmlify($base['pubkey'][0]['data']));
|
||||
$newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));
|
||||
$newloc['sitepubkey'] = notags(unxmlify($base['sitepubkey'][0]['data']));
|
||||
/** relocated user must have original key pair */
|
||||
/*$newloc['pubkey'] = notags(unxmlify($base['pubkey'][0]['data']));
|
||||
$newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));*/
|
||||
|
||||
logger("items:relocate contact ".print_r($newloc, true).print_r($importer, true), LOGGER_DEBUG);
|
||||
|
||||
// update contact
|
||||
$r = q("SELECT photo, url FROM contact WHERE id=%d AND uid=%d;",
|
||||
intval($importer['id']),
|
||||
intval($importer['importer_uid']));
|
||||
if ($r === false)
|
||||
return 1;
|
||||
$old = $r[0];
|
||||
|
||||
$x = q("UPDATE contact SET
|
||||
name = '%s',
|
||||
photo = '%s',
|
||||
thumb = '%s',
|
||||
micro = '%s',
|
||||
url = '%s',
|
||||
request = '%s',
|
||||
confirm = '%s',
|
||||
notify = '%s',
|
||||
poll = '%s',
|
||||
`site-pubkey` = '%s'
|
||||
WHERE id=%d AND uid=%d;",
|
||||
dbesc($newloc['name']),
|
||||
dbesc($newloc['photo']),
|
||||
dbesc($newloc['thumb']),
|
||||
dbesc($newloc['micro']),
|
||||
dbesc($newloc['url']),
|
||||
dbesc($newloc['request']),
|
||||
dbesc($newloc['confirm']),
|
||||
dbesc($newloc['notify']),
|
||||
dbesc($newloc['poll']),
|
||||
dbesc($newloc['sitepubkey']),
|
||||
intval($importer['id']),
|
||||
intval($importer['importer_uid']));
|
||||
|
||||
if ($x === false)
|
||||
return 1;
|
||||
// update items
|
||||
$fields = array(
|
||||
'owner-link' => array($old['url'], $newloc['url']),
|
||||
'author-link' => array($old['url'], $newloc['url']),
|
||||
'owner-avatar' => array($old['photo'], $newloc['photo']),
|
||||
'author-avatar' => array($old['photo'], $newloc['photo']),
|
||||
);
|
||||
foreach ($fields as $n=>$f){
|
||||
$x = q("UPDATE item SET `%s`='%s' WHERE `%s`='%s' AND uid=%d",
|
||||
$n, dbesc($f[1]),
|
||||
$n, dbesc($f[0]),
|
||||
intval($importer['importer_uid']));
|
||||
if ($x === false)
|
||||
return 1;
|
||||
}
|
||||
|
||||
// TODO
|
||||
// merge with current record, current contents have priority
|
||||
// update record, set url-updated
|
||||
// update profile photos
|
||||
// schedule a scan?
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// handle friend suggestion notification
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<?php
|
||||
|
||||
require_once("boot.php");
|
||||
require_once('include/queue_fn.php');
|
||||
require_once('include/html2plain.php');
|
||||
|
@ -43,7 +42,7 @@ require_once('include/html2plain.php');
|
|||
*/
|
||||
|
||||
|
||||
function notifier_run($argv, $argc){
|
||||
function notifier_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)){
|
||||
|
@ -89,6 +88,7 @@ function notifier_run($argv, $argc){
|
|||
$expire = false;
|
||||
$mail = false;
|
||||
$fsuggest = false;
|
||||
$relocate = false;
|
||||
$top_level = false;
|
||||
$recipients = array();
|
||||
$url_recipients = array();
|
||||
|
@ -136,11 +136,15 @@ function notifier_run($argv, $argc){
|
|||
}
|
||||
elseif($cmd === 'removeme') {
|
||||
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($item_id));
|
||||
if (! $r)
|
||||
return;
|
||||
$user = $r[0];
|
||||
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", intval($item_id));
|
||||
if (! $r)
|
||||
return;
|
||||
$self = $r[0];
|
||||
$r = q("SELECT * FROM `contact` WHERE `self` = 0 AND `uid` = %d", intval($item_id));
|
||||
if(! count($r))
|
||||
if(! $r)
|
||||
return;
|
||||
require_once('include/Contact.php');
|
||||
foreach($r as $contact) {
|
||||
|
@ -148,8 +152,12 @@ function notifier_run($argv, $argc){
|
|||
}
|
||||
return;
|
||||
}
|
||||
elseif($cmd === 'relocate') {
|
||||
$normal_mode = false;
|
||||
$relocate = true;
|
||||
$uid = $item_id;
|
||||
}
|
||||
else {
|
||||
|
||||
// find ancestors
|
||||
$r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1",
|
||||
intval($item_id)
|
||||
|
@ -214,7 +222,7 @@ function notifier_run($argv, $argc){
|
|||
// fill this in with a single salmon slap if applicable
|
||||
$slap = '';
|
||||
|
||||
if(! ($mail || $fsuggest)) {
|
||||
if(! ($mail || $fsuggest || $relocate)) {
|
||||
|
||||
require_once('include/group.php');
|
||||
|
||||
|
@ -418,6 +426,45 @@ function notifier_run($argv, $argc){
|
|||
);
|
||||
|
||||
}
|
||||
elseif($relocate) {
|
||||
$public_message = false; // suggestions are not public
|
||||
|
||||
$sugg_template = get_markup_template('atom_relocate.tpl');
|
||||
|
||||
/* get site pubkey. this could be a new installation with no site keys*/
|
||||
$pubkey = get_config('system','site_pubkey');
|
||||
if(! $pubkey) {
|
||||
$res = new_keypair(1024);
|
||||
set_config('system','site_prvkey', $res['prvkey']);
|
||||
set_config('system','site_pubkey', $res['pubkey']);
|
||||
}
|
||||
|
||||
$rp = q("SELECT `resource-id` , `scale`, type FROM `photo`
|
||||
WHERE `profile` = 1 AND `uid` = %d ORDER BY scale;", $uid);
|
||||
$photos = array();
|
||||
$ext = Photo::supportedTypes();
|
||||
foreach($rp as $p){
|
||||
$photos[$p['scale']] = $a->get_baseurl().'/photo/'.$p['resource-id'].'-'.$p['scale'].'.'.$ext[$p['type']];
|
||||
}
|
||||
unset($rp, $ext);
|
||||
|
||||
$atom .= replace_macros($sugg_template, array(
|
||||
'$name' => xmlify($owner['name']),
|
||||
'$photo' => xmlify($photos[4]),
|
||||
'$thumb' => xmlify($photos[5]),
|
||||
'$micro' => xmlify($photos[6]),
|
||||
'$url' => xmlify($owner['url']),
|
||||
'$request' => xmlify($owner['request']),
|
||||
'$confirm' => xmlify($owner['confirm']),
|
||||
'$notify' => xmlify($owner['notify']),
|
||||
'$poll' => xmlify($owner['poll']),
|
||||
'$sitepubkey' => xmlify(get_config('system','site_pubkey')),
|
||||
//'$pubkey' => xmlify($owner['pubkey']),
|
||||
//'$prvkey' => xmlify($owner['prvkey']),
|
||||
));
|
||||
$recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN);
|
||||
unset($photos);
|
||||
}
|
||||
else {
|
||||
if($followup) {
|
||||
foreach($items as $item) { // there is only one item
|
||||
|
@ -493,9 +540,12 @@ function notifier_run($argv, $argc){
|
|||
else
|
||||
$recip_str = implode(', ', $recipients);
|
||||
|
||||
$r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ",
|
||||
dbesc($recip_str)
|
||||
);
|
||||
if ($relocate)
|
||||
$r = $recipients_relocate;
|
||||
else
|
||||
$r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ",
|
||||
dbesc($recip_str)
|
||||
);
|
||||
|
||||
|
||||
require_once('include/salmon.php');
|
||||
|
@ -507,7 +557,7 @@ function notifier_run($argv, $argc){
|
|||
if(count($r)) {
|
||||
|
||||
foreach($r as $contact) {
|
||||
if((! $mail) && (! $fsuggest) && (! $followup) && (! $contact['self'])) {
|
||||
if((! $mail) && (! $fsuggest) && (! $followup) && (!$relocate) && (! $contact['self'])) {
|
||||
if(($contact['network'] === NETWORK_DIASPORA) && ($public_message))
|
||||
continue;
|
||||
q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )",
|
||||
|
@ -544,7 +594,7 @@ function notifier_run($argv, $argc){
|
|||
// potentially more than one recipient. Start a new process and space them out a bit.
|
||||
// we will deliver single recipient types of message and email recipients here.
|
||||
|
||||
if((! $mail) && (! $fsuggest) && (! $followup)) {
|
||||
if((! $mail) && (! $fsuggest) && (!$relocate) && (! $followup)) {
|
||||
|
||||
$this_batch[] = $contact['id'];
|
||||
|
||||
|
@ -559,7 +609,7 @@ function notifier_run($argv, $argc){
|
|||
|
||||
$deliver_status = 0;
|
||||
|
||||
logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest");
|
||||
logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest relocate=$relocate");
|
||||
|
||||
switch($contact['network']) {
|
||||
case NETWORK_DFRN:
|
||||
|
@ -916,6 +966,7 @@ function notifier_run($argv, $argc){
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
if (array_search(__file__,get_included_files())===0){
|
||||
notifier_run($argv,$argc);
|
||||
killme();
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
require_once("boot.php");
|
||||
|
||||
function onepoll_run($argv, $argc){
|
||||
function onepoll_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
require_once("boot.php");
|
||||
|
||||
|
||||
function poller_run($argv, $argc){
|
||||
function poller_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)) {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
require_once("boot.php");
|
||||
require_once('include/queue_fn.php');
|
||||
|
||||
function queue_run($argv, $argc){
|
||||
function queue_run(&$argv, &$argc){
|
||||
global $a, $db;
|
||||
|
||||
if(is_null($a)){
|
||||
|
|
237
include/uimport.php
Normal file
237
include/uimport.php
Normal file
|
@ -0,0 +1,237 @@
|
|||
<?php
|
||||
/**
|
||||
* import account file exported from mod/uexport
|
||||
* args:
|
||||
* $a App Friendica App Class
|
||||
* $file Array array from $_FILES
|
||||
*/
|
||||
require_once("include/Photo.php");
|
||||
define("IMPORT_DEBUG", False);
|
||||
|
||||
function last_insert_id(){
|
||||
global $db;
|
||||
if (IMPORT_DEBUG) return 1;
|
||||
if($db->mysqli){
|
||||
$thedb = $db->getdb();
|
||||
return $thedb->insert_id;
|
||||
} else {
|
||||
return mysql_insert_id();
|
||||
}
|
||||
}
|
||||
|
||||
function last_error(){
|
||||
global $db;
|
||||
return $db->error;
|
||||
}
|
||||
|
||||
function db_import_assoc($table, $arr){
|
||||
if (IMPORT_DEBUG) return true;
|
||||
if (isset($arr['id'])) unset($arr['id']);
|
||||
$cols = implode("`,`", array_map('dbesc', array_keys($arr)));
|
||||
$vals = implode("','", array_map('dbesc', array_values($arr)));
|
||||
$query = "INSERT INTO `$table` (`$cols`) VALUES ('$vals')";
|
||||
logger("uimport: $query",LOGGER_TRACE);
|
||||
return q($query);
|
||||
}
|
||||
|
||||
function import_cleanup($newuid) {
|
||||
q("DELETE FROM `user` WHERE uid = %d", $newuid);
|
||||
q("DELETE FROM `contact` WHERE uid = %d", $newuid);
|
||||
q("DELETE FROM `profile` WHERE uid = %d", $newuid);
|
||||
q("DELETE FROM `photo` WHERE uid = %d", $newuid);
|
||||
q("DELETE FROM `group` WHERE uid = %d", $newuid);
|
||||
q("DELETE FROM `group_member` WHERE uid = %d", $newuid);
|
||||
q("DELETE FROM `pconfig` WHERE uid = %d", $newuid);
|
||||
|
||||
}
|
||||
|
||||
function import_account(&$a, $file) {
|
||||
logger("Start user import from ".$file['tmp_name']);
|
||||
/*
|
||||
STEPS
|
||||
1. checks
|
||||
2. replace old baseurl with new baseurl
|
||||
3. import data (look at user id and contacts id)
|
||||
4. archive non-dfrn contacts
|
||||
5. send message to dfrn contacts
|
||||
*/
|
||||
|
||||
$account = json_decode(file_get_contents($file['tmp_name']), true);
|
||||
if ($account===null) {
|
||||
notice(t("Error decoding account file"));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!x($account, 'version')) {
|
||||
notice(t("Error! No version data in file! This is not a Friendica account file?"));
|
||||
return;
|
||||
}
|
||||
|
||||
if ($account['schema'] != DB_UPDATE_VERSION) {
|
||||
notice(t("Error! I can't import this file: DB schema version is not compatible."));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
$oldbaseurl = $account['baseurl'];
|
||||
$newbaseurl = $a->get_baseurl();
|
||||
$olduid = $account['user']['uid'];
|
||||
|
||||
unset($account['user']['uid']);
|
||||
foreach($account['user'] as $k => &$v) {
|
||||
$v = str_replace($oldbaseurl, $newbaseurl, $v);
|
||||
}
|
||||
|
||||
|
||||
// import user
|
||||
$r = db_import_assoc('user', $account['user']);
|
||||
if ($r===false) {
|
||||
//echo "<pre>"; var_dump($r, $query, mysql_error()); killme();
|
||||
logger("uimport:insert user : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
notice(t("User creation error"));
|
||||
return;
|
||||
}
|
||||
$newuid = last_insert_id();
|
||||
//~ $newuid = 1;
|
||||
|
||||
|
||||
|
||||
foreach($account['profile'] as &$profile) {
|
||||
foreach($profile as $k=>&$v) {
|
||||
$v = str_replace($oldbaseurl, $newbaseurl, $v);
|
||||
foreach(array("profile","avatar") as $k)
|
||||
$v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);
|
||||
}
|
||||
$profile['uid'] = $newuid;
|
||||
$r = db_import_assoc('profile', $profile);
|
||||
if ($r===false) {
|
||||
logger("uimport:insert profile ".$profile['profile-name']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
info(t("User profile creation error"));
|
||||
import_cleanup($newuid);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$errorcount=0;
|
||||
foreach($account['contact'] as &$contact) {
|
||||
if ($contact['uid'] == $olduid && $contact['self'] == '1'){
|
||||
foreach($contact as $k=>&$v) {
|
||||
$v = str_replace($oldbaseurl, $newbaseurl, $v);
|
||||
foreach(array("profile","avatar","micro") as $k)
|
||||
$v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);
|
||||
}
|
||||
}
|
||||
if ($contact['uid'] == $olduid && $contact['self'] == '0') {
|
||||
switch ($contact['network']){
|
||||
case NETWORK_DFRN:
|
||||
// send relocate message (below)
|
||||
break;
|
||||
case NETWORK_ZOT:
|
||||
// TODO handle zot network
|
||||
break;
|
||||
case NETWORK_MAIL2:
|
||||
// TODO ?
|
||||
break;
|
||||
case NETWORK_FEED:
|
||||
case NETWORK_MAIL:
|
||||
// Nothing to do
|
||||
break;
|
||||
default:
|
||||
// archive other contacts
|
||||
$contact['archive'] = "1";
|
||||
}
|
||||
}
|
||||
$contact['uid'] = $newuid;
|
||||
$r = db_import_assoc('contact', $contact);
|
||||
if ($r===false) {
|
||||
logger("uimport:insert contact ".$contact['nick'].",".$contact['network']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
$errorcount++;
|
||||
} else {
|
||||
$contact['newid'] = last_insert_id();
|
||||
}
|
||||
}
|
||||
if ($errorcount>0) {
|
||||
notice( sprintf(tt("%d contact not imported", "%d contacts not imported", $errorcount), $errorcount) );
|
||||
}
|
||||
|
||||
foreach($account['group'] as &$group) {
|
||||
$group['uid'] = $newuid;
|
||||
$r = db_import_assoc('group', $group);
|
||||
if ($r===false) {
|
||||
logger("uimport:insert group ".$group['name']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
} else {
|
||||
$group['newid'] = last_insert_id();
|
||||
}
|
||||
}
|
||||
|
||||
foreach($account['group_member'] as &$group_member) {
|
||||
$group_member['uid'] = $newuid;
|
||||
|
||||
$import = 0;
|
||||
foreach($account['group'] as $group) {
|
||||
if ($group['id'] == $group_member['gid'] && isset($group['newid'])) {
|
||||
$group_member['gid'] = $group['newid'];
|
||||
$import++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
foreach($account['contact'] as $contact) {
|
||||
if ($contact['id'] == $group_member['contact-id'] && isset($contact['newid'])) {
|
||||
$group_member['contact-id'] = $contact['newid'];
|
||||
$import++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($import==2) {
|
||||
$r = db_import_assoc('group_member', $group_member);
|
||||
if ($r===false) {
|
||||
logger("uimport:insert group member ".$group_member['id']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
foreach($account['photo'] as &$photo) {
|
||||
$photo['uid'] = $newuid;
|
||||
$photo['data'] = hex2bin($photo['data']);
|
||||
|
||||
$p = new Photo($photo['data'], $photo['type']);
|
||||
$r = $p->store(
|
||||
$photo['uid'],
|
||||
$photo['contact-id'], //0
|
||||
$photo['resource-id'],
|
||||
$photo['filename'],
|
||||
$photo['album'],
|
||||
$photo['scale'],
|
||||
$photo['profile'], //1
|
||||
$photo['allow_cid'],
|
||||
$photo['allow_gid'],
|
||||
$photo['deny_cid'],
|
||||
$photo['deny_gid']
|
||||
);
|
||||
|
||||
if ($r===false) {
|
||||
logger("uimport:insert photo ".$photo['resource-id'].",". $photo['scale']. " : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
foreach($account['pconfig'] as &$pconfig) {
|
||||
$pconfig['uid'] = $newuid;
|
||||
$r = db_import_assoc('pconfig', $pconfig);
|
||||
if ($r===false) {
|
||||
logger("uimport:insert pconfig ".$pconfig['id']. " : ERROR : ".last_error(), LOGGER_NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
// send relocate messages
|
||||
proc_run('php', 'include/notifier.php', 'relocate' , $newuid);
|
||||
|
||||
info(t("Done. You can now login with your username and password"));
|
||||
goaway( $a->get_baseurl() ."/login");
|
||||
|
||||
|
||||
}
|
|
@ -6,7 +6,7 @@ require_once('include/event.php');
|
|||
|
||||
|
||||
function dfrn_notify_post(&$a) {
|
||||
|
||||
logger(__function__, LOGGER_TRACE);
|
||||
$dfrn_id = ((x($_POST,'dfrn_id')) ? notags(trim($_POST['dfrn_id'])) : '');
|
||||
$dfrn_version = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0);
|
||||
$challenge = ((x($_POST,'challenge')) ? notags(trim($_POST['challenge'])) : '');
|
||||
|
|
|
@ -42,6 +42,7 @@ function register_post(&$a) {
|
|||
$verified = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
require_once('include/user.php');
|
||||
|
||||
|
@ -234,7 +235,7 @@ function register_content(&$a) {
|
|||
'$yes_selected' => ' checked="checked" ',
|
||||
'$no_selected' => '',
|
||||
'$str_yes' => t('Yes'),
|
||||
'$str_no' => t('No')
|
||||
'$str_no' => t('No'),
|
||||
));
|
||||
}
|
||||
|
||||
|
@ -275,7 +276,8 @@ function register_content(&$a) {
|
|||
'$email' => $email,
|
||||
'$nickname' => $nickname,
|
||||
'$license' => $license,
|
||||
'$sitename' => $a->get_hostname()
|
||||
'$sitename' => $a->get_hostname(),
|
||||
|
||||
));
|
||||
return $o;
|
||||
|
||||
|
|
183
mod/uexport.php
183
mod/uexport.php
|
@ -1,46 +1,174 @@
|
|||
<?php
|
||||
|
||||
function uexport_init(&$a) {
|
||||
|
||||
function uexport_init(&$a){
|
||||
if(! local_user())
|
||||
killme();
|
||||
|
||||
$user = array();
|
||||
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
|
||||
local_user()
|
||||
|
||||
$tabs = array(
|
||||
array(
|
||||
'label' => t('Account settings'),
|
||||
'url' => $a->get_baseurl(true).'/settings',
|
||||
'selected' => '',
|
||||
),
|
||||
array(
|
||||
'label' => t('Display settings'),
|
||||
'url' => $a->get_baseurl(true).'/settings/display',
|
||||
'selected' =>'',
|
||||
),
|
||||
|
||||
array(
|
||||
'label' => t('Connector settings'),
|
||||
'url' => $a->get_baseurl(true).'/settings/connectors',
|
||||
'selected' => '',
|
||||
),
|
||||
array(
|
||||
'label' => t('Plugin settings'),
|
||||
'url' => $a->get_baseurl(true).'/settings/addon',
|
||||
'selected' => '',
|
||||
),
|
||||
array(
|
||||
'label' => t('Connected apps'),
|
||||
'url' => $a->get_baseurl(true) . '/settings/oauth',
|
||||
'selected' => '',
|
||||
),
|
||||
array(
|
||||
'label' => t('Export personal data'),
|
||||
'url' => $a->get_baseurl(true) . '/uexport',
|
||||
'selected' => 'active'
|
||||
),
|
||||
array(
|
||||
'label' => t('Remove account'),
|
||||
'url' => $a->get_baseurl(true) . '/removeme',
|
||||
'selected' => ''
|
||||
)
|
||||
);
|
||||
|
||||
$tabtpl = get_markup_template("generic_links_widget.tpl");
|
||||
$a->page['aside'] = replace_macros($tabtpl, array(
|
||||
'$title' => t('Settings'),
|
||||
'$class' => 'settings-widget',
|
||||
'$items' => $tabs,
|
||||
));
|
||||
}
|
||||
|
||||
function uexport_content(&$a){
|
||||
|
||||
if ($a->argc > 1) {
|
||||
header("Content-type: application/json");
|
||||
header('Content-Disposition: attachment; filename="'.$a->user['nickname'].'.'.$a->argv[1].'"');
|
||||
switch($a->argv[1]) {
|
||||
case "backup": uexport_all($a); killme(); break;
|
||||
case "account": uexport_account($a); killme(); break;
|
||||
default:
|
||||
killme();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* options shown on "Export personal data" page
|
||||
* list of array( 'link url', 'link text', 'help text' )
|
||||
*/
|
||||
$options = array(
|
||||
array('/uexport/account',t('Export account'),t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')),
|
||||
array('/uexport/backup',t('Export all'),t('Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')),
|
||||
);
|
||||
call_hooks('uexport_options', $options);
|
||||
|
||||
$tpl = get_markup_template("uexport.tpl");
|
||||
return replace_macros($tpl, array(
|
||||
'$baseurl' => $a->get_baseurl(),
|
||||
'$title' => t('Export personal data'),
|
||||
'$options' => $options
|
||||
));
|
||||
|
||||
|
||||
}
|
||||
|
||||
function _uexport_multirow($query) {
|
||||
$result = array();
|
||||
$r = q($query);
|
||||
if(count($r)) {
|
||||
foreach($r as $rr){
|
||||
$p = array();
|
||||
foreach($rr as $k => $v)
|
||||
$p[$k] = $v;
|
||||
$result[] = $p;
|
||||
}
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
function _uexport_row($query) {
|
||||
$result = array();
|
||||
$r = q($query);
|
||||
if(count($r)) {
|
||||
foreach($r as $rr)
|
||||
foreach($rr as $k => $v)
|
||||
$user[$k] = $v;
|
||||
$result[$k] = $v;
|
||||
|
||||
}
|
||||
$contact = array();
|
||||
$r = q("SELECT * FROM `contact` WHERE `uid` = %d ",
|
||||
intval(local_user())
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
function uexport_account($a){
|
||||
|
||||
$user = _uexport_row(
|
||||
sprintf( "SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval(local_user()) )
|
||||
);
|
||||
if(count($r)) {
|
||||
foreach($r as $rr)
|
||||
foreach($rr as $k => $v)
|
||||
$contact[][$k] = $v;
|
||||
|
||||
}
|
||||
|
||||
$profile = array();
|
||||
$r = q("SELECT * FROM `profile` WHERE `uid` = %d ",
|
||||
intval(local_user())
|
||||
|
||||
$contact = _uexport_multirow(
|
||||
sprintf( "SELECT * FROM `contact` WHERE `uid` = %d ",intval(local_user()) )
|
||||
);
|
||||
if(count($r)) {
|
||||
foreach($r as $rr)
|
||||
foreach($rr as $k => $v)
|
||||
$profile[][$k] = $v;
|
||||
}
|
||||
|
||||
$output = array('user' => $user, 'contact' => $contact, 'profile' => $profile );
|
||||
|
||||
header("Content-type: application/json");
|
||||
$profile =_uexport_multirow(
|
||||
sprintf( "SELECT * FROM `profile` WHERE `uid` = %d ", intval(local_user()) )
|
||||
);
|
||||
|
||||
$photo = _uexport_multirow(
|
||||
sprintf( "SELECT * FROM photo WHERE uid = %d AND profile = 1", intval(local_user()) )
|
||||
);
|
||||
foreach ($photo as &$p) $p['data'] = bin2hex($p['data']);
|
||||
|
||||
$pconfig = _uexport_multirow(
|
||||
sprintf( "SELECT * FROM pconfig WHERE uid = %d",intval(local_user()) )
|
||||
);
|
||||
|
||||
$group = _uexport_multirow(
|
||||
sprintf( "SELECT * FROM group WHERE uid = %d",intval(local_user()) )
|
||||
);
|
||||
|
||||
$group_member = _uexport_multirow(
|
||||
sprintf( "SELECT * FROM group_member WHERE uid = %d",intval(local_user()) )
|
||||
);
|
||||
|
||||
$output = array(
|
||||
'version' => FRIENDICA_VERSION,
|
||||
'schema' => DB_UPDATE_VERSION,
|
||||
'baseurl' => $a->get_baseurl(),
|
||||
'user' => $user,
|
||||
'contact' => $contact,
|
||||
'profile' => $profile,
|
||||
'photo' => $photo,
|
||||
'pconfig' => $pconfig,
|
||||
'group' => $group,
|
||||
'group_member' => $group_member,
|
||||
);
|
||||
|
||||
//echo "<pre>"; var_dump(json_encode($output)); killme();
|
||||
echo json_encode($output);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* echoes account data and items as separated json, one per line
|
||||
*/
|
||||
function uexport_all(&$a) {
|
||||
|
||||
uexport_account($a);
|
||||
|
||||
$r = q("SELECT count(*) as `total` FROM `item` WHERE `uid` = %d ",
|
||||
intval(local_user())
|
||||
);
|
||||
|
@ -66,7 +194,4 @@ function uexport_init(&$a) {
|
|||
echo json_encode($output);
|
||||
}
|
||||
|
||||
|
||||
killme();
|
||||
|
||||
}
|
50
mod/uimport.php
Normal file
50
mod/uimport.php
Normal file
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
/**
|
||||
* View for user import
|
||||
*/
|
||||
|
||||
require_once("include/uimport.php");
|
||||
|
||||
function uimport_post(&$a) {
|
||||
switch($a->config['register_policy']) {
|
||||
case REGISTER_OPEN:
|
||||
$blocked = 0;
|
||||
$verified = 1;
|
||||
break;
|
||||
|
||||
case REGISTER_APPROVE:
|
||||
$blocked = 1;
|
||||
$verified = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
case REGISTER_CLOSED:
|
||||
if((! x($_SESSION,'authenticated') && (! x($_SESSION,'administrator')))) {
|
||||
notice( t('Permission denied.') . EOL );
|
||||
return;
|
||||
}
|
||||
$blocked = 1;
|
||||
$verified = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (x($_FILES,'accountfile')){
|
||||
// TODO: pass $blocked / $verified, send email to admin on REGISTER_APPROVE
|
||||
import_account($a, $_FILES['accountfile']);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
function uimport_content(&$a) {
|
||||
$tpl = get_markup_template("uimport.tpl");
|
||||
return replace_macros($tpl, array(
|
||||
'$regbutt' => t('Import'),
|
||||
'$import' => array(
|
||||
'title' => t("Move account"),
|
||||
'text' => t("You can move here an account from another Friendica server. <br>
|
||||
You need to export your account form the old server and upload it here. We will create here your old account with all your contacts. We will try also to inform you friends that you moved here.<br>
|
||||
<b>This feature is experimental. We can't move here contacts from ostatus network (statusnet/identi.ca) or from diaspora"),
|
||||
'field' => array('accountfile', t('Account file'),'<input id="id_accountfile" name="accountfile" type="file">', t('To export your accont, go to "Settings->Export your porsonal data" and select "Export account"')),
|
||||
),
|
||||
));
|
||||
}
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
|
||||
function po2php_run($argv, $argc) {
|
||||
function po2php_run(&$argv, &$argc) {
|
||||
|
||||
if ($argc!=2) {
|
||||
print "Usage: ".$argv[0]." <file.po>\n\n";
|
||||
|
|
17
view/atom_relocate.tpl
Normal file
17
view/atom_relocate.tpl
Normal file
|
@ -0,0 +1,17 @@
|
|||
|
||||
<dfrn:relocate>
|
||||
|
||||
<dfrn:url>$url</dfrn:url>
|
||||
<dfrn:name>$name</dfrn:name>
|
||||
<dfrn:photo>$photo</dfrn:photo>
|
||||
<dfrn:thumb>$thumb</dfrn:thumb>
|
||||
<dfrn:micro>$micro</dfrn:micro>
|
||||
<dfrn:request>$request</dfrn:request>
|
||||
<dfrn:confirm>$confirm</dfrn:confirm>
|
||||
<dfrn:notify>$notify</dfrn:notify>
|
||||
<dfrn:poll>$poll</dfrn:poll>
|
||||
<dfrn:sitepubkey>$sitepubkey</dfrn:sitepubkey>
|
||||
|
||||
|
||||
</dfrn:relocate>
|
||||
|
File diff suppressed because it is too large
Load diff
|
@ -58,7 +58,7 @@ $a->strings["Tag removed"] = "Tag entfernt";
|
|||
$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
|
||||
$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
|
||||
$a->strings["Remove"] = "Entfernen";
|
||||
$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
|
||||
$a->strings["%1\$s welcomes %2\$s"] = "%1\$s heißt %2\$s herzlich willkommen";
|
||||
$a->strings["Authorize application connection"] = "Verbindung der Applikation autorisieren";
|
||||
$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
|
||||
$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
|
||||
|
@ -74,9 +74,8 @@ $a->strings["Profile Photos"] = "Profilbilder";
|
|||
$a->strings["Album not found."] = "Album nicht gefunden.";
|
||||
$a->strings["Delete Album"] = "Album löschen";
|
||||
$a->strings["Delete Photo"] = "Foto löschen";
|
||||
$a->strings["was tagged in a"] = "wurde getaggt in einem";
|
||||
$a->strings["photo"] = "Foto";
|
||||
$a->strings["by"] = "von";
|
||||
$a->strings["%1\$s was tagged in %2\$s by %3\$s"] = "%1\$s wurde von %3\$s in %2\$s getaggt";
|
||||
$a->strings["a photo"] = "einem Foto";
|
||||
$a->strings["Image exceeds size limit of "] = "Die Bildgröße übersteigt das Limit von ";
|
||||
$a->strings["Image file is empty."] = "Bilddatei ist leer.";
|
||||
$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
|
||||
|
@ -253,7 +252,7 @@ $a->strings["The database configuration file \".htconfig.php\" could not be writ
|
|||
$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
|
||||
$a->strings["<h1>What next</h1>"] = "<h1>Wie geht es weiter?</h1>";
|
||||
$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
|
||||
$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
|
||||
$a->strings["l F d, Y \\@ g:i A"] = "l, d. F Y\\, H:i";
|
||||
$a->strings["Time Conversion"] = "Zeitumrechnung";
|
||||
$a->strings["Friendica provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das Teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
|
||||
$a->strings["UTC time: %s"] = "UTC Zeit: %s";
|
||||
|
@ -689,6 +688,7 @@ $a->strings["Choose a profile nickname. This must begin with a text character. Y
|
|||
$a->strings["Choose a nickname: "] = "Spitznamen wählen: ";
|
||||
$a->strings["Register"] = "Registrieren";
|
||||
$a->strings["People Search"] = "Personensuche";
|
||||
$a->strings["photo"] = "Foto";
|
||||
$a->strings["status"] = "Status";
|
||||
$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
|
||||
$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
|
||||
|
@ -826,7 +826,7 @@ $a->strings["Use PHP UTF8 regular expressions"] = "PHP UTF8 Ausdrücke verwenden
|
|||
$a->strings["Show Community Page"] = "Gemeinschaftsseite anzeigen";
|
||||
$a->strings["Display a Community page showing all recent public postings on this site."] = "Zeige die Gemeinschaftsseite mit allen öffentlichen Beiträgen auf diesem Server.";
|
||||
$a->strings["Enable OStatus support"] = "OStatus Unterstützung aktivieren";
|
||||
$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Biete die eingebaute OStatus (identi.ca, status.net, etc.) Unterstützung an. Jede Kommunikation in OStatus ist öffentlich, so Privatsphäre Warnungen werden bei Bedarf angezeigt.";
|
||||
$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Biete die eingebaute OStatus (identi.ca, status.net, etc.) Unterstützung an. Jede Kommunikation in OStatus ist öffentlich, Privatsphäre Warnungen werden nur bei Bedarf angezeigt.";
|
||||
$a->strings["Enable Diaspora support"] = "Diaspora-Support aktivieren";
|
||||
$a->strings["Provide built-in Diaspora network compatibility."] = "Verwende die eingebaute Diaspora-Verknüpfung.";
|
||||
$a->strings["Only allow Friendica contacts"] = "Nur Friendica-Kontakte erlauben";
|
||||
|
@ -1973,6 +1973,7 @@ $a->strings["Please enter a video link/URL:"] = "Bitte Link/URL zum Video einfü
|
|||
$a->strings["Please enter an audio link/URL:"] = "Bitte Link/URL zum Audio einfügen:";
|
||||
$a->strings["Tag term:"] = "Tag:";
|
||||
$a->strings["Where are you right now?"] = "Wo hältst du dich jetzt gerade auf?";
|
||||
$a->strings["Delete item(s)?"] = "Einträge löschen?";
|
||||
$a->strings["permissions"] = "Zugriffsrechte";
|
||||
$a->strings["Click here to upgrade."] = "Zum Upgraden hier klicken.";
|
||||
$a->strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Obergrenze deines Abonnements.";
|
||||
|
|
|
@ -55,6 +55,7 @@
|
|||
<input type="submit" name="submit" id="register-submit-button" value="$regbutt" />
|
||||
</div>
|
||||
<div id="register-submit-end" ></div>
|
||||
|
||||
</form>
|
||||
|
||||
$license
|
||||
|
|
9
view/uexport.tpl
Normal file
9
view/uexport.tpl
Normal file
|
@ -0,0 +1,9 @@
|
|||
<h3>$title</h3>
|
||||
|
||||
|
||||
{{ for $options as $o }}
|
||||
<dl>
|
||||
<dt><a href="$baseurl/$o.0">$o.1</a></dt>
|
||||
<dd>$o.2</dd>
|
||||
</dl>
|
||||
{{ endfor }}
|
11
view/uimport.tpl
Normal file
11
view/uimport.tpl
Normal file
|
@ -0,0 +1,11 @@
|
|||
<form action="uimport" method="post" id="uimport-form" enctype="multipart/form-data">
|
||||
<h1>$import.title</h1>
|
||||
<p>$import.text</p>
|
||||
{{inc field_custom.tpl with $field=$import.field }}{{ endinc }}
|
||||
|
||||
|
||||
<div id="register-submit-wrapper">
|
||||
<input type="submit" name="submit" id="register-submit-button" value="$regbutt" />
|
||||
</div>
|
||||
<div id="register-submit-end" ></div>
|
||||
</form>
|
Loading…
Reference in a new issue