Çalışan bir örneği incelemek için codepen hesabıma bakabilirsiniz: https://codepen.io/ebykdrms/pen/yLKyLgX
codepen'den silinirse diye burada da kodları paylaşıyorum:
Diyelim ki şöyle bir html yapınız var:
<div id="content">
<div class="selectbox-wrapper">
<select name="product[]">
<option value=0 selected>ÜRÜN SEÇİNİZ</option>
</select>
<button>Sil</button>
</div>
<div class="button-wrapper">
<button disabled>+ Yeni Ekle</button>
</div>
</div>
Örnek olarak şöyle bir yapı kurulabilir:
// Seçilebilecek Ürünlerimiz
const products = [
{ id: 1, name: "Ürün 1" },
{ id: 2, name: "Ürün 2" },
{ id: 3, name: "Ürün 3" },
{ id: 4, name: "Ürün 4" }
];
// Seçilmiş ürünlerimizi tutacak bir dizi.
const selectedProducts = [];
/**************************************/
// DOM'dan kullanacağımız elementleri (başlangıçta hazır olanları) değişkenlere alıyoruz:
const $content = $("#content");
const $addNewProductButton = $content.find(".button-wrapper button").prop("disabled",true);
/**************************************/
// Bir selectbox'a istediğimiz ürünleri append edebildiğimiz fonksiyon:
function addProductsToSelectBox($selectbox, products) {
for(let i=0; i < products.length; i++) {
$selectbox.append('<option value="'+products[i].id+'">'+products[i].name+'</option>');
}
}
// Yeni select elementi ekleyen fonksiyon:
function addNewProductSelectBox($willCloneSelectBox) {
// Parametrelerden gelen elementi clone ediyoruz.
const $newProductSelectBox = $willCloneSelectBox.clone();
// Butonun üstüne bu klonu ekliyoruz.
$addNewProductButton.parent().before($newProductSelectBox.hide());
// Select elementinin bir fade efektiyle görünmesini sağlıyoruz.
$newProductSelectBox.fadeIn(300);
// Yeni bir select elementi geldiyse henüz seçim yapılmamıştır.
// Seçim yapılmamış bir select elementi varsa buton pasif olmalı.
$addNewProductButton.prop("disabled",true);
}
// Select elementinin yanındaki "Sil" butonuna tıklandığında...
$content.on("click",".selectbox-wrapper button", function(){
// Butonun kapsayan selectbox-wrapper elementini seçelim.
const $wrapper = $(this).closest(".selectbox-wrapper");
// Eğer bu tıklanan ilk selectbox ise (normalde olmamalı ama) silme fonksiyonu çalışmayacak.
if($wrapper.index()==0) return;
// Elementi direkt siliyoruz:
$wrapper.remove();
})
/**************************************/
// Başlangıçta elimizde olan ilk select elementine ürünleri ekliyoruz:
addProductsToSelectBox($content.find(".selectbox-wrapper > select"), products);
// "+ Yeni Ekle" butonuna tıklandığında...
$addNewProductButton.on("click",function(){
// Son eklenmiş olan .selectbox-wrapper klonlanarak yeni bir .selectbox-wrapper oluşturulacak:
addNewProductSelectBox($content.find(".selectbox-wrapper").last());
});
// Herhangi bir select elementinden seçim yapıldığında...
$content.on("change",".selectbox-wrapper select", function(){
// Değişim yaşanan select elementinin bize lazım verilerini alalım:
const selectboxIndex = $(this).parent().index();
const selectedValue = $(this).val();
const selectedText = $(this).find("option:selected").text();
// Eğer seçilen değer 0 ise (normalde olmamalı ama)
if(selectedValue=='0') {
// Boş bir select elementi olduğu için "+ Yeni Ekle" butonu pasif olacak.
$addNewProductButton.prop("disabled",true);
// selectedProducts dizindeki ilgili index'i boşaltıyoruz.
selectedProducts[selectboxIndex] = null;
// Fonksiyonun işi burada bitmiş olacağı için fonksiyonu sonlandırıyoruz.
return;
}
// selectedProducts dizisinin ilgili index'ine seçilen ürünü ekliyoruz.
selectedProducts[selectboxIndex] = { id: selectedValue, name: selectedText };
// selectedProducts dizisini kontrol edip, herhangi bir boş seçim var mı diye bakacağız.
for(let i=0; i<selectedProducts.length; i++) {
// Eğer seçim yapılmamış bir selectbox varsa buton pasif olmalı.
if(!selectedProducts[i]) {
$addNewProductButton.prop("disabled",true);
// Fonksiyonun işi burada bittiği için return ile fonksiyonu sonlandırıyoruz.
return;
}
// Fonksiyon bu satıra kadar gelebilmişse her şey yolundadır. Butonu aktif edebiliriz.
$addNewProductButton.prop("disabled",false);
}
});
Buradaki selectedProduct dizisine muhtemelen sizin ihtiyacınız yoktur.
Ben yazmayı özlemişim, yazdıkça yazdım... Kurgusal olarak kendinize bir örnek çıkarabilirsiniz umarım.
Facebook size bir API sağlıyor. Bu API'nin özelliklerini bilmiyorum ama muhtemelen erişim yetkiniz olan verilere bu API ile ulaşabilirsiniz.
https://apikutuphanesi.com/facebook-api-nedir
// $i=1 ve $x=0 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
for (0; 0 <= 400; $x += 200) {
switch (1) { /* $i değeri 3 veya 6 olmadığı için switch koşulu sağlanmadı*/ }
echo "i: 1<br>";
$img->crop(200, 200, 0, 0)->save('img/shared-photos/1.jpg');
}
}
// $i=1 ve $x=200 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
for (200; 200 <= 400; $x += 200) {
switch (1) { /* $i değeri 3 veya 6 olmadığı için switch koşulu sağlanmadı*/ }
echo "i: 1<br>";
$img->crop(200, 200, 200, 0)->save('img/shared-photos/1.jpg');
}
}
// $i=1 ve $x=400 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
for (400; 400 <= 400; $x += 200) {
switch (1) { /* $i değeri 3 veya 6 olmadığı için switch koşulu sağlanmadı*/ }
echo "i: 1<br>";
$img->crop(200, 200, 400, 0)->save('img/shared-photos/1.jpg');
}
}
// $i=1 ve $x=600 olduğu durum:
for ($i = 1; 1 <= 9; $i++) {
for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
// $i=2 ve $x=600 olduğu durum:
for ($i = 1; 2 <= 9; $i++) {
for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
// $i=3 ve $x=600 olduğu durum:
for ($i = 1; 3 <= 9; $i++) {
for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
// $i=4 ve $x=600 olduğu durum:
for ($i = 1; 4 <= 9; $i++) {
for (600; 600 <= 400; $x += 200) { /* $x değeri 400'den büyük olduğu için for koşulu sağlanmadı */ }
}
Sorun şu ki;
$x değişkenine for içinde başlangıç değeri atamadığınız için her seferinde eski değerinden devam ediyor.
$x bir kez 400'ü geçtiğinde bir daha $x'i 0 yapacak bir komut satırına ulaşamıyor çünkü içteki döngü koşulu sağlanmadığı için switch sorgusuna ulaşılamıyor.
Aslında $i değeri 3 olduğunda döngü sonlanmıyor. $x değeri 600 olduğunda (yani içteki döngü 3 kez döndükten sonra) içteki döngünin koşulu sağlanmadığı için döngü geçersiz kalıyor.
Sizin bütün işlemleriniz de içteki döngüde olduğu için 3 kez çıktı elde edebilmiş oluyorsunuz.
Bu arada crop işlemi de aynı dosya adını birkaç kez kullanıyor. Yani içteki döngü ilk dönüşünde 1.jpg dosyası oluşuyor. İkinci dönüşünde yine 1.jpg dosyası oluşuyor. Üçüncü dönüşünde de yine 1.jpg dosyası oluşuyor. Tabi aynı dosya adı aynı klasörde olamayacağı için muhtemelen 2. ve 3. dönüşlerde 1.jpg dosyasının üzerine yazılyor.
Eğer içteki döngüde for($x=0; $x<=400; $x++) {
şeklinde $x değerini sıfırlayamayacaksanız (kurgunuz buna uygun değilse) baştan kurgulamalısınız. Çünkü bu şekliyle döngüler sağlıklı çalışıyor olsaydı bile aynı dosyayı tekrar tekrar yazma sorununuz olacaktı.
Sadece PHP ile yapacaksanız (her seçimde sayfa yenilenecek şekilde) bu <select>
elementlerini bir <form>
elementiyle sarmalayın. Bu form elementinin method
attribute'si post olsun.
Ayrıca her bir <select>
elementine onchange
attribute'si vererek değeri değiştiğinde form'un submit işlemi gerçekleştirmesini (form verilerini post yöntemiyle iletmesini) sağlayın.
Başlangıçta sadece ilk <select>
elementinin <option>
'ları PHP ile doldurulmuş olacak. Diğer <select>
elementleri boş olacak.
Diğer select elementleri sadece bir önceki select'in değeri alınabilmişse PHP tarafından doldurulacak.
<?php
// her bir select'in elemanlarını PHP dizilerinde tutuyoruz.
$car_select_1 = ["BMV","TOYOTA","MERCEDES"]; // İlk select'in elemanları baştan belli.
$car_select_2 = []; // İkinci select'in elemanları sadece ilk select'te seçim yapıldıysa doldurulacak.
$car_select_3 = []; // Üçüncü select'in elemanları sadece ikinci select'te seçim yapıldıysa doldurulacak.
$car_select_4 = []; // Dördüncü select'in elemanları sadece üçüncü select'te seçim yapıldıysa doldurulacak.
$select1 = ""; // 1.select'te seçilmiş olan değer. Şu an boş.
$select2 = ""; // 2.select'te seçilmiş olan değer. Şu an boş.
$select3 = ""; // 3.select'te seçilmiş olan değer. Şu an boş.
$select4 = ""; // 4.select'te seçilmiş olan değer. Şu an boş.
$allItems = []; // Tüm seçimler yapıldığında listelenecek araçların verilerini tutacak dizi.
// Eğer ilk select'te seçim yapılmışsa
if(isset($_POST["car_select_1"])) {
$select1 = $_POST["car_select_1"];
$car_select_2 = getSelectItems($select1, "select2"); // Bu fonksiyonu uydurdum. Burada $select1 verisini kullanarak ikinci select'e hangi verilerin geleceğini veritabanından çekmişsiniz ve $car_select_2 değişkenine atamışsınız gibi düşünün.
// $car_select_2 = ["1-Serisi", "2-Serisi", "3-Serisi"] gibi bir değer atanmış olmalı.
}
// Eğer ikinci select'te de seçim yapıldıysa ve birinci select'te seçilmiş olan değer belliyse (ilk if'e girilmiş olacağı için belli olmalı)
if($select1!="" && isset($_POST["car_select_2"]) && $_POST["car_select_2"]!="0") {
$select2 = $_POST["car_select_2"];
$car_select_3 = getSelectItems($select2, "select3"); // Bu fonksiyonla $select2 değerine bakılarak üçüncü select'te hangi veriler olacağı veritabanından çekiliyor.
// $car_select_3 = ["E81 - 2005 -> 2007", "E81 - 2008 -> 2010", "E81 - 2010 -> 2012"] gibi bir değer atanmış olmalı.
}
// Eğer ücüncü select'te de seçim yapıldıysa ve ilk iki select'in seçimleri de belliyse (ilk 2 if'e de girilmiş olacağına göre belli olmalı)
if($select1!="" && $select2!="" && isset($_POST["car_select_3"]) && $_POST["car_select_3"]!="0") {
$select3 = $_POST["car_select_3"];
$car_select_4 = getSelectItems($select3, "select4"); // Bu fonksiyonla $select3 değerine bakılarak dördücü select'te hangi veriler olacağı veritabanından çekiliyor.
// $car_select_4 = ["116i - 115HP", "120i - 230HP"] gibi bir değer atanmış olmalı.
}
// Eğer dördüncü select'te de seçim yapılmışsa artık ilgili verileri seçebiliriz.
if($select1!="" && $select2!="" && $select3!="" && isset($_POST["car_select_4"]) && $_POST["car_select_4"]!="0") {
$select4 = $_POST["car_select_4"];
$allItems = getItems($select1, $select2, $select3, $select4); // Burada da tüm seçimlere göre veritabanından listelenecek araçları getiren bir fonksiyon var.
}
// Böylece kaç tane seçim yapılmışsa ona göre verileri elimizde topladık.
// Artık bu verileri html'de göstermemiz için bütün veriler elimizde.
?>
<!-- select'lerin olduğu form elementi -->
<form method="post">
<select name="car_select_1" onchange="if(this.value != 0) { this.form.submit(); }">
<?php foreach($car_select_1 as $item) { ?>
<option <?=($item===$select1 ? "selected" : "")?> value="<?=$item?>"><?=$item?></option>
<?php } ?>
</select>
<select name="car_select_2" onchange="if(this.value != 0) { this.form.submit(); }">
<option value="0" disabled>Seçiniz</option>
<?php foreach($car_select_2 as $item) { ?>
<option <?=($item===$select2 ? "selected" : "")?> value="<?=$item?>"><?=$item?></option>
<?php } ?>
</select>
<select name="car_select_3" onchange="if(this.value != 0) { this.form.submit(); }">
<option value="0" disabled>Seçiniz</option>
<?php foreach($car_select_3 as $item) { ?>
<option <?=($item===$select3 ? "selected" : "")?> value="<?=$item?>"><?=$item?></option>
<?php } ?>
</select>
<select name="car_select_4" onchange="if(this.value != 0) { this.form.submit(); }">
<option value="0" disabled>Seçiniz</option>
<?php foreach($car_select_4 as $item) { ?>
<option <?=($item===$select4 ? "selected" : "")?> value="<?=$item?>"><?=$item?></option>
<?php } ?>
</select>
</form>
<!-- Seçilen içeriğin gösterileceği alan -->
<div>
<?php if(count($allItems)==0) { ?>
<div>Tüm select'lerde seçim yaptıktan sonra burada içerik görüntülecenek.</div>
<?php } else { ?>
<?php foreach($allItems as $item) { ?>
<div><?=print_r($item)?></div>
<?php } ?>
<?php } ?>
</div>
Kodları test etmedim. Kurgusal olarak böyle bir yapı kullanabilirsiniz.
<select>
elementlerindeki onchange
attribute'leri sayesinde herhangi bir elementte değişiklik olduğunda kapsayıcı form verileri aynı sayfaya post ediyor. Biz de sayfanın başında post edilmiş verilere göre gereken aksiyonu alıyoruz.
Kısaca cookie değiştirme işini ayrı bir sayfada yapın ve cookie oluştuktan sonra kullanıcıyı geldiği sayfaya geri gönderin.
Sayfa yenilenmiş olacağı için cookie değeri de direkt okulabilir.
Anladığım kadarıyla siz kodunuzu mesela GitLab'a göndermek istiyorsunuz.
Sonra da otomatik bir sistemin bu kodu sunuculara dağıtmasını istiyorsunuz.
Yani siz git push
dedikten sonra bu sistemin kurulu olduğu sunucularda kodunuz otomatik yenilensin istiyorsunuz.
Daha doğrusu siz kodunuzu GitLab'a gönderdikten sonra, kendi panelinizdeki bir Güncelle butonuna basarak GitLab'daki projenizin güncel halinin tüm sunuculara otomatik gönderilmesini istiyorsunuz.
2 türlüsü de mümkün. Ancak sunucuların kontrolünün sizde olması lazım.
Diyelim ki aynı projeyi hem A hem B sunucusuna kurdunuz. Bir de kendinize ait bir Merkez sunucunuz var.
Bu iki sunucuda da projenize git ekleyip GitLab hesabınıza bağlamalısınız.
Manuel olarak bu işi yapmak için:
Hem A hem B sunucularında bir web servisiniz veya projenize dahil bir endpoint'iniz olmalı. Merkez sunucunuzdaki panelinizden butona bastığınızda A ve B sunucularındaki web servisinize bir istek atmalısınız.
A ve B sunucularındaki web servis de istek geldiği zaman shell bağlantısı açıp projeye girmeli ve git pull
komutu vermeli.
Ben olsam çok daha kolay bir yöntem olan GitLab runner'larından faydalanmak yerine böyle kendi oluşturduğum yöntemi kullanmayı tercih ederim.
GitLab'ın dahili yöntemleriyle bu işi yapmak için:
Bu işler daha da otomatik olsun, ben GitLab'a gönderdiğim gibi hemen sunuculara dağılsın, benim de bir Merkez paneline bunun için buton koymama gerek kalmasın derseniz de CI/CD şeklinde bir araştırma yapabilirsiniz. GitLab'ın runner'ları sizin oluşturduğunuz .gitlab-ci.yml dosyanıza bakarak A ve B sunucularının terminaline bağlanıp projenizi pull edebilir.
Bu işlemi çözmek için kendi kodlarınızı yazmayacaksanız kalın yazdığım ifadeleri araştırabilirsiniz.
Tek tablo çok daha rahat olur tabi. Ama orada da premium_1, premium_2 ve premium_3 sütunlarında bitiş tarihi tutmanız daha uygun olur.
premium_bittimi diye ayrı bir sütuna gerek olduğunu sanmıyorum.
emlakci tablosu:
id, kayit_tarihi, premium_1, premium_2, premium_3 sütunlarına sahip olursa ve bu premium sütunları bitiş tarihini tutarsa rahatça sorgulama yapabilirsiniz.
Eğer tarihleri PHP ile hesaplatırsanız çok fazla ihtimale göre kod yazmanız gerekecek.
Okul dersleriniz iyiyse, ailenizin de imkânı varsa mutlaka üniversite okumalısınız. (Hatta mümkünse ailenizle yaşadığınız şehirden farklı bir şehirde)
Mümkünse yazılım mühendisliği sizin için uygun olacaktır.
Üniversiteler için "hiçbi'şey göstermiyorlar" efsanesi vardır ve çoğunlukla doğrudur.
Ama üniversiteler, lisedeki gibi hazır bilginin önlerine sunulmasını beklemek yerine kendini belli bir konuda geliştirmek için çaba sarf edecek öğrenciler için harika bir ortamdır. Sizi alanınızla ilgili olabilecek birçok alanda bi'şeyler öğrenmeye mecbur tutar. Kendi başınıza öğrenmeyi gereksiz göreceğiniz konularda projeler yazmanız beklenir mesela. Oysaki üniversitenin size verdiği derslerin çoğunu bir "yazılımcı" olarak bilmelisinizdir aslında.
Üniversite ortamında katılıp güzel deneyimler kazanabileceğiniz kulüpler vardır.
Üniversiteler araştırma yapıp kendinizi geliştirebileceğiniz birçok ortam sunar. Gidip ilgi duyduğunuz bir konuda yazılmış yüksek lisans veya doktora tezlerini inceleyebilirsiniz mesela. Hemen oracıkta, kütüphanedeler...
Ortaklaşa iş yapabileceğiniz kafa dengi insanlar bulmanız kolaydır. Oraya sizin gibi yazılıma meraklı birçok öğrenci geliyor.
Kendi kendine öğrenme işini üniversite okurken de yapabilirsiniz.
İleri düzey konularda danışıp bilgi alabileceğiniz bir çevrede olacaksınız. Probleminizi sınıf arkadaşlarınız çözebilirler. Üst sınıflardan birileri de çözebilirler. Yüksek lisans öğrencileri de çözebilirler. Daha da ileri gidin. Doktora için ileri seviye yazılım geliştirmekle uğraşan insanlar var orada.
Kendi bölümünüzle sınırlı da değilsiniz. Üniversiteye gittiğinizde tüm bölümler size açıktır. Matematikçi bir profesör ile istatiksik üzerine kurulu bir yazılımın nasıl bir algoritması olabileceğini tartışma imkânı bulabilirsiniz mesela.
İyi bir şirkete girip kendinizi daha hızlı geliştirmek mi istiyorsunuz? Staj yapın. Hatta gidin ücretsiz çalışın. Yorulursunuz ama öğrenirsiniz.
Üniversitenin gereksiz olduğu, zaman kaybı oluduğu düşüncesi çoğunlukla öğrencilerle alakalıdır.
Üniversiteyi lise gibi okumaya çalışırırsanız lisede elde ettiğiniz kadarını bile elde edemezsiniz.
Ama oraya gerçek bi'şeyler yapmaya gidiyorsanız daha iyi bir ortamı kolay kolay bulamazsınız.
Sevgili bazı prototurk.com soru-cevap bölümü kullanıcıları,
Bir soruya doğru yanıtınızı aldığınızda yanıtı "Doğru Cevap" olarak işaretleme nezaketi gösterirseniz aynı sorulara tekrar tekrar girip bakmamış oluruz.
Sorunuza çözüm bulamadıysanız da neden çözüm bulamadığınıza dair bi'şeyler yazıp konuyu ilerletin veya kendi başınıza çözdüyseniz kendi çözümünüzü yazıp doğru cevap olarak işaretleyin en azından.
Bi'başlık açıyorsanız cevap verenlere saygı gösterip başlığınızın takibini de yapmanız pek güzel olur.
for/foreach döngüsü işinizi görmüyor mu?
$hedefler = [
'https://www.ornekLink1.com/a-1',
'https://www.ornekLink1.com/a-2',
'https://www.ornekLink2.com/b-1',
'https://www.ornekLink3.com/b-1',
'https://www.ornekLink4.com/b-2'
];
$sonuclar = [];
foreach($hedefler as $hedef) {
$ct = curl_init();
curl_setopt($ct, CURLOPT_URL, $hedef);
curl_setopt($ct, CURLOPT_HEADER, 0);
$sonular[] = curl_exec($ct);
curl_close($ct);
echo "<div>$hedef için curl isteği tamamlandı.</div>";
}
Denemek lazım... Sırayla tüm isteklerin sonuçları $sonuclar
array'ına işlenecek.