简体   繁体   中英

Define in Smarty the format to be returned by AJAX

I have a html form in a Smarty template. A select in the form is populated via AJAX. I would like to specify in the Smarty template, the format to be returned by the AJAX-call. This way I can use the same request-url for different purposes. For example if the select contains users, sometimes I might be interested in knowing the user's email address (format: "{$Option->GetName()} ({$Option->Email})" ), and other times the user's organisation (format: "{$Option->GetName()} ({$Option->Organisation})" ).

I have a few ideas of how to achieve this:

  1. Store the format in html/js in the template. Then the AJAX-call can send the desired return-format along with the request. Drawback : A malicious user can change the format in the request, which might be a security issue.
  2. Pass along the entire $Option object, and do the formatting using JavaScript. Drawback : Cannot use the PHP object's methods, such as $Option->GetName() .
  3. Store the format in a separate template file, and reference to this file in html/js and send along with the AJAX request. Drawback : The reference to the template file can be changed by a malicious user, but probably no damage can be done. This approach requires extra template files, and the presentation logic will be spread over different files.
  4. Create a Smarty plugin that automates the process of item 3. Then the presentation logic will not be separated. Drawback : The reference to the template file can be changed by a malicious user, but probably no damage can be done.

Do anyone have any other/better ideas, or any experience with doing something like this?

I don't think you need to set some format. You can create a javascript function with 3 parameters. The <select> tag identifier, the name of the key used for options value, and the key name used for options text. The function will make the ajax request. That way you can call the function with settings you need for particular situation.

Further details depend on your current code.

I ended up using option 4, and I'm very happy with the result.

If anyone come across this and need information on how I implemented it, just post a comment, and I'll try to explain.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM