2010-12-30 41 views
6

Hoàn thành PHP novice ở đây, gần như tất cả công việc trước đây của tôi là trong ASP.NET. Bây giờ tôi đang làm việc trên một dự án PHP, và tảng đá đầu tiên mà tôi đã gặp phải là giữ lại các giá trị trên toàn bộ postback.PHP - Cách thực hành tốt nhất để giữ lại các giá trị biểu mẫu qua postback

Đối với ví dụ đơn giản nhất nhưng vẫn thực tế, tôi có 10 menu thả xuống. Họ thậm chí không databound, vì đó là bước tiếp theo của tôi. Chúng là các trình đơn thả xuống đơn giản.

Tôi có toàn bộ trang được bao gồm trong thẻ. sự kiện onclick() cho mỗi trình đơn thả xuống, gọi một hàm javascript sẽ điền phần tử ẩn thả corrosponding, với giá trị được chọn thả xuống. Sau đó, khi tải lại trang, nếu giá trị ẩn đó không trống, tôi đặt tùy chọn đã chọn = tùy chọn ẩn của tôi.

Điều này rất hữu ích cho một lần đăng lại. Tuy nhiên, khi một trình đơn thả xuống khác được thay đổi, menu thả xuống 1'st ban đầu sẽ mất giá trị của nó, do giá trị ẩn của nó bị mất giá trị mất đi giá trị của nó!

Điều này thu hút tôi xem xét sử dụng chuỗi truy vấn hoặc phiên hoặc ... một số ý tưởng khác.

Ai đó có thể chỉ cho tôi đúng hướng, tùy chọn nào là tốt nhất trong trường hợp của tôi? Tôi là một người mới làm quen với PHP, tuy nhiên tôi đang được yêu cầu làm một số công cụ khá mãnh liệt cho trình độ kỹ năng của mình, vì vậy tôi cần một cái gì đó linh hoạt và thích hợp một chút dễ sử dụng.

Cảm ơn!

----- chỉnh sửa -----

Một chút làm rõ thêm về câu hỏi của tôi :)

Khi tôi nói 'PostBack' Tôi đang đề cập đến các trang/form được gửi. Điều khiển được truyền lại cho máy chủ và mã HTML/PHP được thực hiện lại.

Đối với danh sách thả xuống & hiddens, lý do tôi sử dụng biến ẩn để giữ lại "giá trị đã chọn" hoặc "chỉ mục đã chọn", để khi trang được gửi, tôi có thể vẽ lại menu thả xuống với lựa chọn trước , thay vì mặc định trở lại chỉ mục đầu tiên. Khi tôi sử dụng lệnh $ _POST [], tôi không thể truy xuất danh sách thả xuống theo tên, nhưng tôi có thể truy xuất giá trị ẩn theo tên. Đây là lý do tại sao khi sự kiện thả xuống thay đổi, tôi gọi javascript trong đó đặt giá trị được lựa chọn từ thả xuống vào corrosponding ẩn của nó.

-------- chỉnh sửa lại -------- Được rồi, tôi thấy rằng tôi cần phải lùi lại một bước và giải thích mục tiêu tổng thể :) tôi xin lỗi vì không phải là rất rõ ràng để bắt đầu với.

Thiết kế cuối cùng của tôi sẽ là trang mà người dùng có thể chọn một bộ phận trong công ty của chúng tôi để xem dữ liệu. Khi bộ phận đó được chọn (từ danh sách thả xuống), sau đó tôi sẽ hiển thị nhiều lựa chọn dữ liệu cụ thể hơn cho: màu sắc, kích cỡ, nhà cung cấp, kiểu, ngày, cửa hàng #, v.v ... tại thời điểm này tôi cũng sẽ hiển thị dữ liệu bán hàng cho bộ phận được chọn. Khi chọn bất kỳ màu sắc, kích thước nào, v.v. tôi sẽ cập nhật kết quả dữ liệu bán hàng để đáp ứng các tiêu chí mới

