Yukarıdaki çıtkı senin verilere ulaşmanı pek sağlamaz. 4 satırdan hangisi sertifika adı hangisi tutar tespit etmen zor.
Birinci örneğimde satır ekletip indis verdirirsen ["name"=>"Sertifika 1", "amount"=>"500.5"] gibi anahtar=>değer şeklinde bir nesne oluşur.
foreach($_POST[sf] as $val) {$val["name"]."-".$val["amount"]} kullanarak değerlere ulaşabilirsin.
Birinci yöntem aslında güzel kötü tarafı indis verdirmek, belki özel bir kullanımı vardır ama ben bilmiyorum.
Şimdilik js.Jquery yardımı ile yeni satır ekletirken indis ekletilebilir.
İkinci yöntem indis vermek istemezsen yapabileceğin bir yöntem.
Birinci Yöntem
<form action="test.php" method="post">
<div class="row">
<input type="text" name="sf[0][name]" value="Sertifika 1">
<input type="number" name="sf[0][amount]" value="300">
</div>
<div class="row">
<input type="text" name="sf[1][name]" value="Sertifika 2">
<input type="number" name="sf[1][amount]" value="400.50">
</div>
<input type="submit" value="Kaydet">
</form>
<script>
$("#plus").on("click", ()=>{
let indis = $("#sertifikalar").find(".row").length
let insertRow = `<div class="row"><input type="text" name="sf[${indis}][name]" value="Sertifika 1">`
insertRow += `<input type="number" name="sf[${indis}][amount]" value="1000.50"></div>`
$("#sertifikalar").append(insertRow)
})
</script>
Array
(
[sf] => Array
(
[0] => Array
(
[name] => Sertifika 1
[amount] => 300
)
[1] => Array
(
[name] => Sertifika 2
[amount] => 400.50
)
)
)
Bu çıktı pek hoşuma gitmedi. foreach($_POST[sf][name] as $key=>$val) ile $key yardımı ile $_POST[sf][name][$key]."-".$_POST[sf][amount][$key] kullanarak bilgilere ulaşabilirsin.
İkinci Yöntem
<form action="test.php" method="post">
<div>
<input type="text" name="sf[name][]" value="Sertifika 1">
<input type="number" name="sf[amount][]" value="300">
</div>
<div>
<input type="text" name="sf[name][]" value="Sertifika 2">
<input type="number" name="sf[amount][]" value="400.50">
</div>
<input type="submit" value="Kaydet">
</form>
Array
(
[sf] => Array
(
[name] => Array
(
[0] => Sertifika 1
[1] => Sertifika 2
)
[amount] => Array
(
[0] => 300
[1] => 400.50
)
)
)
Doğru diyorsun paylaşmam gerekirdi.
Yalnız muhasebe bürosunda çalıştığım için hem sorunu çözmek hem muhasebe işleri ile uğraşmak epey vaktimi almıştı.
O zamanlar aklımdan uçup gitmiş. :)
Oturum açtıktan sonra pro hesabın sayfası https://uygulama.parasut.com/id/
Ben konuyu paylaştığım zamanlarda sorunu php tarafında çözmüştüm yalnız ben kullanıcı id bilgisini bildiğim için giriş yaptıktan sonra direk istek attırıyorum.
Aşağıdaki kodlar oturum açmak için.
$parasut_login = curl_init();
curl_setopt($parasut_login, CURLOPT_URL, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_REFERER, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt($parasut_login, CURLOPT_RETURNTRANSFER, true);
curl_setopt($parasut_login, CURLOPT_COOKIEJAR, "parasut.txt");
curl_setopt($parasut_login, CURLOPT_COOKIEFILE, "parasut.txt");
preg_match_all('<input type="hidden" name="authenticity_token" value="(.*?)">', curl_exec($parasut_login), $authenticity_token);
curl_setopt($parasut_login, CURLOPT_URL, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_REFERER, "https://uygulama.parasut.com/kullanici-girisi");
curl_setopt($parasut_login, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]);
curl_setopt_array($parasut_login, [
CURLOPT_USERAGENT => "https://uygulama.parasut.com/kullanici-girisi",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"],
CURLOPT_POST => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_POSTFIELDS => [
'authenticity_token' => $authenticity_token[1][0],
'user[email]' => '[email protected]',
'user[password]' => '****',
'user[remember_me]' => '0',
'commit' => 'OTURUM AÇ'
],
CURLOPT_COOKIEFILE => 'parasut.txt'
]);
curl_exec($parasut_login);
Aşağıdaki kodlar da satış faturalarını listelemek için...
$kid = 11111;
curl_setopt($parasut_login, CURLOPT_URL, "https://api.parasut.com/v4/$kid/sales_invoices?filter%5Barchived%5D=false&filter%5Brecurring%5D=false&filter%5Bquery%5D=&filter%5Bsharing_status%5D=&filter%5Bpayment_status%5D=&filter%5Bprint_status%5D=&filter%5Bissue_date%5D%5Bgteq%5D=" . date('Y-m-d', strtotime($donem)) . "&filter%5Bissue_date%5D%5Blteq%5D=" . date('Y-m-t', strtotime($donem)) . "&filter%5Bitem_type%5D=invoice%2Crefund%2Cestimate%2Cexport&filter%5Bcategory%5D=&filter%5Btag_ids%5D=&include=category%2Ctags%2Ccontact%2Cactive_e_document%2Cfailed_e_invoice&order_scope=order_by_remaining_desc&page%5Bnumber%5D=1");
curl_setopt_array($parasut_login, [
CURLOPT_USERAGENT => "https://uygulama.parasut.com/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERAGENT => $_SERVER["HTTP_USER_AGENT"],
CURLOPT_POST => false,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_MAXREDIRS => 0,
CURLOPT_COOKIEFILE => 'parasut.txt'
]);
$result = json_decode(curl_exec($parasut_login), true);
Bir de çerezler konusunda COOKIEFILE ve COOKIEJAR kullanmaya gerek var mı emin değilim?
Ben şimdi interaktif ve defter beyan için oturum açma veri çekme ile ilgili uygulama yapmaya çalışıyorum oturum kapatma aşamasına kadar kullanmıyorum.
Sanırsam curl_close() kullanıldığı zaman gerek duyuluyor.
@alihan hangi konuda nodejs mi yoksa php mi?
Teşekkür ederim fakat çalışmadı. Ama ben çözümünü buldum. Har değerlerini kontrol ettim postData.mimeType değeri json belirtilmiş.
Ben text belirtmeme rağmen yanlış yöntemle gidiyormuş.
CURLOPT_HTTPHEADER => array("content-type: application/json") yapınca veriler geldi.
{
"postData": {
"mimeType": "application/json; charset=UTF-8",
"params": [],
"text": "21541265-45ce-4064-b2ab-a98107857398"
}
}
Yalnız başlık bilgilerini dizi olarak alabilmem mümkün mü?
HTTP/1.1 200
Set-Cookie: JSESSIONID=63D6B8E04778547F25B3ABBB20B5E94D; Path=/; HttpOnly
Server-Time: 1658310818544
Token: **************
Content-Type: application/json;charset=UTF-8
Content-Length: 133
Date: Wed, 20 Jul 2022 09:53:38 GMT
@thenerepe teşekkürler. Yalnız !, *3 gibi tetikleyici kullanıldığında önizleme çalışmıyor.
C:\users\KullaniciAdi\Appdata\Roaming\Code\User\snippets\
konumunda html.json adlı json dosyası yoksa oluşturup aşağıdaki gibi örnekte olduğu gibi değerler girerseniz.
İhtiyacınız olduğunda prefix değerini yazarak tetikleyici kullanarak otomatik kod oluşturabilirsiniz.
"!jquery": {
"prefix": "!jquery-jsdelivr",
"body": [
"<script src=\"https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js\"></script>"
]
}
php için php.json
"php": {
"prefix": "php",
"body": [
"<?php",
"\t$1",
"?>"
],
"description": "php tag"
},
"!php-mysqli-connect": {
"prefix": "!mysqli-connect",
"body": [
"mysqli_connect(\"localhost\", \"user\",\"password\",\"dbName\")"
],
"description": "MySqli Connect Line"
},
"!php-mssql-connect": {
"prefix": "!mssql-connect",
"body": [
"sqlsrv_connect($$serverName, ['Database' => $$database, 'UID' => 'zirvenet', 'PWD' => 'zrvsql', 'CharacterSet' => 'UTF-8']);"
],
"description": "MsSqli Connect Line"
}
javascript için javascript.json
"arrowA": {
"prefix": "arrowA",
"body": [
"() => {",
"\t$1",
"}"
]
},
"ConsoleLog": {
"prefix": "csl",
"body": [
"console.log($1);",
]
}
"&fn=" + "istekadi" sana kalmış ek bilgi göndermek istersen diye ekledim. Zamanında bu konuda takılmıştım. Belki lazım olur eklemek istedim.
$.post("post.php", $("form").serialize() + "&fn=" + "istekadi", (response)=>{
console.log(res);
},"json") // "xml", "html", "text"
Sen sorgulama sonrası oluşan "tabloyu dışarı aktar > Csv for MS Excel" seçeneği ile mi alıyorsun?
Eğer böyle aktarıyorsan csv dosyasının içine değerler metin olarak "100.4" şeklinde yazılıyor. Metin olarak saklandığı için de metin olarak görünür.
Aslında sistemde verü türü sayı, ondalık olanları otomatik sayı olarak saklayıp indirmesi daha mantıklı olurdu.
Excel ile açtıktan sonra sayısal sütunları seç Ctrl+H ile noktaları virgüle çevir.
Aşağıdaki kodları bir php sayfasına yapıştır.
$xmlDom->loadXML(file_get_contents("xmlFile.xml")); Dosyayı sistemine kaydettirdiğin için
Xml dosyasının konumunu da atayabilir veya hazır xml dosyasının adını da yazıp deneyebilirsin...
Sonra kodları analiz edip gerisini kendin çözümlersin.
<table>
<thead>
<tr>
<th>
Miktar
</th>
<th>
Mal Hizmet Adı
</th>
<th>
Tutar
</th>
</tr>
</thead>
<tbody>
<?php
// XmlGird kullandığında bir değere Show Xpath ile konumunu aldığında '/Invoice/cac:InvoiceLine[1]/cac:Item/cbc:Name'
// ('//cac:InvoiceLine/cac:Item/cbc:Name')->item($key) yapmalısın aksi durumda değere ulaşamıyorsun.
$xmlDom = new DOMDocument();
$xmlDom->preserveWhiteSpace = false;
$xmlDom->loadXML(file_get_contents("xmlFile.xml"));
$xpath = new DOMXPath($xmlDom);
$invoiceLine = @$xpath->query('//cac:InvoiceLine');
foreach ($invoiceLine as $key => $val) {
$invoiceLine = [
"ID" => @$xpath->query("//cac:InvoiceLine/cbc:ID")->item($key)->nodeValue,
"InvoicedQuantity" => @$xpath->query("//cac:InvoiceLine/cbc:InvoicedQuantity")->item($key)->nodeValue,
"LineExtensionAmount" => @$xpath->query("//cac:InvoiceLine/cbc:LineExtensionAmount")->item($key)->nodeValue,
"ItemName" => @$xpath->query("//cac:InvoiceLine/cac:Item/cbc:Name")->item($key)->nodeValue,
"ItemID" => @$xpath->query("//cac:InvoiceLine/cac:Item/cac:SellersItemIdentification/cbc:ID")->item($key)->nodeValue,
"Price" => @$xpath->query("//cac:InvoiceLine/cac:Price/cbc:PriceAmount")->item($key)->nodeValue,
];
$tr = "<tr><td>$invoiceLine[LineExtensionAmount]</td><td>$invoiceLine[ItemName]</td><td>$invoiceLine[Price]</td></tr>"
?>
<?= $tr ?>
<?php
}
?>
</tbody>
</table>
Arkadaşım anladığım kadarı ile faturanın xml dosyasını post ediyorsun ve php tarafına yorumlatıyorsun.
Eğer veritabanına kaydetmen ve sunucu tarafında kullanman gerekmiyorsa php kullanmana gerek yok.
Jquery kütüphanesini kullanarak Javascript ile çözebilirsin çünkü ben yapmıştım.
https://tr-sherlock.com/earsivxml adresinden xml dosyalarını tablo haline getirtiyorum. JS Kodlarını inceleyebilirsin.
Sitemdeki uzun zaman önceydi ama aydınlatıcı olur. Yerelde kullandığım Js kullandıkça biraz daha gelişti diyebilirim :)
İlle de php ile yapacağım dersen ben 5000/30000 bin portalından fatura sorgulama ve gelen arşiv dosyasının içindeki xml dosyasının adını değiştirerek indirmek istiyordum.
İki hafta önce araştırmalarım sonucu çözdüm. @munzevi arkadaşımızın dediği gibi new DOMDocument() ve ek olarak new DOMXPath($xmlDom) sınıflarını kullanabilirsin.
DOMXPath ise javascript xpath = div > input gibi kullanmanı sağlar. DOMXPath kullanımı ise div/input
//cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="VKN"] bir de bunu yazmakla uğraşmaman için
xmlgird.net adresinden Open File kullanarak xml dosyasındaki bilgilere ulaşabilirsin.
$uniqeZip = uniqid() . ".zip"; // Geçici dosya adı oluşturur.
$zipResource = fopen($uniqeZip, "w"); // Dizine geçici dosya oluşturur.
$zip_curl = curl_init($_POST["downUrl"]); // 5000/30000 portalındaki faturaya ait bağlantı alınır.
curl_setopt($zip_curl, CURLOPT_FILE, $zipResource); // Curl calıştırıldığında geçici dosyaya yazılır.
$page = curl_exec($zip_curl);
if (!$page) {
echo "Error :- " . curl_error($ch);
}
curl_close($zip_curl);
$zip = new ZipArchive;
if ($zip->open($uniqeZip) === TRUE) {
$xmlFile = $zip->getFromIndex(1)); // Arşiv dosyasında indexine göre 0.html 1.xml
$fatura = [];
$xmlDom = new DOMDocument();
$xmlDom->preserveWhiteSpace = false;
$xmlDom->loadXML($xmlFile);
$xpath = new DOMXPath($xmlDom);
$fatura["ID"] = $xpath->query('//cbc:ID')->item(0)->nodeValue;
$fatura["saticiVKN"] = @$xpath->query('//cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="VKN"]')->item(0)->nodeValue;
$fatura["saticiTCKN"] = @$xpath->query('//cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="TCKN"]')->item(0)->nodeValue;
$fatura["aliciVKN"] = @$xpath->query('//cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="VKN"]')->item(0)->nodeValue;
$fatura["aliciTCKN"] = @$xpath->query('//cac:AccountingCustomerParty/cac:Party/cac:PartyIdentification/cbc:ID[@schemeID="TCKN"]')->item(0)->nodeValue;
$aliciVKN = $fatura["aliciVKN"] == null ? $fatura["aliciTCKN"] : $fatura["aliciVKN"];
$saticiVKN = $fatura["saticiVKN"] == null ? $fatura["saticiTCKN"] : $fatura["saticiVKN"];
// echo json_encode([
// "xmlName" => "@$saticiVKN@$fatura[ID]@$aliciVKN.xml",
// "xmlString" => $xmlFile
// ]);
$zip->close();
} else {
echo 'failed';
}
unlink($uniqeZip);
#YUKARIDAKİ KODLAR LAZIM OLURSA KULLANIRSI
// XmlGird kullandığında bir değere Show Xpath ile konumunu aldığında '/Invoice/cac:InvoiceLine[1]/cac:Item/cbc:Name'
// ('//cac:InvoiceLine/cac:Item/cbc:Name')->item($key) yapmalısın aksi durumda değere ulaşamıyorsun.
$invoiceLine = @$xpath->query('//cac:InvoiceLine');
forEach($invoiceLine as $key=>$val) {
print_r([
"ID"=> @$xpath->query("//cac:InvoiceLine/cbc:ID")->item($key)->nodeValue,
"InvoicedQuantity"=> @$xpath->query("//cac:InvoiceLine/cbc:InvoicedQuantity")->item($key)->nodeValue,
"LineExtensionAmount"=> @$xpath->query("//cac:InvoiceLine/cbc:LineExtensionAmount")->item($key)->nodeValue,
"ItemName" => @$xpath->query("//cac:InvoiceLine/cac:Item/cbc:Name")->item($key)->nodeValue,
"ItemID" => @$xpath->query("//cac:InvoiceLine/cac:Item/cac:SellersItemIdentification/cbc:ID")->item($key)->nodeValue,
]);
}