Titiz mesaj php ekleyin. PHP AJAX CRUD: MySQL veritabanında kayıt oluşturun, silin, düzenleyin. Oluşturma, silme, düzenleme istekleri göndermek için AJAX formu

  • 20.06.2020
3.3K

Kullanıcıya mesaj görüntülemek, bir web uygulamasının gerçekleştirmesi gereken oldukça yaygın bir eylemdir. Formları işlerken olabilir, hata mesajları olabilir, bir kullanıcı sitenin kısıtlı bir bölümüne erişmeye çalıştığında kaydolmanız gerektiğini söyleyen mesajlar ve diğer birçok durumda olabilir.

Çoğu zaman, mesajların oluşturulması ve çıktısı farklı HTTP istekleriyle ayrılır. Kural olarak, formlar işlendikten sonra bir yönlendirme kullanmak uygundur (Geri ve Yenile düğmeleriyle ilgili sorunları önlemek için), ancak aynı zamanda, bir mesaj oluşturmak için doğal an, tam olarak formları işleme anıdır ve eşlik eden eylemleri gerçekleştirir. Neden? Niye? Mesaj metninin şöyle görünmesi gerektiğini hayal edin: "'Mouse Pad' öğesinin sıralı birimlerinin sayısı 7'den 12'ye başarıyla değiştirildi." Yönlendirmeden sonra, belki de işlevsellik açısından tamamen farklı bir sayfaya yönlendirildikten sonra, daha önce ne yapıldığını belirlemek için fazladan bir kafa olacaktır.

Çoğu zaman, formu işleyen POST isteğinde mesajlar görüntülenir - bu iyi değil, "bu sayfa güncel değil" yazıtları hayatı bozar (kullanıcı Geri düğmesini denemek istediğinde).

Birisi, dostça mesajlardan vazgeçerek bir yönlendirme kullanır.

Aynı zamanda, hayatı daha iyi hale getirmenin basit ve bariz bir yolu var. Açıklığa rağmen, nedense hiç kimsenin bunu kullandığını görmedim - en azından diğer insanların kaynaklarına baktığımda.

Yani bir sorunumuz var - mesaj farklı isteklerde "yaşamalı". Mesaj metnini, onu göstermesi gereken sayfaya iletmek için bir mekanizmaya ihtiyacımız var. Muhtemelen seansları zaten hatırlıyorsunuzdur.