--------- chỉnh sửa ---------- Tôi không thể cung cấp bên ngoài truy cập vào ví dụ của tôi, tuy nhiên đây là một sceenshot với sự bùng nổ. Trong hình ảnh bên dưới, Người dùng sẽ mở rộng danh sách thả xuống của Bộ, để chọn một bộ phận. Tại thời điểm này, dữ liệu bán hàng bên dưới sẽ làm mới theo bộ phận đó. Sau đó, người dùng sẽ chọn tùy chọn "Nhóm theo", chẳng hạn như Cửa hàng và trang/dữ liệu sẽ làm mới để hiển thị dữ liệu được nhóm theo cửa hàng. Sau đó, họ có thể chọn một màu như màu đen trong ví dụ của tôi và dữ liệu sẽ hiển thị doanh số bán hàng cho bộ phận và màu được chọn, được nhóm theo cửa hàng.

Để làm được tất cả điều này tuy nhiên, trang cần phải giữ lại các bộ phận, màu sắc, và các lựa chọn thả xuống nhóm mỗi refresh/bài ...

alt text

+1

Chủ đề thú vị. Tuy nhiên, bạn nên giải thích những gì [postback] (http://en.wikipedia.org/wiki/Postback) có nghĩa là; đó là một thuật ngữ ASP, không rõ trong đất PHP. Ngoài ra, hãy thêm thông tin khác nếu bạn cần hiển thị lại danh sách thả xuống hoặc nếu truyền các giá trị qua các trường biểu mẫu ẩn đủ. – mario

+0

tại sao bạn sẽ có một trường ẩn riêng biệt để lưu trữ giá trị của lựa chọn? lựa chọn lưu trữ giá trị của chính nó. tôi rất bối rối. chúng ta có thể thấy một số mã và giải thích về những gì bạn đang cố gắng đạt được không? – dqhendricks

+0

Bạn có thể cung cấp liên kết đến một ví dụ trực tiếp mà tôi có thể hiểu chính xác quy trình – RobertPitt

Trả lời

4

Không có cách nào có nguồn gốc từ tự động đăng lại , bạn phải lặp dữ liệu từ _POST mảng $ như vậy:

<input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" /> 

một cách khác để làm điều này là để tạo ra một helper hình thức hành động để tạo vv đầu vào cho bạn, và sau đó kiểm tra các mảng bài cho chìa khóa, cho e xample:

class FormHelper 
{ 
    public function input($name,$type = "text",$default_value = "",$postback = false) 
    { 
     return '<input name="' . $name . '" type="' . $type . 'value="' . $this->_postback($name,$default_value) . '" />'; 
    } 

    //More Methods 


    private function _postback($key,$default = "") 
    { 
     return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default; 
    } 
} 

và sau đó bạn có thể thêm sẽ có thể tạo biểu mẫu chỉ định thì phải chứa giá trị trước đó.

bạn sẽ tạo các biểu mẫu như sau:

<form> 
    <?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?> 
</form> 

Obviusly tạo phương pháp singleton getInstance()

Một số liên kết có thể giúp bạn.

  1. Form validation using PHP
  2. PHP/CSS Form validation
  3. PHP Form Validation

Sau khi cập nhật của bạn tôi có thể biết những gì bạn có nghĩa là thậm chí còn nghĩ bài viết của bạn là khó hiểu.

Nếu im phải bạn muốn làm như sau:

  • Hiện một biểu mẫu trên trang
  • của bạn Hãy để người dùng điền vào mẫu
  • Khi người dùng nhấp nộp
    • Gửi dữ liệu đến máy chủ qua Ajax
    • Xử lý thông tin do người dùng cung cấp
    • Tạo biểu mẫu mới hoặc tạo lại hình thức cũ với lỗi
    • Gửi hình thức xuống các đường ống để trang
    • Hủy bỏ các hình thức cũ thay thế các hình thức cũ với mới được tạo một

Nếu ở trên là đúng rồi Đây không phải là một tính năng cụ thể cho PHP, nhưng chủ yếu dựa trên javascript

Cách tốt nhất để thực hiện điều này là đảm bảo ứng dụng của bạn dựa trên mẫu, vì vậy trong trang tải ban đầu, bạn sẽ hiển thị biểu mẫu như sau:

<html> 
    <!-- Head, Meta, Etc--> 
    <body> 
     <?php $this->template->load("templates/forms/specific_form.php"); ?> 
    </body> 
</html> 

Điều này sẽ thường là cách trang được tải, sau đó nhấp vào bạn muốn gửi biểu mẫu qua ajax, tôi sẽ kết hợp jQuery cho việc này.

hình thức sẽ như vậy:

<form rel="__postback" ... > 
</form> 

Và sau đó trong jQuery bạn sẽ làm như sau:

$(document).ready(function(){ 
    $("form[rel*=__postback]").each(function(){ 
     var Form = $(this); 

     //Send the form with ajax, bin the __PostbackComplete() 
     function __PostbackComplete(server_data) 
     { 
      //Overwite the form using jQuery LIVE!!!! 
     } 
    }); 
}); 

Trong PHP bạn sẽ phân tích dữ liệu và quy trình diện dưới hình thức từ mẫu phần.

hy vọng điều này sẽ hữu ích.

+0

vừa cập nhật bài đăng gốc của tôi với nhiều chi tiết hơn, tôi hy vọng điều này sẽ giúp giải thích rõ hơn mục tiêu của tôi. cảm ơn bạn đã dành thời gian để giúp đỡ! – Adam

0

Nếu tôi nhận được câu hỏi của bạn đúng, tôi nghĩ vấn đề thực sự là với giải pháp javascript của bạn.

Tại sao bạn chỉ gửi trường đã chọn? Có nhiều hình thức? Ý tôi là, nếu tất cả các trình đơn thả xuống chỉ nằm trong một biểu mẫu, bạn nên gửi biểu mẫu đầy đủ khi các thay đổi đầu vào, có, bạn sẽ gửi lại giá trị thả xuống trước đó, nhưng đó là cách để có được giá trị đó với $ _POST.

+0

Vì vậy, thay vì có nhiều đối tượng ẩn để chứa giá trị thả xuống corrosponding của chúng. Tôi nên có một đối tượng ẩn duy nhất chứa tất cả html từ biểu mẫu của tôi? Và sau đó phân tích cú pháp thông qua việc sử dụng $ _POST [] khi tôi được gửi/tải lại, để truy xuất các giá trị đã chọn của trình đơn thả xuống? Nếu đúng như vậy, bạn có thể cho tôi một ví dụ được không? cảm ơn bạn :) – Adam

