PHP - Döngü her dosya için sunucu ve çalışma komut dosyalar yoluyla

2 Cevap php

Ben yapmak ne çalışıyorum mümkün olduğunca iyi anlatmaya çalışacağım.

Ben yaklaşık 100 xml dosyaları ile bir sunucu üzerinde bir klasör var. Bu xml dosyaları metin ve bir API üzerinden bir wiki itti olacak sunucu üzerinde ek dosya referansları ile içerik sayfalarıdır.

Bir anda tüm çalışma ince 1 XML dosyası var ama ben her biri döngü istiyorum ve benim onlara komut dosyasını yayınlamak çalıştırın.

Ben opendir ve readdir ile çalıştı ve hata olmamasına rağmen, sadece zaten bir dosya alır.

Birisi bana yapmam gerekenleri bir fikir verebilir. Ben PHP için çok yeni değilim, bu yüzden benim kod muhtemelen çok hoş değil benim ilk PHP proje!

İşte benim kod çok uzak.

The functions that gets the XML content from the XML file:

<?php
function gettitle($file)
{
    $xml = simplexml_load_file($file);
    $xmltitle = $xml->xpath('//var[@name="HEADLINE"]/string');
    return $xmltitle[0];
}

function getsummary($file)
{
    $xml = simplexml_load_file($file);
    $xmlsummary = $xml->xpath('//var[@name="summary"]/string');
    return $xmlsummary[0];
}

function getsummarymore($file)
{
    $xml = simplexml_load_file($file);
    $xmlsummarymore = $xml->xpath('//var[@name="newslinetext"]/string');
    return $xmlsummarymore[0];
}

function getattachments($file)
{
    $xml = simplexml_load_file($file);
    $xmlattachments = $xml->xpath('//var[@name="attachment"]/string');
    return $xmlattachments[0];
}
?>

Here's the main publish script which pushes the content to the wiki:

<?php
// include required classes for the MindTouch API
include('../../deki/core/dream_plug.php');
include('../../deki/core/deki_result.php');
include('../../deki/core/deki_plug.php');

//Include the XML Variables
include('loadxmlfunctions.php');

//Path to the XML files on the server
$path = "/var/www/dekiwiki/skins/importscript/xmlfiles";

// Open the XML file folder 
$dir_handle = @opendir($path) or die("Unable to open $path");

// Loop through the files
while ($xmlfile = readdir($dir_handle)) { 
if($xmlfile == "." || $xmlfile == ".." || $xmlfile == "index.php" )
    continue;

//Get XML content from the functions and put in the initial variables
$xmltitle = gettitle($xmlfile);
$xmlsummary = getsummary($xmlfile);
$xmlsummarymore = getsummarymore($xmlfile);
$xmlattachments = getattachments($xmlfile);

//Build the variables for the API from the XML content

//Create the page title - replace spaces with underscores
$pagetitle = str_replace(" ","_",$xmltitle);

//Create the page path variable
$pagepath = '%252f' . str_replace("'","%27",$pagetitle);

//Strip HTML from the $xmlsummary and xmlsummarymore
$summarystripped = strip_tags($xmlsummary . $xmlsummarymore, '<p><a>');
$pagecontent = $summarystripped;

//Split the attachments into an array
$attachments = explode("|", $xmlattachments);

//Create the variable with the filenames
$pagefilenames = '=' . $attachments;

$pagefilenamefull = $xmlattachments;

//Create the variable with the file URL - Replace the URL below to the correct one
$pagefileurl = 'http://domain/skins/importscript/xmlfiles/';

//authentication
$username = 'admin';
$password = 'password';

// connect via proxy
$Plug = new DreamPlug('http://domain/@api');
// setup the deki api location
$Plug = $Plug->At('deki');

//authenticate with the following details
$authResult = $Plug->At('users', 'authenticate')->WithCredentials($username, $password)->Get();
$authToken = $authResult['body'];
$Plug = $Plug->With('authtoken', $authToken);

// Upload the page content - http://developer.mindtouch.com/Deki/API_Reference/POST:pages//%7Bpageid%7D//contents
$Plug_page = $Plug->At('pages', '=Development%252f' . $pagetitle, 'contents')->SetHeader('Expect','')->Post($pagecontent);

// Upload the attachments - http://developer.mindtouch.com/MindTouch_Deki/API_Reference/PUT:pages//%7Bpageid%7D//files//%7Bfilename%7D
for($i = 0; $i < count($attachments); $i++){
    $Plug_attachment = $Plug->At('pages', '=Development' . $pagepath, 'files', '=' . $attachments[$i])->SetHeader('Expect','')->Put($pagefileurl . $attachments[$i]);
}

}

//Close the XMl file folder
closedir($dir_handle);

?>

Herhangi bir yardım için teşekkür ederiz!

2 Cevap

XML dosyaları bir dizin hareket için sadece yapabilirsiniz:

$files = glob("$path/*.xml");

foreach($files as $file)
{
    $xml = simplexml_load_file($file);

    $xmltitle = gettitle($xml);
    $xmlsummary = getsummary($xml);
    $xmlsummarymore = getsummarymore($xml);
    $xmlattachments = getattachments($xml);
}

Ben de bunu SimpleXML ihtiyacınız özelliklerini almak için aynı dosyayı dört kez ayrıştırmak gerekmez kodunuzu küçük bir ayar yapmanızı öneririz:

function gettitle($xml)
{
    $xmltitle = $xml->xpath('//var[@name="HEADLINE"]/string');
    return $xmltitle[0];
}

function getsummary($xml)
{
    $xmlsummary = $xml->xpath('//var[@name="summary"]/string');
    return $xmlsummary[0];
}

function getsummarymore($xml)
{
    $xmlsummarymore = $xml->xpath('//var[@name="newslinetext"]/string');
    return $xmlsummarymore[0];
}

function getattachments($xml)
{
    $xmlattachments = $xml->xpath('//var[@name="attachment"]/string');
    return $xmlattachments[0];
}

Sizin ise döngü ile değiştirmeyi deneyin ve daha iyi dışarı yardımcı olmadığını görmek:

while (false !== ($xmlfile = readdir($dir_handle)))

Bana haber ver.

EDIT:

Eski yol kullanılarak, yanlış değerlendirilir ve döngü durmuş olabilir, bir dizin isim olabilirdi, ben önerilen yol readdir {alınan kullanırken bir dizin üzerinde döngü için doğru yol olarak kabul edilir [(1)]}