Evet, genel olarak haklısınız. Diğer yöntemler, örneğin global bir değişken aracılığıyla, yönlendirme kullanıldığında (Maxim Naumenko'nun açıklaması) veri kaydetmeye izin vermez. Ayrıca, genellikle uygulamadaki her ekranın diğer bilgilerle birlikte önceki ekranlarda oluşturulan mesajları görüntüleme yeteneğine sahip olduğundan emin olurum. Bu kullanışlıdır çünkü mesajları görüntülemek için ayrı ekranlar hazırlamaya gerek yoktur ve kullanıcının tekrar fareye tıklaması gerekmez. Ancak, gerçekten, burada tasarımcının düşünmesi gerekiyor - mesajların görüneceği alanı vurgulamak için.

Fikir çok basit ve birkaç sınıfla uygulanabilir.

Akla gelen ilk şey, aslında basit sınıf diyagramımızdaki bir mesajı temsil edecek olan bir Message sınıfı oluşturmaktır. Mesaj, oturumda kendisini kaydedebilmeli ve ekranda kendini gösterebilmelidir.

class İleti ( /** * İleti içeriği. */ var $içerik; /** * İleti metnini başlatmak için oluşturucu. * * @param içerik ileti içeriği */ işlev İleti($içerik) ( $this->içerik = $içerik ; ) /** * Oturuma mesajı yaz */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Mesajı sayfaya gönder */ function toPage() ( echo "-" . $bu->içerik . "
"; } }

Oturuma erişmek için $_SESSION değişkeni kullanılır.

$_SESSION'un bir dizi olduğuna dikkat edin, bu dizinin yalnızca bir öğesini 'session_message' diziniyle kullanıyoruz.

Bu durumda, bir "dizi dizisi" ile uğraşıyoruz - 'session_message' öğesinde depoladığımız şey bir dizidir, bu iletilen mesajların listesidir (elbette birkaç tane olabilir).

Konuyu bulamadıysanız, kılavuzun oturumlar ve dizilerle ilgili bölümlerini tazelemenin zamanı geldi.

Bir sorunuz olabilir. Neden burada derslere ihtiyaç var? İki fonksiyon ile geçmek mümkün olacaktır. Ama daha ileriye bakalım. Farklı tiplerde (bilgi, hata, uyarı) mesajlar oluşturmamız, mesaj alıcılarını tanımlamamız gerekebilir.

Şu anda oturuma nesnenin kendisinin değil, yalnızca mesajın metninin yerleştirildiğini unutmayın. OOP, gelecekte bu yöntemi çağıran istemci kodunu değiştirmeden send() yönteminin davranışını değiştirmemize olanak tanır (örneğin, gelecekte, birçok alanı varsa, Message nesnesinin tamamı oturuma yazılabilir).

Bunu fonksiyonlar yardımıyla yapacağımızı düşünelim. Muhtemelen bir message_send($txt) fonksiyonumuz olurdu, ayrıca bir message_to_page($txt) fonksiyonumuz olurdu. Şimdi farklı mesaj türleri için farklı davranış olasılığını eklememiz gerekiyor. İşlev çağrıları değişir: message_send($txt, $tür), message_to_page($txt, $tür). Bu tür işlevleri aramak için tüm uygulama kodunu taramanız ve düzeltmeler yapmanız gerekecektir.

Bu, mesajı bir ilişkisel dizi olarak sunarak durumu önceden tahmin ederek önlenebilir: $msg['txt'], $msg['tür'], o zaman işlev çağrılarında yalnızca bir parametre olacaktır. Nasıl bir sınıfa dönüşme eğiliminde olduğunu hissediyor musunuz?

OOP size her şeyi önceden düşünmek zorunda kalmama lüksünü verir.

Bir sonraki sınıf - Gelen Kutusu - sadece bu amaç içindir.

class Gelen Kutusu ( /** * Gelen mesajların dizisi. */ var $messages = array(); /** * Yapıcıda, gelen tüm mesajları * alın ve oturumdan kaldırın. */ function Gelen Kutusu() ( eğer (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->mesajlar = yeni Mesaj($mesajlar[$i]); ) ) /* mesaj dizisini temizle */ $_SESSION["session_messages"] = array(); ) /** * Gelen Kutusunun içeriğini sayfada göster. */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "Sistemden mesaj:
"; ) için ($i = 0; $i< $co; $i++) { $this->mesajlar[$i]->Sayfaya(); )) )

Mesajlaşma sistemimizi test edelim.

Çok basit bir örnek oluşturalım, bir form gönderimine cevaben mevcut dakikadaki saniye sayısını bildirecektir.

göndermek(); /* kendine yönlendir */ header("yer:"); ) else ( $inbox = new Inbox(); $inbox->toPage(); ) ?>

Diziler ve oturumlarla ilgili tüm çalışmaları sınıfların içine sakladık ve son kod basit ve güzel görünüyor.

Web sunucusunda bir dizin oluşturun, ardından bu üç dosyayı içinde oluşturun ve komut dosyasını deneyin. Geri ve Yenile düğmeleriyle ilgili herhangi bir sorun olmadığını unutmayın.

Şimdi, kural olarak, sayfalarda birkaç bloğun bulunduğu ve her birinin içinde ayrı bir uygulama içerebileceği karmaşık bir portal oluşturduğunuzu hayal edin.

Burada iki zorlukla karşılaşıyoruz:

* Mesaj listesinin sayfanın belirli bir bölümünde görünmesini istiyorum ve bunun için zaten iyi bir yer buldunuz.
Sorun şu ki, $inbox->toPage() komutunu tam olarak sayfadaki mesaj listesinin konumuna karşılık gelen anda çalıştırmanız gerekiyor. Bu listenin konumunu değiştirmek istiyorsak, koda girmemiz gerekecek, ancak bunun için portal çerçevesini sürekli değiştirmek iyi değil. En iyi çözüm, mesajların çıktısını sadece çerçeveye bağlı olduğu bilinen ayrı bir modül şeklinde yapmak olacaktır.
Yani, katı başlatma modülleri dizisinden kurtulmak için. Gerçekten de, Gelen Kutusu çıktısının sonucu sistemin çalışmasına bağlı olmadığından (bu adımda, oturumdaki tüm verilere zaten sahibiz), o zaman neden ekstra karmaşıklık?
* Mesaj listesinin görünümünü (tasarımını) korumak için, Message ve Inbox sınıflarının toPage() yöntemlerinde kabloladığımız HTML koduna dikkat etmeniz gerekir. Kural olarak, tasarımı değiştirmek için PHP kodunu değiştirmeniz gerekecektir.

İlk sorunu çözmeye çalışmak için, Gelen Kutusu çıktısının sonucunu depolayacak bir arabellek oluşturabilirsiniz.

Belki hala (Inbox'a) benzer birkaç şeye sahip olacağız ve bir arabellek sistemi oluşturmamız gerekiyor. Kimin çıktısının nerede olduğunu karıştırmamak için muhtemelen tamponların isimlendirilmesine geleceğiz. Arabellek çıktısının gerçekleşmesi gereken sırayı bir yerde depolayacağız - tercihen harici bir dosyada, böylece değişiklik yapmak daha kolay olur.

Zaten bir çözüme yönelik bu girişim, bize, ara verileri depolamanın bir yolu olarak XML kullanma fikrini veriyor. Ve XSLT stillerinin kullanılması ikinci sorunla başa çıkmaya yardımcı olacaktır.

XML ve XSLT'nin ne olduğu üzerinde durmayacağım. Bu konulara aşina değilseniz, zvon.org öğrenmek için iyi bir başlangıç ​​noktasıdır.

Buradaki fikir, toPage() yöntemlerinde HTML kodu değil, XML yapısı oluşturmaktır. Sayfa belgesi, XML kodlu bir dize olarak oluşturulacak ("arabellek" görevi görecek) ve betiğin son aşamasında XSL dönüşümünü kullanacağız.

Başlamak için, kodun ana bölümünün çalışmasının sonucunun ne olması gerektiğini hayal edin.

57. dakika saniye: 45

Nedir - tahmin etmesi oldukça kolay - iki mesaj ve bir form. PHP betiğinin yalnızca bu dizeyi hazırlaması gerektiğini unutmayın - bu çok basittir. Ayrıca, ana etiketlerin sırası önemsizdir - örneğin, programcı için uygun olacağı için başa konulabilir. Nasıl uygulanır. Neredeyse hiçbir şeyi değiştirmeden çıktı arabelleğe alma, HTML kodu yerine XML çıktısı kullanmak ve sonunda çıktıyı bir dizgeye yakalamak mümkündür. Ancak daha sonra esnekliği kaybederiz - örneğin, bazen hata ayıklama bilgilerini doğrudan sayfada görüntülemek istersiniz (yankı kullanarak). Aynı zamanda PHP geliştiricileri, ağaç benzeri belgeler oluşturmanın ve iletmenin daha gelişmiş bir yolunu sunan bir DOM modülü üzerinde çalışıyor. DOM'yi enjekte etmek istiyorsak, DOM öğeleri oluşturmak için dizelerin çıktısını değiştirerek tüm uygulamayı yeniden tasarlamamız gerekecek. Bu nedenle, genel XML belgesini sırayla oluşturarak, nesnelerin XML temsilini nesnelerin kendilerinde saklamayı tercih ederim. O kadar zor değil, sadece küçük bir değişiklik gerekiyor. Bu tekniğin, XML verilerini depolamanın belirli bir yoluna sıkı sıkıya bağlı olmadığını göreceksiniz ve bu, DOM'u "az kan dökülerek" kullanmaya geçiş yapmanızı sağlayacaktır. Her şeyden önce, nesnelerimizin her birinin bir toPage() yöntemine sahip olduğunu unutmayın. Bu benzerlik bizi yeni bir ortak ebeveyn sınıfı tanıtmayı düşündürmelidir. Sayfa için XML belgesinin parçalarını oluşturabilen her sınıfın, nesnenin XML temsiliyle ilgilenecek bir sınıftan miras almasına izin verin. Çıktılanabilir diyelim.

class Çıktılanabilir ( /** * XML kapsayıcı (dize). */ var $output = ""; /** * Kapsayıcının içeriğini verin ve kapsayıcıyı temizleyin. * * XML verili @dönüş dizesi */ function getOutput( ) ( $ out = $this->output; $this->output = ""; return $out; ) /** * Konteynerin içeriğine bir kısım ekleyin. * * @param string eklenecek dize */ function appendOutput($string) ( $this ->output .= $string "n"; ) /** * "Özet" yöntem.*/ function toPage() ( ) )

toPage() yöntemi boş yapılır - bu durumda, dış "matryoshka" sınıflarının iç sınıfla nasıl iletişim kurması gerektiğinin bir göstergesi olarak gereklidir. Ancak, sayfada kendilerini aynı şekilde gösteren birçok nesne olduğunu fark edersek, burada varsayılan bir uygulama önerilebilir.

Message ve Inbox sınıfları biraz değişecek - şimdi her ikisi de Outputable'dan miras almalı ve toPage () yöntemleri de değişecek
mesaj.php

class Mesaj genişletilir Çıktılanabilir ( /** * Mesaj içeriği. */ var $içerik; /** * Mesaj metnini başlatmak için oluşturucu. * * @param içerik mesaj içeriği */ function Message($content) ( $this->content = $content; ) /** * Oturuma mesajı yaz */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * Mesajı sayfaya gönder */ function toPage () ( $bu->appendOutput(" ".$bu->içerik.""); } }

class Gelen Kutusu Çıktılanabilir'i genişletir ( /** * Gelen mesajların dizisi. */ var $messages = array(); /** * Yapıcıda, gelen tüm mesajları alın * ve bunları oturumdan kaldırın. */ function Gelen Kutusu() ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); for ($i = 0; $i< $co; $i++) { $this->mesajlar = yeni Mesaj($mesajlar[$i]); ) ) /* mesaj dizisini temizle */ $_SESSION["session_messages"] = array(); ) /** * Gelen Kutusunun içeriğini sayfada göster. */ function toPage() ( $co = sizeof($this->messages); $this->appendOutput(" "); for ($i = 0; $i< $co; $i++) { $this->mesajlar[$i]->toPage(); $this->appendOutput($this->mesajlar[$i]->getOutput()); ) $this->appendOutput(""); } }

Çıktı yöntemi değişti - şimdi, doğrudan sayfaya çıktı vermek yerine, harici temsil şu an için nesnelerin her birinde "oturan" Çıktılanabilir'de depolanıyor. appendOutput() yöntemi, echo() yapısı için bir tür ikame işlevi görür. Bir nesnenin çıktısını almak için getOutput() yöntemi kullanılır.

Şimdi kodun istemci kısmının ne olduğunu görelim, bu da öncekiyle aynı görevi çözecek.
index.php

göndermek(); /* geçerli saniye */ $msg_sec = new Message("saniye: " .date("s")); $msg_sec->send(); /* kendine yönlendir */ header("yer:"); çıkış; ) else ( /* mesajların listesini XML olarak hazırla */ $inbox = new Inbox(); $inbox->toPage(); $global_content->appendOutput($inbox->getOutput()); ) $global_content->appendOutput (" "); $xml_string = $global_content->getOutput(); $xh = xslt_create(); $xarg = array(); /* XML belge başlığı */ $xarg["xml"] = ""."n"; /* XML belgesinin gövdesi */ $xarg["xml"] .= " " .$xml_string .""; /* XSL şablonu */ $xarg["xsl"] = implode("", file("style.xsl")); /* HTML kodu çıktısı - XSL dönüşümünün sonucu */ echo xslt_process($xh , " arg:xml", "arg:xsl", NULL, $xarg); /* çıktı XML kaynağı (hata ayıklama) */ echo "


" .htmlözel karakterler($xml_string) . "
"; ?>

Ana yenilik, adı kendisi için konuşan $global_content nesnesindedir. Bu durumda Çıktı sınıfına aittir, gerçek hayatta muhtemelen sayfanın içeriği için ayrı bir sınıf oluşturursunuz.

Yakından bakarsanız, komut dosyasının içeriği pek değişmedi - aynı gelen kutusu, aynı toPage(). Mesaj listesinin içeriğini sayfa içeriğine çıkaran bir talimat eklendi. Bir değişiklik için şimdi iki mesaj oluşturulur.

Sonuca bakmak için geriye sadece XSL şablonunu hazırlamak kalıyor.
stil.xsl

XSLT Örneği

İleti

Ne elde ettik?

Her şeyden önce, karmaşık projeleri daha cesurca üstlenebilirsiniz - modüllerin gerçek bağımsızlığı sağlanır. Sayfadaki sonuçların yığınlanma sırası artık harici bir XSL şablonu tarafından kontrol ediliyor ve modüllerin başlatıldığı sıraya bağlı değil.

Çalışması sonucunda XML verisi üreten herhangi bir modül bir projede kullanılabilir. Bu arada, bu, veri oluşturmanın ortak bir standarda sahip olmayan belirli bir motorun çağrı yöntemleri (atama vb.) dizisinden oluştuğu şablon motorlarına göre avantajlardan biridir.

Diğer bir avantaj, hata ayıklama kolaylığıdır. Komut dosyasını çalıştırırsanız, her sayfanın hata ayıklama çıktısına sahip olduğunu fark edeceksiniz; bu, uygulamaların hata ayıklamasını çok daha kolay hale getiren bir XML prototipidir.

Düşünülmesi gereken başka bir şey de mesaj nesnelerinin nasıl oluşturulacağıdır. Yeniyi doğrudan istemci kodunda kullanmak her zaman uygun değildir. Ancak, belki de bu ayrı bir makalenin konusudur.

Son olarak, beklentiler hakkında bir dörtnala:

* önemli mesajların listesi için açılır pencereler
* Mesajlarda "Gönderen sayfaları" ve "Hedef sayfalar"
* veri tabanına mesaj kaydetme
* düğmesi "eylemlerimin geçmişini göster"
* oturumlar içindeki kullanıcı eylemlerinin istatistiksel analizi
* web uygulamalarında "akıllı asistanlar"

genel bakış

İlk kez Joomla'da bulunan yerleşik bildirim sistemi, uygulamanızın kullanıcıyı (veya kullanıcı grubunu) çeşitli farklı olaylar hakkında bilgilendirmesini sağlar. Bildirimleri, kullanıcının okumak ve takip etmek isteyeceği önemli uyarılar olarak düşünün.
Bildirimler her yerde oluşturulabilir. Bileşeninizde veya eklentilerinizde ve daha sonra JomSocial bildirim sisteminde görüntülenir.
Bu eğitim size nasıl olduğunu gösterecek, ancak üçüncü olduğundan, kullanabileceğimiz herhangi bir taraf bileşeni hakkında hiçbir fikrimiz yok :) örnekler, onAfterProfileUpdate etkinliğinde tetiklenecek bir topluluk eklentisi üzerinde yapılacak.
Bu etkinlikte tetiklenecek olan eklentiyi nasıl oluşturacağınızı bilmiyorsanız bu rehberi incelemenizi öneririz.

Yine de bileşeninize uygulamak

Bu eğiticiye genel bakış bölümünde belirtildiği gibi, topluluk eklentisini kullanarak bildirimler oluşturacağız.
Büyük olasılıkla bileşeniniz veya eklentiniz içinde bildirimler oluşturmak isteyeceksiniz. Aşağıdaki öğretici, bu durumlardan herhangi birinde çalışacaktır. Yalnızca kodunuzun hangi noktasında bildirimin oluşturulacağını belirlemeniz ve JomSocial Core Libraries dosyasını yüklemeniz yeterlidir.

require_once JPATH_ROOT . "/components/com_community/libraries/core.php";

Aşağıda açıklanan öğreticiyi takip etmek, uzantınız için de gayet iyi çalışacaktır.

Geliştirme Ortamının Hazırlanması

1. Zaten topluluk türünü oluşturduğunuzu varsayacağız örnek kullanıcı profilini değiştirdiğinde tetiklenecek eklenti
Değilse, adresinden boş örnek eklentiyi indirebilir, Joomla'ya yükleyebilir ve eklentiyi etkinleştirebilirsiniz. Diye adlandırılır Topluluk - Bildirim Örneği
2. Veritabanınıza gidin ve boş bu iki tablo, yani hiç kayıtları yok

A) prefix_community_notification
b) önek_community_mailq

