PHP Massive dinamik bir form: En iyi yaklaşım?

2 Cevap php

This question is likely to be somewhat longer than SO's average questions, so I'll try to keep it as short as possible:

Kullanıcıların doldurmak ve göndermek için gereken bir dinamik form tasarlıyorum. Bu form üzerinde 500 olası sorular ile, masif. Kullanıcıya görüntülenen sorular (Örneğin; kullanıcı hala 'okulda' onay kutusunu kontrol yalnızca, okul ile ilgili sorular sayfası gösterecektir.) Önceki cevaplar verilen cevaplara bağlıdır

Bu form epeyce gereksinimleri vardır:

  • 'Açık veya kapalı' verilen cevaplara bağlı olabilir birden fazla sayfa.
  • Bir kullanıcı geri gkimliker ve belirli bir cevap değiştirdiğinde, kapalı olacak dolu gruplar soruları cevapları boşaltılmış olması gerekir.
  • Bazı sorular verilen önceki cevaplara göre önceden doldurulur.
  • Formlar her yeni sayfa isteği üzerine veritabanına kaydedilir gerekir, böylece kullanıcılar duraklatma ve irade formu doldurarak devam edebilirsiniz.

Bu kadar iyi bir yaklaşım OO biri olarak görünüyor; Birden fazla seçenek (girdinin başlığı, tipi kullanılacak, olası cevaplar, vb) kabul eder ve buna göre HTML oluşturur bir sınıf tanımlamak.

Bu yaklaşım ile temel sorun, ancak, sorular, bu sayfada görüntülenecek sadece sorular için bir örnek oluşturmak için önce olanlardan 'ödünç' bilgisi yeterli değil çünkü bu. Aslında, tek güvenilir yolu her kullanıcı yeni bir sayfa yükler, örneğine her türlü soru.

Bu yaklaşım PHP performansını öldürmek olasıdır; Bu doğru OO çözüm değil gibi ve benim için, öyle görünüyor.

Bu soruna daha iyi çözümler var mı?

In essence, I need a fast ve lightweight way to create multi-dimensional array of 500 to 1000 records (class instances?), roughly 10 of which will be displayed on a page at any given time.

Tercihen, ben bir XML belgesi olarak formu saklamak istiyorum, bu nedenle bu açıdan iyi çalışır herhangi bir yaklaşım tercih olacaktır.

2 Cevap

Ben depolama mekanizması olarak, Eğer çalışan ne olursa olsun kullanabileceğiniz bir veritabanı kullanarak bir çözüm açıklamak için gidiyorum, ama bu tarif etmek daha kolay olacaktır.

Ben anketin "Sayfalar" tüm tutan bir tablo oluşturmak istiyorum başlayın. Bu sadece grup sorulara kullanılacak ve ekran için herhangi bir ihtiyaçları tanımlamak için

Ikinci formdaki her soruyu depolamak için bir tablo oluşturmak. Bu tablo bu tip cevaplar (önceden tanımlanmış ise), vb önceden tanımlanmış veri dinamik olup olmadığını nereden gelebilir belirterek yanı sıra herhangi bir bilgi var, soru ne olduğu hakkında temel bilgilerin tutmak gerekir.

Üçüncü kullanıcıların veri tutmak için bir tablo / tabloları oluşturmak.

Şimdi tüm verilerinizi yapı formu için tüm kullanıcıların verilerini yükler tek bir web sayfası halledilir var. Veritabanından "Sayfa" görüntülenecek gerekenleri belirlemek için kullanıcıların veri + oturum verileri kullanın. Bu bilgileri kullanarak görüntülenen "Page" için tüm soruları çekin ve kullanıcıya göstermek için bir HTML formu içine inşa. Form, kendisine geri sunmalıdır Önceki, Sonraki işlevleri kontrol için birden fazla düğmeleri olabilir. Sayfa yük gönderdikten ne zaman geri dışarı kullanıcı verilerini çekerek önce GÖNDERİLEN herhangi bir değeri saklamak gerekir eğer.

Ben sıfırdan çalışma bu sorunu çözmek istiyorum nasıl. Verilerinizi ve işlevselliği saklanması için çeşitli nesneler içine bu parçalar çok zarar verebilir. Bunu umarım bu şeyleri güçlendirmeye yardımcı olacak başlamak için nereye kadar kayboldu gibi ama benim için soru geliyor.

Eğer form ve doğrulama işleme oluşturulmasını basitleştirmek olabilir Zend çerçevesi gibi bir şey kullanarak daha sonra kullanabileceğiniz bir çerçeve ile esnek olması mümkün ise.

Zend Forms zend form denetimi için yerleşik bazı özellikleri bir örnektir. Bu çok kolay ve bir MVC tarzı çerçevede bazı deneyimi almak gibi kötü bir şey değil.

Eğer herhangi bir nedenle bir çerçeve kullanamıyorsanız, birkaç "views" ya da "sayfalar" arasında veri iletebilirsiniz yüzden formu sebat işlemek için özel bir sınıf yazıyorum öneririm

. NET multi görünümü kontrolü kullanarak bu için oldukça kullanışlı :)