+0

Nếu bạn hiển thị một số thứ html và javascript của bạn có thể trở nên dễ dàng hơn. Và những gì tôi đã nói là luôn luôn xử lý dữ liệu được đăng, tạo đầu ra, nhưng cũng kiểm tra tất cả các tùy chọn và sử dụng một giải pháp như @RobertPitt. – Dave

0

Có vẻ như bạn chỉ cần tái xuất các trường biểu mẫu của mình, với các giá trị phù hợp được điền trước.

Ví dụ, nói rằng bạn muốn có một thả xuống như thế này:

<select name="department"> 
    <option value="s">Sales</option> 
    <option value="m">Marketing</option> 
</select> 

Khi bạn gửi biểu mẫu, giá trị sẽ có sẵn cho PHP như $ _POST [ "bộ phận"]. Bây giờ bạn muốn xuất biểu mẫu một lần nữa, với đúng bộ phận được chọn.

Bạn sẽ cần một chức năng như thế này (đây chỉ là một phác thảo nhanh):

function outputSelect($name, $values, $currentValue) { 
    echo '<select name="'.htmlspecialchars($name).'">'; 
    foreach ($values as $value => $text) { 
    if ($value === $currentValue) { 
     echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>'; 
    } else { 
     echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>'; 
    } 
    } 
    echo '</select>'; 
} 

Bạn muốn gọi nó là khi bạn muốn hiển thị menu.Thông thường đây là từ bên trong một mẫu HTML:

<?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?> 

Bạn sẽ cần các chức năng tương tự cho các lĩnh vực văn bản, trường dữ liệu ẩn, nút radio, vv .. Cuối cùng, bạn sẽ kết thúc với một thư viện hàm tái sử dụng để xuất các trường biểu mẫu.

Đừng quên sử dụng htmlspecialchars xung quanh các thuộc tính hoặc nội dung của bất kỳ thẻ HTML nào, như tôi đã làm ở trên. Điều này đặc biệt quan trọng khi hiển thị dữ liệu do người dùng nhập, để ngăn chặn các cuộc tấn công XSS, nhưng nó phải được thực hiện bất kể nguồn dữ liệu.

Các vấn đề liên quan