3. Test sitelerinizde en az iki (2) kullanıcı bulundurun ve kimlikler

Joomla'nın önceki sürümlerinde, kullanıcı kimlikleri her zaman belirtilen sayıdan (62, 42) başlardı. Joomla 3'te bu sayı rastgele olacaktır, dolayısıyla test ortamımızın resmi sizin tarafınızda kesinlikle farklı olacaktır.

İlk Bildirim

KÖK/eklentiler/topluluk/örnek içinde bulunacak eklenti php dosyasını açın
onAfterProfileUpdate() işlevi içinde

CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params );

Örnekte gösterildiği gibi, bildirim Ekle api'nin 7 parametresi var

  1. $ cmd- bildirim türüdür. Bu dosyada tüm bildirim türlerini görebilirsiniz. ROOT/components/com_community/libraries/notificationtypes.php 53. satırdan başlayarak veya satır civarında. system_messaging Bildirim türü.
  2. $oyuncu- eylemi gerçekleştiren kişidir
  3. $hedef- bildirim alacak kişi veya kişi grubudur
  4. $konu- hem bildirim açılır penceresinde hem de e-posta başlığında bildirim konusudur
  5. $vücut- e-posta bildirim mesajının gövdesidir
  6. $şablon- kullanmak için belirli bir şablona ihtiyacınız varsa, burada tanımlayabilirsiniz. Aksi takdirde, bu parametre boş olabilir
  7. $params- özel tanımlanmış parametreler

