"Geri Düğmesi Blues" Kür

5 Cevap php

Hiç büyük bir değer ama oldukça düzgün izah değil hissediyorum bir öğretici tökezledi? Bu benim ikilem. I THIS TUTORIAL bazı değer biliyorum ama sadece bunu elde edemez.

  1. Nereye her işlev diyorsunuz?
  2. Which function should be called first and which next, and which third?
  3. Tüm işlevler bir uygulamadaki tüm dosyalarda adı verilecek?
  4. Herkes "Geri Düğmesi Blues" tedavi daha iyi bir yol biliyor mu?

Bu makalenin yazarı içeren bazı iyi konuşma heyecan olacak merak ediyorum. Ben özellikle ilgilendiğim kısmı geri düğmesine basıldığında bir veritabanına formu yinelenen girişleri önlemek için geri düğmesini kontrol edilir. Temelde, uygulamanızda komut yürütülmesi sırasında şu üç işlevi çağırarak geri düğmesini kontrol etmek istiyorum. Tam olarak ne (yukarıdaki soruya bakınız) işlevleri çağırmak amacıyla öğretici açık değildir.

All forwards movement is performed by using my scriptNext function. This is called within the current script in order to activate the new script.

function scriptNext($script_id)
// proceed forwards to a new script
{
   if (empty($script_id)) {
      trigger_error("script id is not defined", E_USER_ERROR);
   } // if

   // get list of screens used in this session
   $page_stack = $_SESSION['page_stack'];
   if (in_array($script_id, $page_stack)) {
      // remove this item and any following items from the stack array
      do {
         $last = array_pop($page_stack);
      } while ($last != $script_id);
   } // if

   // add next script to end of array and update session data
   $page_stack[] = $script_id;
   $_SESSION['page_stack'] = $page_stack;

   // now pass control to the designated script
   $location = 'http://' .$_SERVER['HTTP_HOST'] .$script_id;
   header('Location: ' .$location); 
   exit;

} // scriptNext

When any script has finished its processing it terminates by calling my scriptPrevious function. This will drop the current script from the end of the stack array and reactivate the previous script in the array.

function scriptPrevious()
// go back to the previous script (as defined in PAGE_STACK)
{
   // get id of current script
   $script_id = $_SERVER['PHP_SELF'];

   // get list of screens used in this session
   $page_stack = $_SESSION['page_stack'];
   if (in_array($script_id, $page_stack)) {
      // remove this item and any following items from the stack array
      do {
         $last = array_pop($page_stack);
      } while ($last != $script_id);
      // update session data
      $_SESSION['page_stack'] = $page_stack;
   } // if

   if (count($page_stack) > 0) {
      $previous = array_pop($page_stack);
      // reactivate previous script
      $location = 'http://' .$_SERVER['HTTP_HOST'] .$previous;
   } else {
      // no previous scripts, so terminate session
      session_unset();
      session_destroy();
      // revert to default start page
      $location = 'http://' .$_SERVER['HTTP_HOST'] .'/index.php';
   } // if

   header('Location: ' .$location); 
   exit;

} // scriptPrevious

Whenever a script is activated, which can be either through the scriptNext or scriptPrevious functions, or because of the BACK button in the browser, it will call the following function to verify that it is the current script according to the contents of the program stack and take appropriate action if it is not.

function initSession()
// initialise session data
{
   // get program stack
   if (isset($_SESSION['page_stack'])) {
      // use existing stack
      $page_stack = $_SESSION['page_stack'];
   } else {
      // create new stack which starts with current script
      $page_stack[] = $_SERVER['PHP_SELF'];
      $_SESSION['page_stack'] = $page_stack;
   } // if

   // check that this script is at the end of the current stack
   $actual = $_SERVER['PHP_SELF'];
   $expected = $page_stack[count($page_stack)-1];
   if ($expected != $actual) {
      if (in_array($actual, $page_stack)) {// script is within current stack, so remove anything which follows
      while ($page_stack[count($page_stack)-1] != $actual ) {
            $null = array_pop($page_stack);
         } // while
         $_SESSION['page_stack'] = $page_stack;
      } // if
      // set script id to last entry in program stack
      $actual = $page_stack[count($page_stack)-1];
      $location = 'http://' .$_SERVER['HTTP_HOST'] .$actual;
      header('Location: ' .$location);
      exit;
   } // if

   ... // continue processing

} // initSession

The action taken depends on whether the current script exists within the program stack or not. There are three possibilities:

  • The current script is not in the $page_stack array, in which case it is not allowed to continue. Instead it is replaced by the script which is at the end of the array.
  • The current script is in the $page_stack array, but it is not the last entry. In this case all following entries in the array are removed.
  • The current script is the last entry in the $page_stack array. This is the expected situation. Drinks all round!

5 Cevap

Bu iyi bir tartışma ama (PRG) olarak da bilinen alın fazla noktaya sen post Yönlendirileceği bakarak olmalıdır "Post sonra alın."

