HTML_QuickForm2
[ class tree: HTML_QuickForm2 ] [ index: HTML_QuickForm2 ] [ all elements ]

Source for file repeat.php

Documentation is available at repeat.php

  1. <?php
  2. /**
  3.  * Usage example for HTML_QuickForm2 package: repeat element
  4.  */
  5.  
  6. require_once 'HTML/QuickForm2.php';
  7. require_once 'HTML/QuickForm2/Renderer.php';
  8.  
  9. $form = new HTML_QuickForm2('testRepeat');
  10.  
  11. $form->addDataSource(new HTML_QuickForm2_DataSource_Array(array(
  12.     'country' => array(4706180),
  13.     'street'  => array(
  14.         'Secret Taliban caves',
  15.         'Pirate hideout. Aaargh!',
  16.         'Somewhere in the jungle'
  17.     ),
  18.     'default' => array(truefalsefalse),
  19.  
  20.     'links' => array(
  21.         'main'  => 'yes_1',
  22.         'title' => array('php.net''pear.php.net''google.com')
  23.     )
  24. )));
  25.  
  26. /* @var $fsOne HTML_QuickForm2_Container_Fieldset */
  27. $fsOne    $form->addFieldset()->setLabel('Fieldset-based repeat element');
  28.  
  29. /* @var $repeatFs HTML_QuickForm2_Container_Repeat */
  30. $repeatFs $fsOne->addRepeat()
  31.                   ->setPrototype(HTML_QuickForm2_Factory::createElement('fieldset'))
  32.                   ->setId('repeat-fieldset')
  33.                   ->setLabel('Shipping addresses');
  34.  
  35. $countries = array(
  36.     ''  => "-- please select --",
  37.     4   => "Afghanistan",
  38.     148 => "Chad",
  39.     180 => "Congo, Democratic Republic of",
  40.     368 => "Iraq",
  41.     706 => "Somalia",
  42.     736 => "Sudan",
  43.     716 => "Zimbabwe"
  44. );
  45.  
  46. $country $repeatFs->addSelect('country')->loadOptions($countries)->setLabel('Country:');
  47. $repeatFs->addText('region'array('style' => 'width: 20em;'))->setLabel('Region:');
  48. $street  $repeatFs->addText('street'array('style' => 'width: 20em;'))->setLabel('Street address:');
  49. $repeatFs->addCheckbox('default')->setContent('default shipping address');
  50. // button to remove a repeated item from a repeat, enabled automatically
  51. $repeatFs->addButton('remove'array('type' => 'button'))
  52.          ->setContent('remove this address')
  53.          ->addClass('repeatRemove');
  54.  
  55. // setting rules for repeated elements, these will work properly server-side and client-side
  56. $country->addRule('required''Please select a country'null,
  57.                   HTML_QuickForm2_Rule::ONBLUR_CLIENT_SERVER);
  58. $street->addRule('required''Please input street address'null,
  59.                  HTML_QuickForm2_Rule::ONBLUR_CLIENT_SERVER);
  60.  
  61.  
  62. /* @var $fsTwo HTML_QuickForm2_Container_Fieldset */
  63. $fsTwo $form->addFieldset()->setLabel('Group-based repeat element');
  64. /* @var $repeatGroup HTML_QuickForm2_Container_Repeat */
  65. $repeatGroup $fsTwo->addRepeat(
  66.                     nullarray('id' => 'repeat-group'),
  67.                     array('prototype' => HTML_QuickForm2_Factory::createElement('group''links')
  68.                                          ->setLabel('A link:')->setSeparator('&nbsp;'))
  69.                )->setIndexField('links[title]'// not strictly necessary, but doesn't hurt either
  70.                 ->setLabel('Links');
  71.  
  72. $repeatGroup->addText('title'array('style' => 'width: 15em;'));
  73. // specially crafted value attribute to prevent adding index to name
  74. $repeatGroup->addRadio('main'array('value' => 'yes_:idx:'))->setContent('main');
  75. // button to remove a repeated item from a repeat
  76. $repeatGroup->addButton('remove'array('type' => 'button'))
  77.             ->setContent('X')
  78.             ->addClass('repeatRemove');
  79. // a button for adding repeated elements, with an explicit onclick
  80. $fsTwo->addButton('add'array(
  81.     'type'    => 'button',
  82.     'onclick' => "document.getElementById('repeat-group').repeat.add(); return false;"
  83. ))->setContent('Add another link');
  84.  
  85.  
  86. $form->addSubmit('submit'array('value' => 'Send this form'));
  87.  
  88. /* @var $renderer HTML_QuickForm2_Renderer_Default */
  89. $renderer HTML_QuickForm2_Renderer::factory('default');
  90. // a custom template for first repeat element, a link for adding repeated
  91. // elements there will be automatically made active due to repeatAdd class
  92. $renderer->setTemplateForId(
  93.     'repeat-fieldset',
  94.     <<<HTML
  95. <div class="row repeat" id="{id}">
  96.  <qf:label><p>{label}</p></qf:label>
  97.  {content}<br />
  98.  <a class="repeatAdd" href="#">Add another address...</a>
  99. </div>
  100. HTML
  101. );
  102.  
  103. /* 
  104. // Use this with the callback renderer
  105. $renderer->setCallbackForId(
  106.     'repeat-fieldset', function ($renderer, $repeat) {
  107.         return sprintf(
  108.             '<div class="row repeat" id="%s"><p>%s</p><br /><a class="repeatAdd" href="#">Add another address...</a></div>',
  109.             $repeat->getId(), $repeat->getLabel(), implode(array_pop($renderer->html))
  110.         );
  111.     });
  112. */
  113.  
  114. $form->render($renderer);
  115.  
  116. ?>
  117. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  118.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  119. <html xmlns="http://www.w3.org/1999/xhtml">
  120. <head>
  121.     <style type="text/css">
  122.  
  123. /* Set up custom font and form width */
  124. body {
  125.     margin-left: 10px;
  126.     font-family: Arial,sans-serif;
  127.     font-size: small;
  128. }
  129.  
  130. .quickform {
  131.     min-width: 500px;
  132.     max-width: 600px;
  133.     width: 560px;
  134. }
  135.  
  136. /* Use default styles included with the package */
  137. <?php
  138. if ('@data_dir@' != '@' 'data_dir@'{
  139.     $filename '@data_dir@/HTML_QuickForm2/quickform.css';
  140. else {
  141.     $filename dirname(dirname(dirname(__FILE__))) '/data/quickform.css';
  142. }
  143. readfile($filename);
  144. ?>
  145.  
  146. /* http://www.quirksmode.org/css/clearing.html */
  147. #repeat-group .repeatItem { overflow: auto; width: 100%; }
  148.  
  149. /* zebra table for group-based repeat */
  150. .quickform .repeat .odd  { background-color: #FEE; }
  151. .quickform .repeat .even { background-color: #EEF; }
  152.  
  153.     </style>
  154. <?php
  155.  
  156. // Inline QuickForm's javascript libraries
  157. echo $renderer->getJavascriptBuilder()->getLibraries(truetrue);
  158.  
  159. ?>
  160.     <title>HTML_QuickForm2 repeat element example</title>
  161. </head>
  162. <body>
  163. <?php
  164.  
  165. if ($form->validate()) {
  166.     echo "<pre>\n";
  167.     var_dump($form->getValue());
  168.     echo "\n</pre><hr />";
  169. }
  170.  
  171. echo $renderer;
  172.  
  173. ?>
  174. <script type="text/javascript">
  175. // <![CDATA[
  176.  
  177. // add event handlers to repeats
  178. var repeatFs    = document.getElementById('repeat-fieldset').repeat,
  179.     repeatGroup = document.getElementById('repeat-group').repeat;
  180.  
  181. repeatFs.onBeforeAdd = function()
  182. {
  183.     var items = this.getElementsByClass('repeatItem', this.container);
  184.     // 5 visible items and 1 hidden prototype
  185.     if (items.length > 5) {
  186.         alert('5 addresses should be enough for everybody!');
  187.         return false;
  188.     }
  189.     return true;
  190. };
  191.  
  192. repeatFs.onBeforeRemove = function(item)
  193. {
  194.     var items = this.getElementsByClass('repeatItem', this.container);
  195.     if (2 == items.length) {
  196.         alert('You cannot remove the last address');
  197.         return false;
  198.     }
  199.     return true;
  200. };
  201.  
  202. repeatGroup.onChange = function()
  203. {
  204.     var items = this.getElementsByClass('repeatItem', this.container);
  205.     for (var i = 1, item; item = items[i]; i++) {
  206.         qf.classes.add(item, i % 2 ? 'odd' : 'even');
  207.         qf.classes.remove(item, i % 2 ? 'even' : 'odd');
  208.     }
  209. };
  210.  
  211. // paint zebra for initial values
  212. repeatGroup.onChange();
  213.  
  214. // ]]>
  215. </script>
  216. </body>
  217. </html>

Documentation generated on Wed, 10 Apr 2019 08:56:11 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.