Tüm bunları bilerek kullanacağımız değişkenleri tanımlayalım.
Eklenti kodunuzu şu şekilde değiştirin:

$kullanıcı = CFactory::getUser(); $cmd = "system_messaging"; // ilk parametre, aktivite türü$aktör = $kullanıcı -> id ; //ikinci param - $actor kimliğini al$hedef = "965" ; // üçüncü param. Bildirimi kim alacak? Geliştirme ortamımızda, 965 kimliğine sahip yönetici kullanıcısı. Ortamınızda, kimliği büyük olasılıkla nesnenizden veya bir dizi kullanıcıdan almak isteyeceksiniz.$konu = "Bildirim Konusu" ; // Her ikisinin de konusu, e-posta ve açılır pencere bildirimleri$vücut = ; //E-postalardaki gövde mesajı. $şablon = "" ; // Belirli bir jomsocial şablon dosyası kullanmanız gerekiyorsa, burada tanımlayabilirsiniz.$params = new CParameter("" ) ; // Ek bir params nesnesi oluşturmak ve resmi olarak bir sınıf tanımlamadan ona veri atamak istiyoruz CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params );

Şimdi herhangi bir kullanıcı ile giriş yapın ve profil bilgilerini değiştirin. Ne olduğunu görmek için veritabanına gidelim.
Şu yöne rotayı ayarla prefix_community_notifications tablo ve yeni kaydı gözlemleyin

