1. <?php
  2. /**
  3. * Creates the page to add dependency on another package or php extension.
  4. *
  5. * @category   PEAR
  6. * @package    PEAR_PackageFileManager_Frontend_Web
  7. * @author     Laurent Laville <pear@laurent-laville.org>
  8. * @copyright  2005-2006 Laurent Laville
  9. * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
  10. * @since      File available since Release 0.1.0
  11. */
  12.  
  13. require_once 'PEAR/PackageFileManager/Frontend/Decorator/HTMLTable.php';
  14.  
  15. /**
  16. * Creates the page to add dependency on another package or php extension.
  17. *
  18. * @category   PEAR
  19. * @package    PEAR_PackageFileManager_Frontend_Web
  20. * @author     Laurent Laville <pear@laurent-laville.org>
  21. * @copyright  2005-2006 Laurent Laville
  22. * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
  23. * @since      Class available since Release 0.1.0
  24. */
  25. class DependenciesPage extends TabbedPage
  26. {
  27.     /**
  28.      * Builds the current form-page.
  29.      *
  30.      * @since  0.1.0
  31.      * @access public
  32.      */
  33.     function buildForm()
  34.     {
  35.         $this->buildTabs();
  36.         // tab caption
  37.         $this->addElement('header', null, 'Manage the list of dependencies');
  38.  
  39.         $fe =& PEAR_PackageFileManager_Frontend::singleton();
  40.         $sess =& $fe->container();
  41.  
  42.         $selection = $this->getSubmitValue('deps');
  43.         $selection_count = count($selection);
  44.         $fe->log('debug',
  45.             str_pad($this->getAttribute('id') .'('. __LINE__ .')', 20, '.') .
  46.             ' selection='. serialize($selection)
  47.         );
  48.  
  49.         list($page, $action) = $this->controller->getActionName();
  50.  
  51.         // selection list (false) or edit dialog frame (true)
  52.         if ($action == 'edit' && $selection_count == 1) {
  53.             $editDialog = true;
  54.         } elseif ($action == 'add' && $selection_count == 0) {
  55.             $editDialog = true;
  56.         }elseif ($action == 'save') {
  57.             $editDialog = true;
  58.         } else {
  59.             $editDialog = false;
  60.         }
  61.  
  62.         $dependencies = $fe->getDepList();
  63.         // set default dependencies list used when we click on 'Reset' button
  64.         $fe->setDefaults('dependencies');
  65.  
  66.         if (!$editDialog) {
  67.  
  68.             $hdr = array('Type', 'Channel', 'Name', 'Extension', 'Min', 'Max', 'Recommended', 'Exclude');
  69.             $table = new HTML_Table(array('class' => 'tableone'));
  70.             $htmltableDecorator = new PEAR_PackageFileManager_Frontend_Decorator_HTMLTable($fe);
  71.             $htmltableDecorator->setHtmlTable($table);
  72.             $htmltableDecorator->getDepList($hdr);
  73.             // We need a simple static html area for maintainers list.
  74.             $this->addElement('static', 'dependencies', '', $htmltableDecorator->toHtml());
  75.  
  76.             $commands = array('drop', 'edit', 'add');
  77.             $nocmd    = array('commit');
  78.  
  79.         } else {
  80.  
  81.             $channels = array_keys($sess['packages']);
  82.             array_unshift($channels, '');
  83.             $channels = array_combine($channels, $channels);
  84.  
  85.             $names = $sess['packages'];
  86.  
  87.             $extensions = $sess['extensions'];
  88.             $extensions[] = '';
  89.             sort($extensions, SORT_ASC);
  90.             $extensions = array_combine($extensions, $extensions);
  91.  
  92.             // Type options list: (value => text, with value === text)
  93.             $types = array('optional','required');
  94.             $types = array_combine($types, $types);
  95.  
  96.             $this->addElement('select', 'type', 'Type:', $types, array('style' => 'width:10em;'));
  97.             $this->addElement('select', 'extension', 'Extension:', $extensions, array('style' => 'width:10em;'));
  98.  
  99.             $pkgInstalled =& $this->addElement('hierselect', 'name', null, array('class' => 'flat'), '&nbsp;');
  100.             $pkgInstalled->setLabel('Name:');
  101.             $pkgInstalled->setOptions(array($channels, $names));
  102.  
  103.             $this->addElement('text', 'min', 'Min:', array('size' => 10));
  104.             $this->addElement('text', 'max', 'Max:', array('size' => 10));
  105.             $this->addElement('text', 'recommended', 'Recommended:', array('size' => 10));
  106.             $this->addElement('text', 'exclude', 'Exclude:', array('size' => 10));
  107.  
  108.             if ($selection_count == 0) {
  109.                 $key1 = -1;
  110.                 $def = array('type' => 'required');
  111.             } else {
  112.                 $needle = array_keys($selection);
  113.                 $key1   = array_pop($needle);
  114.                 $def = array(
  115.                     'type'        => $dependencies[$key1]['type'],
  116.                     'extension'   => $dependencies[$key1]['extension'],
  117.                     'name'        => array($dependencies[$key1]['channel'], $dependencies[$key1]['name']),
  118.                     'min'         => $dependencies[$key1]['min'],
  119.                     'max'         => $dependencies[$key1]['max'],
  120.                     'recommended' => $dependencies[$key1]['recommended'],
  121.                     'exclude'     => $dependencies[$key1]['exclude']
  122.                 );
  123.             }
  124.             $this->addElement('hidden', 'depid', $key1);
  125.  
  126.             // applies new filters to the element values
  127.             $this->applyFilter('__ALL__', 'trim');
  128.             // apply form rules
  129.             $this->addFormRule(array(&$this, 'cbValidateDependency'));
  130.  
  131.             // old values to edit
  132.             $this->setDefaults($def);
  133.  
  134.             $commands = array('save', 'cancel');
  135.             $nocmd    = array('commit','reset');
  136.         }
  137.  
  138.         // Buttons of the wizard to do the job
  139.         $this->buildButtons($nocmd, $commands);
  140.     }
  141.  
  142.     /**
  143.      * Callback to validate Dependency form page in edit mode
  144.      *
  145.      * @return TRUE on form validation success, errors array if form validation failed
  146.      * @since  0.1.0
  147.      * @access private
  148.      */
  149.     function cbValidateDependency($fields)
  150.     {
  151.         $errors = array();
  152.         if (empty($fields['extension']) && count($fields['name']) == 1) {
  153.             $errors['name'] = 'Extension or Package is required';
  154.         }
  155.         return empty($errors)? true: $errors;
  156.     }
  157.  
  158.     /**
  159.      * Sets the default values for the dependencies page
  160.      *
  161.      * @return void
  162.      * @since  0.1.0
  163.      * @access public
  164.      * @see    HTML_QuickForm_Controller::applyDefaults()
  165.      */
  166.     function applyDefaults()
  167.     {
  168.         list($page, $action) = $this->controller->getActionName();
  169.         $fe =& PEAR_PackageFileManager_Frontend::singleton();
  170.         $fe->log('debug',
  171.             str_pad($this->getAttribute('id') .'('. __LINE__ .')', 20, '.') .
  172.             " applyDefaults ActionName=($page,$action)"
  173.         );
  174.  
  175.         // apply only when in list mode,
  176.         if ($action == 'reset') {
  177.             $fe->getDepList(true);
  178.         }
  179.     }
  180. }
  181.  
  182. /**
  183. * Manage actions to add or edit dependency on another package or php extension.
  184. *
  185. * @category   PEAR
  186. * @package    PEAR_PackageFileManager_Frontend_Web
  187. * @author     Laurent Laville <pear@laurent-laville.org>
  188. * @copyright  2005-2006 Laurent Laville
  189. * @license    http://www.php.net/license/3_01.txt  PHP License 3.01
  190. * @since      Class available since Release 0.1.0
  191. */
  192. class DependenciesPageAction extends HTML_QuickForm_Action
  193. {
  194.     /**
  195.      * Processes the request.
  196.      *
  197.      * @param  object   HTML_QuickForm_Page  the current form-page
  198.      * @param  string   Current action name, as one Action object can serve multiple actions
  199.      * @since  0.1.0
  200.      * @access public
  201.      */
  202.     function perform(&$page, $actionName)
  203.     {
  204.         $page->isFormBuilt() or $page->buildForm();
  205.         $pageName = $page->getAttribute('id');
  206.         $fe =& PEAR_PackageFileManager_Frontend::singleton();
  207.         $fe->log('debug',
  208.             str_pad($pageName .'('. __LINE__ .')', 20, '.') .
  209.             ' ActionProcess='. $actionName
  210.         );
  211.  
  212.         if ($actionName == 'add' || $actionName == 'edit' || $actionName == 'cancel') {
  213.             return $page->handle('display');
  214.         }
  215.  
  216.         // save the form values and validation status to the session
  217.         $sess =& $fe->container();
  218.         $sess['values'][$pageName] = $page->exportValues();
  219.         $sess['valid'][$pageName]  = $page->validate();
  220.  
  221.         if (isset($sess['valid'][$pageName]) && $sess['valid'][$pageName]) {
  222.  
  223.             switch ($actionName) {
  224.                 case 'drop':
  225.                     $selection = $page->getSubmitValue('deps');
  226.                     if (is_array($selection)) {
  227.                         $keys = array_keys($selection);
  228.                         foreach ($keys as $key1) {
  229.                             if (empty($sess['dependencies'][$key1]['extension'])) {
  230.                                 $_dep = $sess['dependencies'][$key1]['name'] .'" (package)';
  231.                             } else {
  232.                                 $_dep = $sess['dependencies'][$key1]['extension'] .'" (extension)';
  233.                             }
  234.                             $fe->log('info',
  235.                                 str_pad($pageName .'('. __LINE__ .')', 20, '.') .
  236.                                 ' drop dependency: "'. $_dep
  237.                             );
  238.                             unset($sess['dependencies'][$key1]);
  239.                         }
  240.                     }
  241.                     break;
  242.                 case 'save':
  243.                     $data = $page->exportValues(array('type','extension','name','min','max','recommended','exclude'));
  244.                     $data['channel'] = $data['name'][0];
  245.                     $data['name'] = $data['name'][1];
  246.                     $key1 = $sess['values'][$pageName]['depid'];
  247.                     if (empty($data['extension'])) {
  248.                         $_dep = $data['name'] .'" (package)';
  249.                     } else {
  250.                         $_dep = $data['extension'] .'" (extension)';
  251.                         unset($data['name']);
  252.                     }
  253.                     if ($key1 < 0) {
  254.                         array_push($sess['dependencies'], $data);
  255.                         $fe->log('info',
  256.                             str_pad($pageName .'('. __LINE__ .')', 20, '.') .
  257.                             ' add dependency: "'. $_dep
  258.                         );
  259.                     } else {
  260.                         $sess['dependencies'][$key1] = $data;
  261.                         $fe->log('info',
  262.                             str_pad($pageName .'('. __LINE__ .')', 20, '.') .
  263.                             ' edit dependency: "'. $_dep
  264.                         );
  265.                     }
  266.                     break;
  267.             }
  268.             return $page->handle('jump');
  269.         }
  270.         return $page->handle('display');
  271.     }
  272. }
  273. ?>