http://www.theserverside.com/patterns/thread.tss?thread_id=20936

Oturum açma, menü, liste, arama, ekleme ve güncelleme - Benim yazı anlamak yoksa, o zaman figure 1 bir kullanıcı ekranları bir dizi geçer tipik bir senaryo gösteriyor yakından bakmak gerekir. Ben VADELİ bir hareketi tanımlamak ne zaman yeni bir ekran etkinken geçerli ekran askıya anlamına. Kullanıcı geçerli ekranda bir bağlantı bastığında bu olur. Ben GERİYE bir hareketi tarif ederken kullanıcı (ÇIK veya GÖNDER düğmesine basarak) geçerli ekran sonlandırır ve kaldığı yerden işleme devam önceki ekrana geri döner demek. Bu sadece sonlandırıldı ekranında yapılan değişiklikleri içeren içerebilir.

Tarayıcı geçmişi bağımsız bir sayfa yığını sürdürmek çok önemli olduğu bu - sayfa yığını uygulama tarafından korunur ve tüm isteklerini doğrulamak için kullanılır. Bu kadar tarayıcısı ile ilgili olarak, geçerli olabilir, ancak geçersiz olarak ve buna göre ele uygulama tarafından tespit edilebilir.

Sayfa yığını iki işlevleri tarafından korunur:

  • scriptNext() is used to process a FORWARDS movement, which adds a new entry at the end of the stack and activates the new entry.
  • scriptPrevious() is used to process a BACKWARDS movement, which removes the last entry from the stack and re-activates the previous entry.

Şimdi kullanıcı, LİSTESİ ekranında 4 sayfasına gidilen ADD ekranına gitti, sonra LİSTESİ ekranında sayfa 5 döndü örnekte duruma. ADD ekranında son eylemi otomatik olarak sona ve LİSTESİ ekranında döndü sonra, veritabanına eklenen sunucuya bilgi göndermek için POST yöntemini kullanmış GÖNDER düğmesine basın oldu.

LİSTESİ ekranında sayfa 5 tarayıcı geçmişi bir POST oldu ADD ekranda son eylem için bir istek oluşturur iken bu nedenle GERİ düğmesine basın. Bu kadar tarayıcı söz konusu olduğunda geçerli bir istek, ama kadarıyla uygulama söz konusu olduğunda değil. Nasıl uygulama isteği geçersiz olduğuna karar verebilir? Kendi sayfa yığını ile kontrol ederek. ADD ekran sona edildiğinde onun girişi nedenle sayfa destesinin olmayan bir ekran için herhangi bir istek her zaman geçersiz olarak kabul edilebilir, sayfa destesinin silindi. Bu durumda geçersiz istek yığınında son giriş yönlendirilebilir.

Sorularınıza yanıtlar nedenle açık olmalı:

  • S: Nereye her bir işlev diyorsunuz?
  • A: You call the scriptNext() function when the user chooses to navigate forwards to a new screen, and call the scriptPrevious() function when the user terminates the current screen.
  • Q: Which function should be called first and which next, and which third?
  • A: Each function is called in response to an action chosen by the user, so only one function is used at a time.
  • Q: Will all functions be called in all files in an application?
  • A: All functions should be available in all files in an application, but only called when chosen by the user.

Bu, o zaman benim sample application indirebilirsiniz eylem bu fikirleri görmek istiyoruz.

Ben özellikle ilgilendiğim kısmı geri düğmesine basıldığında bir veritabanına formu yinelenen girişleri önlemek için geri düğmesini kontrol edilir.

Sizin öncül yanlıştır. Eğer bir web uygulaması olarak uygulama tasarımı ise "Geri Düğmesi Blues" gibi bir şey yoktur. Eğer herhangi bir sunucu tarafı bir devlet olmadan uygulama tasarımı ise, ilk durumda, bu sorun haline çalıştırmak asla. Web uygulamaları Bu minimalist yaklaşım oldukça iyi çalışıyor, ve genellikle GERİSİ olarak bilinir.

@ Troelskn

Eğer herhangi bir sunucu tarafı bir devlet olmadan uygulama tasarımı eğer ....

Bu aksi takdirde tüm birbirleri ile iletişim kurmayan tek tek sayfaları bir koleksiyon, devlet yok etkin bir uygulama tasarımı mümkün değildir. Istemci üzerinde durumunu korumak sorunları ile doludur gibi sunucuda durumunu korumak için ama etkili bir alternatif yoktur.

@ Marston.

Ben sonrası / yönlendirme / almak ile sorun çözüldü ama öğretici bazı hak vardır ve belki de Tony Marston üzerinde ayrıntılı inanıyorum. Ve bu ille benim özellikle sorunu çözmek ama belki benzer bir şey için nasıl kullanılabileceği. Ya da nasıl fonksiyonları aslında benim özellikle problem çözmede kullanılabilir eğer post / yönlendirme / almak daha iyidir. Bunu burada topluma iyi bir ek olacağını düşünüyorum.