예제 #1
0
 /**
  * Build Field
  */
 private function _build_field($data, $context)
 {
     // include the resources
     Assets_helper::include_sheet_resources();
     // prep the settings
     $this->_prep_settings($this->settings);
     // -------------------------------------------
     //  Field HTML
     // -------------------------------------------
     if ($is_cell = isset($this->cell_name)) {
         $vars['field_name'] = $this->cell_name;
         $vars['field_id'] = str_replace(array('[', ']'), array('_', ''), $this->cell_name);
     } else {
         if ($this->var_id) {
             $vars['field_name'] = $this->field_name;
             $vars['field_id'] = str_replace(array('[', ']'), array('_', ''), $this->field_name);
         } else {
             if ($this->element_id) {
                 $vars['field_name'] = $this->field_name;
                 $vars['field_id'] = $this->_extract_element_id($this->field_name);
             } else {
                 if ($context == 'grid') {
                     $cell_name = 'col_id_' . $this->settings['col_id'];
                     $vars['field_id'] = $vars['field_name'] = $cell_name;
                 } else {
                     $vars['field_name'] = $vars['field_id'] = $this->field_name;
                 }
             }
         }
     }
     // -------------------------------------------
     //  Get the selected files
     // -------------------------------------------
     $entry_id = $this->EE->input->get('entry_id');
     $vars['files'] = array();
     // if there was a validation error, EE's already passed us the post array
     if (is_array($data)) {
         foreach ($data as $file_id) {
             if (!empty($file_id)) {
                 $file = $this->EE->assets_lib->get_file_by_id($file_id, TRUE);
                 if ($file !== FALSE) {
                     $vars['files'][] = $file;
                 }
             }
         }
     } else {
         if ($context == 'channel' && $this->EE->input->get('entry_id') || $context == 'matrix' && isset($this->row_id) || $context == 'grid' && isset($this->settings['grid_row_id']) && isset($this->settings['col_id']) || $context == 'low' || $context == 'content_elements') {
             if ($context == 'grid') {
                 // Set up these properties so we can select data the same way we do for Matrix
                 $this->row_id = $this->settings['grid_row_id'];
                 $this->col_id = $this->settings['col_id'];
                 // Also stop lying about our field id.
                 $this->field_id = $this->settings['grid_field_id'];
             }
             $sql = "SELECT DISTINCT a.source_type, a.folder_id, a.file_name, a.file_id, af.source_id, af.filedir_id\n\t\t\t        FROM exp_assets_files AS a\n\t\t\t        INNER JOIN exp_assets_selections AS ae ON ae.file_id = a.file_id\n\t\t\t        INNER JOIN exp_assets_folders AS af ON af.folder_id = a.folder_id\n\t\t\t        WHERE";
             switch ($context) {
                 case 'low':
                     $sql .= " ae.var_id = {$this->var_id}";
                     break;
                 case 'content_elements':
                     $element_id = $this->_extract_element_id($this->field_name);
                     $sql .= ' ae.element_id = "' . $element_id . '"';
                     $is_draft = isset($this->EE->session->cache['ep_better_workflow']['is_draft']) && $this->EE->session->cache['ep_better_workflow']['is_draft'];
                     $sql .= ' AND is_draft = ' . ($is_draft ? '1' : '0') . ' ';
                     break;
                 case 'matrix':
                 case 'grid':
                     $sql .= " ae.col_id = '{$this->col_id}'\n\t\t\t\t\t\t\t\t  AND ae.row_id = '{$this->row_id}'\n\t\t\t\t\t\t\t\t  AND";
                     if (!empty($this->var_id)) {
                         $sql .= " ae.var_id = " . $this->var_id;
                     } else {
                         $entry_id = $this->EE->security->xss_clean($this->EE->input->get('entry_id'));
                         if (!$entry_id) {
                             $entry_id = $this->settings['entry_id'];
                         }
                         $sql .= " ae.entry_id " . ($entry_id ? "= '{$entry_id}'" : 'IS NULL') . " AND ae.field_id " . ($this->field_id ? "= '{$this->field_id}'" : 'IS NULL');
                     }
                     break;
                 case 'channel':
                     $entry_id = $this->EE->security->xss_clean($this->EE->input->get('entry_id'));
                     $sql .= " ae.entry_id " . ($entry_id ? "= '{$entry_id}'" : 'IS NULL') . " AND ae.field_id " . ($this->field_id ? "= '{$this->field_id}'" : 'IS NULL');
             }
             $sql .= ' ORDER BY ae.sort_order';
             if ($this->settings['multi'] == 'n') {
                 $sql .= ' LIMIT 1';
             }
             // -------------------------------------------
             //  'assets_field_selections_query' hook
             //   - Modify the row data before it gets saved to exp_assets_selections
             //
             if ($this->EE->extensions->active_hook('assets_field_selections_query')) {
                 $query = $this->EE->extensions->call('assets_field_selections_query', $this, $sql);
             } else {
                 $query = $this->EE->db->query($sql);
             }
             //
             // -------------------------------------------
             foreach ($query->result() as $row) {
                 try {
                     if ($file = $this->EE->assets_lib->get_file_by_id($row->file_id, TRUE)) {
                         $vars['files'][] = $file;
                     }
                 } catch (Exception $exception) {
                     // these files are gone.
                 }
             }
         }
     }
     $vars['multi'] = $this->settings['multi'] == 'y';
     $vars['helper'] = $this->EE->assets_lib;
     if ($this->settings['view'] == 'thumbs') {
         // load the filemanager library and file helper for generating thumbs
         $this->EE->load->library('filemanager');
         $this->EE->load->helper('file');
         $vars['file_view'] = 'thumbview/thumbview';
         $vars['thumb_size'] = $this->settings['thumb_size'];
         $vars['show_filenames'] = $this->settings['show_filenames'] == 'y';
     } else {
         $vars['file_view'] = 'listview/listview';
         $vars['cols'] = $this->settings['show_cols'];
     }
     if ($context == 'content_elements') {
         $vars['ce_options'] = Assets_helper::get_json($this->settings);
     } else {
         $vars['ce_options'] = NULL;
     }
     $r = $this->EE->load->view('field/field', $vars, TRUE);
     // Add a hidden input in case no files are selected
     $r .= '<input type="hidden" name="' . ($is_cell ? $this->cell_name : $this->field_name) . '[]" value="" />';
     // Include any thumb CSS queued up by the field
     Assets_helper::insert_queued_css();
     // -------------------------------------------
     //  Pass field settings to JS
     // -------------------------------------------
     if (!$is_cell || !isset($this->cache['initialized_col_settings'][$this->col_id])) {
         if ($is_cell) {
             $namespace = 'col_id_' . $this->col_id;
         } else {
             if ($context == 'content_elements') {
                 $namespace = 'element_id_' . $this->element_id;
             } else {
                 $namespace = 'field_id_' . $this->field_id;
             }
         }
         $settings_json = Assets_helper::get_json(array('filedirs' => $this->settings['filedirs'], 'multi' => $vars['multi'], 'view' => $this->settings['view'], 'thumb_size' => $this->settings['thumb_size'], 'show_filenames' => $this->settings['show_filenames'], 'show_cols' => $this->settings['show_cols'], 'namespace' => $namespace));
         if ($is_cell) {
             Assets_helper::insert_js('Assets.Field.matrixConfs.col_id_' . $this->col_id . ' = ' . $settings_json . ';');
             $this->cache['initialized_col_settings'][$this->col_id] = TRUE;
         }
         if (!empty($this->element_id)) {
             if ($this->field_name != '__element_name__[__index__][data]') {
                 $field_id = $this->_extract_element_id($this->field_name);
                 Assets_helper::insert_js("new Assets.Field('{$field_id}', '{$this->field_name}', {$settings_json});");
             }
         } else {
             if ($context == 'grid') {
                 Assets_helper::insert_js('Assets.Field.gridConfs.col_id_' . $this->settings['col_id'] . ' = ' . $settings_json . ';');
             } else {
                 $field_id = preg_replace('/[^\\w\\-]+/', '_', $vars['field_id']);
                 Assets_helper::insert_js("new Assets.Field('{$field_id}', '{$this->field_name}', {$settings_json});");
             }
         }
     }
     return $r;
 }