Şu yöne rotayı ayarla önek_community_mailq tablo ve yeni kaydı görün

Tebrikler!- E-posta ve dahili JomSocial bildirim sistemi aracılığıyla gönderilen ilk kendi bildiriminizi başarıyla oluşturdunuz


Potansiyel Kod Şişkinliği

Yukarıdaki örnek iyidir ve işe yarar, ancak genellikle böyle kullanılması tavsiye edilmez. Bunun yerine şöyle yazılabilir

$aktör = CFactory::getUser(); $params = new CParameter("" ) ; CNotificationLibrary::add( "system_messaging" , $actor -> "Bu, bildirim gövdesi mesajıdır", "" , $params );

Bu, temelde yukarıda gösterilen kodla kesinlikle aynı şeyi yaparken çok daha temiz ve takip etmesi daha kolaydır.

Özel Bildirim Parametreleri

Bir bildirim API'si, eklemek istediğiniz herhangi bir paramla genişletilebilir.
Bu parametreler e-posta şablonuna, bildirime ve tabii ki dil dosyasına iletilebilir.

$aktör = CFactory::getUser(); $link = "http://www.google.com" ; $params = new CParameter("" ) ; $params -> set ("aktör" , $actor -> getDisplayName() ) ; // (aktör) etiketi olarak kullanılabilir $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=". $aktör -> id ) ; // (aktör) etiketi için link $params -> set ("url" , $link ) ; // tüm aktivitenin url'si. Bildirim penceresinde avatarın üzerine gelindiğinde kullanılır. Giden e-postalarda da (url) etiketi olarak kullanılabilir. $link değişkenlerini tanımladığınızdan emin olun :) CNotificationLibrary:: add ("system_messaging" , $actor -> id , "965" , "Bildirim Konusu" , "Bu, bildirim gövdesi mesajıdır", "" , $params );

  • $params = yeni CParametre( ); - Resmi olarak bir sınıf tanımlamak zorunda kalmadan yeni bir params nesnesi oluşturmak ve ona veri atamak istiyoruz.
  • $params->set("aktör", $actor->getDisplayName());- Bildiriminizin her zaman bir aktörü olmalıdır. Bu parametre şablona (aktör) etiketi olarak geçirilebilir. Bildirim penceresinde eylemi gerçekleştiren kullanıcıyı tanımlar.
  • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id);- Aktör URL'si genellikle bir oyuncunun URL'sidir. Bildirim açılır penceresinde, (aktör) öğesine bağlantı ekler
  • $params->set("url", $bağlantı);- Bu, her zaman doğru şekilde ayarlamanız gereken en önemli parametredir. Bildirim penceresinde avatar resmi üzerinde bu parametre kullanılır. E-posta bildiriminde, etkinliğin gerçekleştiği konumu yansıtır.

