function filterNot($array, $callback = null, $lvl = 0) { if ($lvl < 1) { $array = array_diff_key($array, array_filter($array, $callback)); } if ($lvl != 0) { foreach ($array as &$val) { if (is_array($val)) { $val = SetMulti::filterNot($val, $callback, $lvl - 1); } } } return $array; }
function _parse_xls_cols($filePath) { if (file_exists($filePath)) { App::import('Vendor', 'Newsletter.php-ofc-library', array('file' => 'php-ofc-library/open-flash-chart.php')); App::import('Vendor', 'Newsletter.PHPExcel', array('file' => 'PHPExcel/IOFactory.php')); $objPHPExcel = PHPExcel_IOFactory::load($filePath); $objWorksheet = $objPHPExcel->getActiveSheet(); $highestRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); /////////////// cols config /////////////// $langs = Configure::read('languages'); $fieldsAlias = array('first_name' => array("first name", "firstname", "prenom"), 'last_name' => array("last name", "lastname", "nom", "nom de famille"), 'email' => array("email", "mail", "courriel")); $fieldsCharAlias = array("é" => "e", "è" => "e", "ê" => "e", "_" => " ", "-" => " "); $fieldGess = array('email' => '/^[\\w-]+@([\\w-]+\\.)+[\\w-]+$/', 'phone' => '/^\\(?[0-9]{3}\\)?[-\\s]?[0-9]{3}[-\\s]?[0-9]{4}$/', 'sex' => '/^(f|m)$/i', 'name' => '/^[a-z\\s-]+$/i'); $fields = $this->NewsletterSendlist->NewsletterEmail->schema(); unset($fields['id'], $fields['created'], $fields['modified'], $fields['sendlist_id']); $fields = array_merge(array('first_name' => array(), 'last_name' => array()), $fields); $defFieldsAlias = array(); $fieldsList = array(); foreach ($fields as $f => $opt) { $fieldsList[$f] = __(Inflector::humanize($f), true); $defFieldsAlias[$f] = array($f); $langTmp = Configure::read('Config.language'); foreach ($langs as $l) { Configure::write('Config.language', 'Config.language', $l); if (!in_array(__($f, true), $defFieldsAlias[$f])) { $defFieldsAlias[$f][] = __($f, true); } if (!in_array(__d('newsletter', $f, true), $defFieldsAlias[$f])) { $defFieldsAlias[$f][] = __d('newsletter', $f, true); } } Configure::write('Config.language', $langTmp); } unset($defFieldsAlias['active']); $fieldsAlias = array_merge($defFieldsAlias, $fieldsAlias); //debug($fieldsAlias); $fieldGess = array_intersect_key($fieldGess, $fieldsAlias); //debug($fieldGess); /////////////// Test first row /////////////// $first_row = array(); for ($col = 0; $col <= $highestColumnIndex; ++$col) { $cell = $objWorksheet->getCellByColumnAndRow($col, 1)->getValue(); $cell = mb_strtolower($cell); $cell = str_replace(array_keys($fieldsCharAlias), array_values($fieldsCharAlias), $cell); $first_row[$col] = $cell; } //debug($first_row); $cols_fields = array_flip($first_row); App::import('Lib', 'Newsletter.SetMulti'); $cols_fields = SetMulti::extractHierarchicMulti($fieldsAlias, $cols_fields); $cols_fields = SetMulti::filterNot($cols_fields, 'is_null'); $title_row = !empty($cols_fields); /////////////// Test data /////////////// $tmpGess = array_diff_key($fieldGess, $cols_fields); if (!empty($cols_fields['first_name'])) { unset($tmpGess['name']); } for ($i = 0; $i < 50 && !empty($tmpGess) && $i < $highestRow; $i++) { $row = $this->_get_xls_row($objWorksheet, $i + 1 + $title_row); //debug($row); foreach ($tmpGess as $f => $exp) { foreach ($row as $col => $val) { if (!in_array($col, $cols_fields)) { if (preg_match($exp, $val)) { unset($tmpGess[$f]); $cols_fields[$f] = $col; break; } } } } } $cols_fields = array_flip($cols_fields); /////////////// teaser /////////////// $teaser = array(); for ($i = 0; $i < 15 && $i < $highestRow; $i++) { $row = $this->_get_xls_row($objWorksheet, $i + 1); $teaser[] = $row; } //debug($cols_fields); return array('cols' => $cols_fields, 'fields' => $fieldsList, 'showFirst' => !$title_row, 'teaser' => $teaser); } return null; }
function _eventLog($listeners, &$options, $result) { $loggedListeners = array(); //debug($listeners); //debug(SetMulti::filterNot($options,'is_object',-1)); foreach ($listeners as $listener) { if ($listener['Event']['log']) { $loggedListeners[] = $listener; } } if (!empty($loggedListeners) || !empty($options['timed_event_id'])) { $this->TimedEvent = ClassRegistry::init('TimedEvent'); App::import('Lib', 'SetMulti'); $format = $this->getDataSource()->columns['datetime']['format']; $log = count($loggedListeners); $data = array('event_type_id' => reset(array_keys($options['all_types'])), 'time' => date($format), 'aro_id' => !empty($options['all_aros']) ? end($options['all_aros']) : null, 'aco_id' => !empty($options['all_acos']) ? end($options['all_acos']) : null, 'final_data' => SetMulti::filterNot($options, 'is_object', -1), 'context' => 'log'); if ($options['phase'] == 1) { $data['success'] = (bool) $result; } else { $data['success'] = 1; $data['result'] = $result; } if (!empty($options['timed_event_id'])) { $data['id'] = $options['timed_event_id']; $exclude = array('event_type_id', 'time', 'aro_id', 'aco_id', 'context'); $data = array_diff_key($data, array_flip($exclude)); } else { $data['active'] = 0; } foreach ($loggedListeners as $listener) { //debug($listener['Event']['function'].'_log'); $Handler = $this->getHandler($listener['Event']['handler']); if ($Handler && method_exists($Handler, $listener['Event']['function'] . '_log')) { $params = (array) $listener['Event']['params']; $params = $this->_parseParams($options, $params); $res = $Handler->{$listener['Event']['function'] . '_log'}($data, $params); if ($res === false) { $log--; } elseif (is_array($res)) { $data = $res; } } } if ($log || !empty($options['timed_event_id'])) { $this->TimedEvent->create(); $this->TimedEvent->save($data); if (empty($options['timed_event_id'])) { $options['timed_event_id'] = $this->TimedEvent->id; } } } }