diff options
Diffstat (limited to 'sites/all/modules/views_bulk_operations/plugins/operation_types/base.class.php')
-rw-r--r-- | sites/all/modules/views_bulk_operations/plugins/operation_types/base.class.php | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/sites/all/modules/views_bulk_operations/plugins/operation_types/base.class.php b/sites/all/modules/views_bulk_operations/plugins/operation_types/base.class.php new file mode 100644 index 000000000..968921fcd --- /dev/null +++ b/sites/all/modules/views_bulk_operations/plugins/operation_types/base.class.php @@ -0,0 +1,271 @@ +<?php + +/** + * @file + * Defines the base class for operations. + */ + +abstract class ViewsBulkOperationsBaseOperation { + + /** + * The id of the operation. + * + * Composed of the operation_type plugin name and the operation key, + * divided by '::'. For example: action::node_publish_action. + */ + public $operationId; + + /** + * The entity type that the operation is operating on. + * + * Not the same as $operationInfo['type'] since that value can be just + * "entity", which means "available to every entity type". + */ + public $entityType; + + /** + * Contains information about the current operation, as generated + * by the "list callback" function in the plugin file. + * + * @var array + */ + protected $operationInfo; + + /** + * Contains the options set by the admin for the current operation. + * + * @var array + */ + protected $adminOptions; + + /** + * Constructs an operation object. + * + * @param $operationId + * The id of the operation. + * @param $entityType + * The entity type that the operation is operating on. + * @param $operationInfo + * An array of information about the operation. + * @param $adminOptions + * An array of options set by the admin. + */ + public function __construct($operationId, $entityType, array $operationInfo, array $adminOptions) { + $this->operationId = $operationId; + $this->entityType = $entityType; + $this->operationInfo = $operationInfo; + $this->adminOptions = $adminOptions; + } + + /** + * Returns the value of an admin option. + */ + public function getAdminOption($key, $default = NULL) { + return isset($this->adminOptions[$key]) ? $this->adminOptions[$key] : $default; + } + + /** + * Returns the access bitmask for the operation, used for entity access checks. + */ + public function getAccessMask() { + // Assume edit by default. + return VBO_ACCESS_OP_UPDATE; + } + + /** + * Returns the id of the operation. + */ + public function id() { + return $this->operationId; + } + + /** + * Returns the name of the operation_type plugin that provides the operation. + */ + public function type() { + return $this->operationInfo['operation_type']; + } + + /** + * Returns the human-readable name of the operation, meant to be shown + * to the user. + */ + public function label() { + $admin_label = $this->getAdminOption('label'); + if (!empty($admin_label)) { + $label = t($admin_label); + } + else { + // If the admin didn't specify any label, fallback to the default one. + $label = $this->operationInfo['label']; + } + return $label; + } + + /** + * Returns the human-readable name of the operation, meant to be shown + * to the admin. + */ + public function adminLabel() { + return $this->operationInfo['label']; + } + + /** + * Returns whether the operation is configurable. Used to determine + * whether the operation's form methods should be invoked. + */ + public function configurable() { + return !empty($this->operationInfo['configurable']); + } + + /** + * Returns whether the provided account has access to execute the operation. + * + * @param $account + */ + public function access($account) { + return TRUE; + } + + /** + * Returns the configuration form for the operation. + * Only called if the operation is declared as configurable. + * + * @param $form + * The views form. + * @param $form_state + * An array containing the current state of the form. + * @param $context + * An array of related data provided by the caller. + */ + abstract function form($form, &$form_state, array $context); + + /** + * Validates the configuration form. + * Only called if the operation is declared as configurable. + * + * @param $form + * The views form. + * @param $form_state + * An array containing the current state of the form. + */ + abstract function formValidate($form, &$form_state); + + /** + * Handles the submitted configuration form. + * This is where the operation can transform and store the submitted data. + * Only called if the operation is declared as configurable. + * + * @param $form + * The views form. + * @param $form_state + * An array containing the current state of the form. + */ + abstract function formSubmit($form, &$form_state); + + /** + * Returns the admin options form for the operation. + * + * The admin options form is embedded into the VBO field settings and used + * to configure operation behavior. The options can later be fetched + * through the getAdminOption() method. + * + * @param $dom_id + * The dom path to the level where the admin options form is embedded. + * Needed for #dependency. + * @param $field_handler + * The Views field handler object for the VBO field. + */ + public function adminOptionsForm($dom_id, $field_handler) { + $label = $this->getAdminOption('label', ''); + + $form = array(); + $form['override_label'] = array( + '#type' => 'checkbox', + '#title' => t('Override label'), + '#default_value' => $label !== '', + '#dependency' => array( + $dom_id . '-selected' => array(1), + ), + ); + $form['label'] = array( + '#type' => 'textfield', + '#title' => t('Provide label'), + '#title_display' => 'invisible', + '#default_value' => $label, + '#dependency' => array( + $dom_id . '-selected' => array(1), + $dom_id . '-override-label' => array(1), + ), + '#dependency_count' => 2, + ); + + return $form; + } + + /** + * Validates the admin options form. + * + * @param $form + * The admin options form. + * @param $form_state + * An array containing the current state of the form. Note that this array + * is constructed by the VBO views field handler, so it's not a real form + * state, it contains only the 'values' key. + * @param $error_element_base + * The base to prepend to field names when using form_set_error(). + * Needed because the admin options form is embedded into a bigger form. + */ + public function adminOptionsFormValidate($form, &$form_state, $error_element_base) { + // No need to do anything, but make the function have a body anyway + // so that it's callable by overriding methods. + } + + /** + * Handles the submitted admin options form. + * Note that there is no need to handle saving the options, that is done + * by the VBO views field handler, which also injects the options into the + * operation object upon instantiation. + * + * @param $form + * The admin options form. + * @param $form_state + * An array containing the current state of the form. Note that this array + * is constructed by the VBO views field handler, so it's not a real form + * state, it contains only the 'values' key. + */ + public function adminOptionsFormSubmit($form, &$form_state) { + // If the "Override label" checkbox was deselected, clear the entered value. + if (empty($form_state['values']['override_label'])) { + $form_state['values']['label'] = ''; + } + } + + /** + * Returns whether the selected entities should be aggregated + * (loaded in bulk and passed in together). + * To be avoided if possible, since aggregation makes it impossible to use + * Batch API or the Drupal Queue for execution. + */ + public function aggregate() { + return !empty($this->operationInfo['aggregate']); + } + + /** + * Returns whether the operation needs the full selected views rows to be + * passed to execute() as a part of $context. + */ + public function needsRows() { + return FALSE; + } + + /** + * Executes the selected operation on the provided data. + * + * @param $data + * The data to to operate on. An entity or an array of entities. + * @param $context + * An array of related data (selected views rows, etc). + */ + abstract function execute($data, array $context); +} |