Bu örnek için değişken ayarlayacağız $bağüzerine inmek www.google.com böylece nasıl çalıştığını görebilirsin

Dil Dizisi Ekleme ve Paramları Kullanma

Az önce belirlediğimiz paramlara sahip olmak dil dosyalarımızda da kullanılabilir.
Dil tuşlarını "değiştirerek tanımlayalım. CNotificationLibrary::add() API

CNotificationLibrary::add( "system_messaging" , $actor -> id , "965" , JText::sprintf( "PLG_COMMUNITY_EXAMPLE_SUBJECT"), JText:: sprintf ("PLG_COMMUNITY_EXAMPLE_BODY" ), "" , $params );

Dil dosyası şöyle görünmelidir

PLG_COMMUNITY_EXAMPLE_SUBJECT = "(aktör) profil güncellendi" PLG_COMMUNITY_EXAMPLE_BODY = "Merhaba Yönetici \n Bu, (aktörün) profilin güncellendiğini bildiren postadır \n\n Google'a gitmek istiyorsanız burayı tıklayın \n a href=" _QQ_"(url)" _QQ_">(url)"

Bu örnekte, verileri hem bildirim hem de e-posta şablonlarına iletmek için (aktör) ve (url) etiketini kullandık. Bakalım nasıl görünüyor.
Avatarın üzerine geldiğinizde bildirim penceresinde, (url) param devreye girdi ve avatar üzerinden google bağlantısını ekledi. Kasıtlı çünkü biz öyle yaptık :)


]

Aynı pencerede, aktör bağlantısının üzerine gelindiğinde. Bu kısmın olduğu kısım (aktör) bir eylem gerçekleştiren kullanıcıyı yankılarken, (aktör_url)" nesnenin doğru şekilde bağlandığına dikkat edildi


E-posta kuyruğunda ne olduğunu görelim


Ve son olarak, son kullanıcıya gönderilen asıl e-posta


başarı
Şimdiye kadar bildirim penceresinde ve e-postalarda başarıyla kullanılan üç (3) parametre oluşturduk.

  1. (aktör)- Eylemi gerçekleştiren kullanıcının kullanıcı adını döndürür
  2. (aktör_url)- verir (aktör) için nitelik
  3. (url)- Zorunlu değildir, ancak her zaman bildiriminizde bulunmalıdır. Hakkında bilgilendirildiğimiz eylemin gerçekleştiği ana url'dir.

Aynı şekilde, tanımlayabilirsiniz "

  • (hedef)- Eğer ihtiyacın olursa
  • (Hedef URL) Bildiriminizde ihtiyacınız varsa.
  • (Başlık)- Genellikle bildirim oluşturan bir nesneye atıfta bulunmak için kullanılır. Örnek: "X kullanıcısı şuraya yeni bir fotoğraf gönderdi: Y Albümü." Albüm Y burada başlıktır
  • (başlık_url)- Öncekilerde olduğu gibi, bildirim oluşturan bir nesnenin url'si.
  • (İleti)- Bu parametre, JomSocial e-postasının gövdesindeki mesajı ayarlamak (ve yankılamak) için kullanılabilir.

Zend uygulamamda mobil uygulamalar için bazı API'ler yazıyorum. Mobil geliştiricilerin işini kolaylaştırmak için Swagger kullanıyorum. Bir GET isteği dışında her şey şu ana kadar iyi çalışıyor.

/user/messages/(sessionToken) ne zaman arayacağım? Tarayıcıda NumMessages = (numMessages) & pageNr = (pageNr) istediğim sonuçları alıyorum, ancak Swagger'ın bu isteği yapmasına izin vermeye çalıştığımda, yalnızca sessionToken iletildi. Swagger için şu ek açıklamaları denedim:

/** * @SWG\Api(path="/user/messages/(sessionToken)?numMessages=(numMessages)&pageNr=(pageNr)", * @SWG\Operation(* method="GET", * özet=" Mesajları disk belleğine alır", * note="", * type="string", * nick="getUsermessagesPaged", * yetkilendirmeler=(), * @SWG\Parameter(* name="sessionToken", * description="Token etkin bir kullanıcı oturumundan", * gerekli=true, * type="string", * paramType="path", * allowMultiple=true *), * @SWG\Parameter(* name="numMessages", * description=" sayfadaki mesaj sayısı (numMessages ve pageNr, ikisi de ayarlanmadıysa yok sayılır)", * gerekli=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\Parameter (* name="pageNr", * description="pagenumber (her ikisi de ayarlanmadıysa, numMessages & pageNr yok sayılır)", * gerekli=true, * type="string", * paramType="query", * allowMultiple=true *), * @SWG\ResponseMessage(code=200, message="json (messages => "user_messages")"), * @SWG\ResponseMessage(code=400, message="json with err veya "oturum açılmadı"") *) *) */

