8.19. How do I modify the Save Cart and Recurring Cart feature? How do they work?

The code for these features is in templates/components/cart. The relative portion that is executed first when you call the basket page is this:

      [button
          text="Save This Cart"
          src="__THEME__/savecart.gif"
          extra="class=contentbar2"
          hidetext=1
          form=basket
          mv_check="Save This Cart"
      ]
          mv_todo=return
          mv_nextpage=ord/basket
          save_cart=cart
      [/button]
      [button
          text="Set As Recurring Order"
          src="__THEME__/saverecur.gif"
          extra="class=contentbar2"
          hidetext=1
          form=basket
          mv_check="Set As Recurring Order"
      ]
          [set save_cart]recurring[/set]
          mv_todo=return
          mv_nextpage=ord/basket
          save_cart=recurring
      [/button]

This creates two buttons that set save_cart to either 'cart' or 'recurring', then go to the ord/basket page (where you are already). When clicked, one of these two code blocks will be executed:

 [if value save_cart eq 'recurring']
            <FORM ACTION="[process-target]" METHOD=POST>
            To save this recurring order, give it a nickname, then press 'Save Cart'.<br>
            Nickname:
            <INPUT TYPE=TEXT NAME="c_nickname" SIZE=11 VALUE="[scratch just_nickname]">
            <input type=hidden name=mv_session_id value="[data session id]">
                        <INPUT TYPE=HIDDEN NAME="c_recurring" VALUE="1">
            <INPUT TYPE=HIDDEN NAME="save_cart" VALUE="recurring">
            <INPUT TYPE=HIDDEN NAME="mv_todo" VALUE="return">
            <INPUT TYPE=HIDDEN NAME="mv_check" VALUE="Save Cart">
            <INPUT TYPE=SUBMIT VALUE="Save Cart">
            </FORM>
  [elsif value save_cart eq 'cart']
            <FORM ACTION="[process-target]" METHOD=POST>
            To save this cart, give it a nickname, then press 'Save Cart'.<br>
            Nickname:
            <INPUT TYPE=TEXT NAME="c_nickname" SIZE=11 VALUE="[scratch just_nickname]">
            <INPUT TYPE=HIDDEN NAME="c_recurring" VALUE="0">
            <INPUT TYPE=HIDDEN NAME="save_cart" VALUE="cart">
            <INPUT TYPE=HIDDEN NAME="mv_todo" VALUE="return">
            <INPUT TYPE=HIDDEN NAME="mv_check" VALUE="Save Cart">
                        <input type=hidden name=mv_session_id vlaue="[data session id]">
            <INPUT TYPE=SUBMIT VALUE="Save Cart">
            </FORM>
  [/elsif]

The "nickname" for the cart is set earlier via:

[if !scratch just_nickname]
  [seti just_nickname][tag time]%b-%d-%Y[/tag][/seti]
[/if]

The real work is done because of this: <INPUT TYPE=HIDDEN NAME="mv_check" VALUE="Save Cart"> which calls the following code after the the user clicks "Save Cart":

  [set Save Cart]
   mv_todo=return
   mv_nextpage=ord/basket
   save_cart=none
   [save_cart nickname="[value c_nickname]" recurring="[value c_recurring]"]
  [/set]

Which in turn calls the usertag "save_cart" with a nickname parameter and a recurring parameter. Depending on which button was clicked, recurring will either be 0 (for "Save This Cart") or 1 (for "Set As Recurring Order"). The save_cart usertag adds the cart to the userdb.carts field as a Perl data structure (hashes, arrays, etc.).