Hatamı gören var mı?

Herhangi bir yardım açığız.

İçtenlikle

Güncelleme. Önerildiği gibi, her iki paramType'ı da "sorgu" olarak değiştirdim ve yolu değiştirdim:

@SWG\Api(path="/user/messages/(sessionToken)",

ama dövüşçü olarak çalışmadı.

Eclipse PDT'deki xdebug şunları gösterir:

RequestURI => /ias/public/user/messages/(sessionToken)

QueryParams => Zend\\Stdlib\\Parameters - *ArrayObject*storage => Array - =>

json şakası:

( "apiVersion": "1.0.0", "swaggerVersion": "1.2", "apis": [ ("yol": "\/kullanıcı", "açıklama": "Kullanıcılarla ilgili işlemler" ) ], "bilgi" : ( "title": "Mobil erişim api", "description": "Bu, xxx mobil erişim API'sidir.", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl" : null, "_partialId": null, "_partials": , "_context": ( "yorum": "\/**\ * @SWG\\Info(\ * title="(!LANG:Mobil erişim api)",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } } !}

İşte /user çıktısı:

("basePath": "http://localhost/ias/public", "swaggerVersion": "1.2", "apiVersion": "1.0.0", "resourcePath": "/user", "apis": [ ( "path": "/user/balance/(sessionToken)", "operasyonlar": [ ("yöntem": "GET", "özet": "Kullanıcı dengesini alır", "takma ad": "getUserdata", "type": "string", "parameters": [ ("paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Etkin bir kullanıcı oturumundan gelen jeton" ] ], "responseMessages": [ ("kod": 200, "message": "json (balance => "user_balance")" ), ( "kod": 400, "message ": "json "hatalı "giriş yapılmadı"" ) ], "notlar": "", "yetkiler": () ) ] ), ( "yol": "/kullanıcı/oturum açma", "işlemler": [ ( "method": "POST", "summary": "Kullanıcıyı sisteme kaydeder", "nickname": "loginUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "email", "type": "string", "required": true, "allowMultiple": false, "description": "Kullanıcı e-posta adresi for login" ), ( "paramType": "form", "name": "password", "type": "string", "required": true, "allowMultiple": false, "description": "Şifre için açık metinle oturum açın") ], "responseMessages": [ ("kod": 200, "message": "session_id, user_id, user_balance ile json" ), ( "kod": 400, "message": "json with error" "belirtilen e-posta ve parolaya sahip kullanıcı yok"" ), ("kod": 400, "mesaj": "json hatası "geçersiz giriş"" ), ( "kod": 400, "mesaj": "json hatası" gönderi isteği yok"" ) ], "notlar": "", "yetkilendirmeler": () ) ] ), ( "yol": "/kullanıcı/oturum kapatma", "işlemler": [ ("yöntem": "POST" , "özet": "Kullanıcı oturumunu kapatır", "takma ad": "logoutUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", " type": "string", "required": true, "allowMultiple": false, "description": "Etkin bir kullanıcı oturumunun belirteci" ) ], "responseMessages": [ ("kod": 200, "message" : "json (sonuç => "silindi")" ), ( "kod": 400 , "message": "json hatası "verilen sid ile user_session yok"" ), ("kod": 400, "message": "json hatası "geçersiz giriş"" ), ( "kod": 400, "message ": "json "hatalı "gönderme isteği yok"" ) ], "notlar": "", "yetkiler": () ) ] ), ( "yol": "/user/messages/(sessionToken)", "operasyonlar ": [ ("yöntem": "GET", "özet": "Yeni mesajlar alır", "takma ad": "getUsermessages", "type": "string", "parameters": [ ( "paramType": "path ", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Etkin bir kullanıcı oturumunun belirteci" ) ], "responseMessages": [ ("kod": 200, "message": "json (messages => "user_messages")" ), ( "kod": 400, "message": "json hatası "oturum açılmadı"" ) ], " note": "", "yetkilendirmeler": () ), ( "yöntem": "GET", "özet": "Mesajların disk belleğine alınmasını sağlar", "takma ad": "getUsermessagesPaged", "type": "string", " parametreler": [ ("paramType": "yol", "ad": "sessionToken", "ty pe": "string", "required": true, "description": "Etkin bir kullanıcı oturumunun belirteci" ), ( "paramType": "query", "name": "numMessages", "type": " string", "required": true, "description": "sayfadaki mesaj sayısı (numMessages & pageNr her ikisi de ayarlanmadıysa dikkate alınmaz)" ), ( "paramType": "query", "name": "pageNr" , "type": "string", "required": true, "description": "pagenumber (her ikisi de ayarlanmamışsa numMessages ve pageNr yok sayılır)" ) ], "responseMessages": [ ( "kod": 200, " message": "json (messages => "user_messages")" ), ( "kod": 400, "message": "json hatası "oturum açılmadı"" ) ], "notes": "", "yetkilendirmeler" : () ) ] ), ( "yol": "/kullanıcı/kullanıcıverileri", "işlemler": [ ( "yöntem": "POST", "özet": "Mesajlar kullanıcı verileri", "takma ad": "postUserdata", "type": "string", "parameters": [ ("paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "Etkin bir kullanıcı oturumunun belirteci " ), ( "paramType": "form", "name": "password", "type": "string", "required": false, "allowMultiple": false, "description": "new password" ), ( "paramType": "form", "name": "adres", "type": "string", "gerekli": false, "allowMultiple": false, "description": "yeni adres" ), ( "paramType ": "form", "name": "housenr", "type": "string", "required": false, "allowMultiple": false, "description": "new housenr" ), ( "paramType": " form", "name": "zip", "type": "string", "required": false, "allowMultiple": false, "description": "new zip" ), ( "paramType": "form", "name": "city", "type": "string", "required": false, "allowMultiple": false, "description": "new city" ), ( "paramType": "form", "name" : "email", "type": "string", "required": false, "allowMultiple": false, "description": "new email" ) ], "responseMessages": [ ("kod": 200, "message" ": "json (user => "userdata")" ), ( "kod": 400, "message": "json ile hatalı

Swagger-ui'min herhangi bir istek parametresi göndermemesi bir hata gibi görünüyor? İşte bir sorgu parametresi ile bir örnek, sessionToken: (FireBug 2.0.6 tarafından kontrol edilir)

GET /ias/public/user/balance HTTP/1.1 Ana Bilgisayar: localhost Kullanıcı Aracısı: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/201000101 Firefox/33.0 Kabul: application/json Kabul Dili: de, tr-US;q=0.7,en;q=0.3 Kabul-Kodlama: gzip, deflate İçerik-Türü: application/json Yönlendiren: http://localhost/ias/swagger/ Çerez: __utma=111872281.5814660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=Bağlantıyı ayarla: canlı tut

Cevap şuydu:

HTTP/1.1 400 Hatalı İstek Tarihi: 25 Kasım 2014 Salı 14:58:20 GMT Sunucusu: Apache/2.4.9 (Win32) PHP/5.5.12 X-Powered-By: PHP/5.5.12 İçerik Uzunluğu: 25 Bağlantı: Kapat İçerik Türü: application/json; karakter kümesi=utf-8

Cevap doğruydu çünkü hiçbir sessionToken geçirilmedi.

Bunun çalışması gerekiyor, ancak swagger-ui'den gelmiyor:

GET /ias/public/user/balance?sessionToken=HTTP/1.1 Ana Bilgisayar: localhost Kullanıcı Aracısı: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 Kabul et: text/html,application/ xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Kabul Et-Dil: de,en-US;q=0.7,en;q=0.3 Kabul-Kodlama: gzip, deflate Çerez: __utma=111872281.5811414660 .1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=Bağlantıyı ayarla: canlı tut

Sonunda anladım: Bir eşten daha iyi kimse yok. Sadece bir eş bulmak için kalır

PHP AJAX CRUD: MySQL veritabanında kayıt oluşturun, silin, düzenleyin

Bu yazımızda PHP kullanarak MySQL veritabanına kayıt ekleme, düzenleme ve silmeyi öğreneceğiz. Bir sunucu komut dosyasına AJAX isteği gönderen bir jQuery işleyicisi kullandık. İşleyici, girdilerin listesini günceller.

Oluşturma, silme, düzenleme istekleri göndermek için AJAX formu

Bir kayıt eklendiğinde, form, verileri bir AJAX isteği aracılığıyla PHP betiğine gönderir. Başarılı ekleme durumunda, giriş listesi yeniden yüklenir.

CRUD veritabanını sorgulamak için jQuery AJAX işlevleri

jQuery AJAX işlevinde, düzenleme ekleme ve vakaları kaldırma için bir geçişimiz var. Bu durumlar, veritabanının eylemlerine bağlı olarak farklı sorgu dizeleri ve yanıt verileri üretir.

CRUD işlemleri için PHP betiği

Aşağıdaki kod, veritabanı sorgularını yürütür. Bu PHP betiği, bir CRUD eylemi gerçekleştirdikten sonra, AJAX yanıtının bir sonucu olarak kayıtları günceller.

require_once("dbcontroller.php"); $db_handle = yeni DBController(); $eylem = $_POST["eylem"]; if(!empty($action)) ( switch($action) ( case "add": $result = mysql_query("yoruma EKLE(mesaj) DEĞERLER("".$_POST["txtmemessage"]."")" ); if($result)($insert_id = mysql_insert_id(); echo "

" . $_POST["txtmessage"] . "
"; ) break; case "edit": $result = mysql_query("GÜNCELLEME yorum seti mesajı = "".$_POST["txtmemessage"]."" WHERE id=".$_POST["message_id"]); if( $result) echo $_POST["txtmessage"]; break; case "delete": if(!empty($_POST["message_id"])) ( mysql_query("Yorumdan DELETE WHERE id=".$_POST["message_id) "]); ) kırmak; ) )