public function edit($id, $step = 'userProfile') { $project = Model\Project::get($id, null); // para que tenga todas las imágenes $project->gallery = Model\Image::getAll($id, 'project'); // aunque pueda acceder edit, no lo puede editar si if ($project->owner != $_SESSION['user']->id && (isset($_SESSION['admin_node']) && $_SESSION['admin_node'] != \GOTEO_NODE) && (isset($_SESSION['admin_node']) && $project->node != $_SESSION['admin_node']) && !isset($_SESSION['user']->roles['superadmin']) && (isset($_SESSION['user']->roles['checker']) && !Model\User\Review::is_assigned($_SESSION['user']->id, $project->id))) { Message::Info('No tienes permiso para editar este proyecto'); throw new Redirection('/admin/projects'); } // si no tenemos SESSION stepped es porque no venimos del create if (!isset($_SESSION['stepped'])) { $_SESSION['stepped'] = array('userProfile' => 'userProfile', 'userPersonal' => 'userPersonal', 'overview' => 'overview', 'costs' => 'costs', 'rewards' => 'rewards', 'supports' => 'supports'); } if ($project->status != 1 && !ACL::check('/project/edit/todos')) { // solo puede estar en preview $step = 'preview'; $steps = array('preview' => array('name' => Text::get('step-7'), 'title' => Text::get('step-preview'), 'offtopic' => true)); } else { // todos los pasos // entrando, por defecto, en el paso especificado en url $steps = array('userProfile' => array('name' => Text::get('step-1'), 'title' => Text::get('step-userProfile'), 'offtopic' => true), 'userPersonal' => array('name' => Text::get('step-2'), 'title' => Text::get('step-userPersonal'), 'offtopic' => true), 'overview' => array('name' => Text::get('step-3'), 'title' => Text::get('step-overview')), 'costs' => array('name' => Text::get('step-4'), 'title' => Text::get('step-costs')), 'rewards' => array('name' => Text::get('step-5'), 'title' => Text::get('step-rewards')), 'supports' => array('name' => Text::get('step-6'), 'title' => Text::get('step-supports')), 'preview' => array('name' => Text::get('step-7'), 'title' => Text::get('step-preview'), 'offtopic' => true)); } foreach ($_REQUEST as $k => $v) { if (strncmp($k, 'view-step-', 10) === 0 && !empty($v) && !empty($steps[substr($k, 10)])) { $step = substr($k, 10); } } if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST)) { $errors = array(); // errores al procesar, no son errores en los datos del proyecto foreach ($steps as $id => &$data) { if (call_user_func_array(array($this, "process_{$id}"), array(&$project, &$errors))) { // si un process devuelve true es que han enviado datos de este paso, lo añadimos a los pasados if (!in_array($id, $_SESSION['stepped'])) { $_SESSION['stepped'][$id] = $id; } } } // guardamos los datos que hemos tratado y los errores de los datos $project->save($errors); // hay que mostrar errores en la imagen if (!empty($errors['image'])) { $project->errors['overview']['image'] = $errors['image']; $project->okeys['overview']['image'] = null; } // si estan enviando el proyecto a revisión if (isset($_POST['process_preview']) && isset($_POST['finish'])) { $errors = array(); $old_id = $project->id; if ($project->ready($errors)) { if ($_SESSION['project']->id == $old_id) { $_SESSION['project'] = $project; } // email a los de goteo $mailHandler = new Mail(); $mailHandler->reply = $project->user->email; $mailHandler->replyName = "{$project->user->name}"; $mailHandler->to = \GOTEO_MAIL; $mailHandler->toName = 'Revisor de proyectos'; $mailHandler->subject = 'Proyecto ' . $project->name . ' enviado a valoración'; $mailHandler->content = '<p>Han enviado un nuevo proyecto a revisión</p><p>El nombre del proyecto es: <span class="message-highlight-blue">' . $project->name . '</span> <br />y se puede ver en <span class="message-highlight-blue"><a href="' . SITE_URL . '/project/' . $project->id . '">' . SITE_URL . '/project/' . $project->id . '</a></span></p>'; $mailHandler->html = true; $mailHandler->template = 0; if ($mailHandler->send($errors)) { Message::Info(Text::get('project-review-request_mail-success')); } else { Message::Error(Text::get('project-review-request_mail-fail')); Message::Error(implode('<br />', $errors)); } unset($mailHandler); // email al autor // Obtenemos la plantilla para asunto y contenido $template = Template::get(8); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $project->name, $template->title); // En el contenido: $search = array('%USERNAME%', '%PROJECTNAME%'); $replace = array($project->user->name, $project->name); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->to = $project->user->email; $mailHandler->toName = $project->user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; if ($mailHandler->send($errors)) { Message::Info(Text::get('project-review-confirm_mail-success')); } else { Message::Error(Text::get('project-review-confirm_mail-fail')); Message::Error(implode('<br />', $errors)); } unset($mailHandler); // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('El proyecto ' . $project->name . ' se ha enviado a revision', '/project/' . $project->id, \vsprintf('%s ha inscrito el proyecto %s para <span class="red">revisión</span>, el estado global de la información es del %s', array(Feed::item('user', $project->user->name, $project->user->id), Feed::item('project', $project->name, $project->id), Feed::item('relevant', $project->progress . '%')))); $log->doAdmin('project'); unset($log); throw new Redirection("/dashboard?ok"); } } } elseif ($_SERVER['REQUEST_METHOD'] === 'POST' && empty($_POST)) { throw new Error(Error::INTERNAL, 'FORM CAPACITY OVERFLOW'); } //re-evaluar el proyecto $project->check(); // variables para la vista $viewData = array('project' => $project, 'steps' => $steps, 'step' => $step); // segun el paso añadimos los datos auxiliares para pintar switch ($step) { case 'userProfile': $owner = Model\User::get($project->owner, null); // si es el avatar por defecto no lo mostramos aqui if ($owner->avatar->id == 1) { unset($owner->avatar); } $viewData['user'] = $owner; $viewData['interests'] = Model\User\Interest::getAll(); if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/web-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; } } if (!empty($_POST['web-add'])) { $last = end($owner->webs); if ($last !== false) { $viewData["web-{$last->id}-edit"] = true; } } } break; case 'userPersonal': $viewData['account'] = Model\Project\Account::get($project->id); break; case 'overview': $viewData['categories'] = Model\Project\Category::getAll(); // $viewData['currently'] = Model\Project::currentStatus(); // $viewData['scope'] = Model\Project::scope(); break; case 'costs': $viewData['types'] = Model\Project\Cost::types(); if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/cost-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; } } if (!empty($_POST['cost-add'])) { $last = end($project->costs); if ($last !== false) { $viewData["cost-{$last->id}-edit"] = true; } } } break; case 'rewards': $viewData['stypes'] = Model\Project\Reward::icons('social'); $viewData['itypes'] = Model\Project\Reward::icons('individual'); $viewData['licenses'] = Model\Project\Reward::licenses(); // $viewData['types'] = Model\Project\Support::types(); if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/((social)|(individual))_reward-(\\d+)-edit/', $k)) { $viewData[$k] = true; } } if (!empty($_POST['social_reward-add'])) { $last = end($project->social_rewards); if ($last !== false) { $viewData["social_reward-{$last->id}-edit"] = true; } } if (!empty($_POST['individual_reward-add'])) { $last = end($project->individual_rewards); if ($last !== false) { $viewData["individual_reward-{$last->id}-edit"] = true; } } } break; case 'supports': $viewData['types'] = Model\Project\Support::types(); if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/support-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; } } if (!empty($_POST['support-add'])) { $last = end($project->supports); if ($last !== false) { $viewData["support-{$last->id}-edit"] = true; } } } break; case 'preview': $success = array(); if (empty($project->errors)) { $success[] = Text::get('guide-project-success-noerrors'); } if ($project->finishable) { $success[] = Text::get('guide-project-success-minprogress'); $success[] = Text::get('guide-project-success-okfinish'); } $viewData['success'] = $success; $viewData['types'] = Model\Project\Cost::types(); break; } $view = new View("view/project/edit.html.php", $viewData); return $view; }
public static function process($action = 'list', $id = null, $filters = array()) { $log_text = null; $errors = array(); // multiples usos $nodes = array(); if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['id'])) { $projData = Model\Project::get($_POST['id']); if (empty($projData->id)) { Message::Error('El proyecto ' . $_POST['id'] . ' no existe'); throw new Redirection('/admin/projects/images/' . $id); } if (isset($_POST['save-dates'])) { $fields = array('created', 'updated', 'published', 'success', 'closed', 'passed'); $set = ''; $values = array(':id' => $projData->id); foreach ($fields as $field) { if ($set != '') { $set .= ", "; } $set .= "`{$field}` = :{$field} "; if (empty($_POST[$field]) || $_POST[$field] == '0000-00-00') { $_POST[$field] = null; } $values[":{$field}"] = $_POST[$field]; } try { $sql = "UPDATE project SET " . $set . " WHERE id = :id"; if (Model\Project::query($sql, $values)) { $log_text = 'El admin %s ha <span class="red">tocado las fechas</span> del proyecto ' . $projData->name . ' %s'; } else { $log_text = 'Al admin %s le ha <span class="red">fallado al tocar las fechas</span> del proyecto ' . $projData->name . ' %s'; } } catch (\PDOException $e) { Message::Error(Text::_("No se ha guardado correctamente. ") . $e->getMessage()); } } elseif (isset($_POST['save-accounts'])) { $accounts = Model\Project\Account::get($projData->id); $accounts->bank = $_POST['bank']; $accounts->bank_owner = $_POST['bank_owner']; $accounts->paypal = $_POST['paypal']; $accounts->paypal_owner = $_POST['paypal_owner']; if ($accounts->save($errors)) { Message::Info(Text::_('Se han actualizado las cuentas del proyecto ') . $projData->name); } else { Message::Error(implode('<br />', $errors)); } } elseif ($action == 'images') { $todook = true; if (!empty($_POST['move'])) { $direction = $_POST['action']; Model\Project\Image::$direction($id, $_POST['move'], $_POST['section']); } foreach ($_POST as $key => $value) { $parts = explode('_', $key); if ($parts[1] == 'image' && in_array($parts[0], array('section', 'url'))) { if (Model\Project\Image::update($id, $parts[2], $parts[0], $value)) { // OK } else { $todook = false; Message::Error(Text::_('No se ha podido actualizar campo') . " {$parts[0]} -> {$value}"); } } } if ($todook) { Message::Info(Text::_('Se han actualizado los datos')); } throw new Redirection('/admin/projects/images/' . $id); } elseif ($action == 'rebase') { $todook = true; if ($_POST['proceed'] == 'rebase' && !empty($_POST['newid'])) { $newid = $_POST['newid']; // pimero miramos que no hay otro proyecto con esa id $test = Model\Project::getMini($newid); if ($test->id == $newid) { Message::Error(Text::_('Ya hay un proyecto con ese Id.')); throw new Redirection('/admin/projects/rebase/' . $id); } if ($projData->status >= 3 && $_POST['force'] != 1) { Message::Error(Text::_('El proyecto no está ni en Edición ni en Revisión, no se modifica nada.')); throw new Redirection('/admin/projects/rebase/' . $id); } if ($projData->rebase($newid)) { Message::Info(Text::_('Verificar el proyecto') . ' -> <a href="' . SITE_URL . '/project/' . $newid . '" target="_blank">' . $projData->name . '</a>'); throw new Redirection('/admin/projects'); } else { Message::Info(Text::_('Ha fallado algo en el rebase, verificar el proyecto') . ' -> <a href="' . SITE_URL . '/project/' . $projData->id . '" target="_blank">' . $projData->name . ' (' . $id . ')</a>'); throw new Redirection('/admin/projects/rebase/' . $id); } } } } /* * switch action, * proceso que sea, * redirect * */ if (isset($id)) { $project = Model\Project::get($id); } switch ($action) { case 'review': // pasar un proyecto a revision if ($project->ready($errors)) { $redir = '/admin/reviews/add/' . $project->id; $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Revision</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Revision</span>'; } break; case 'publish': // poner un proyecto en campa�a if ($project->publish($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">en Campa�a</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">en Campa�a</span>'; } break; case 'cancel': // descartar un proyecto por malo if ($project->cancel($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Descartado</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Descartado</span>'; } break; case 'enable': // si no esta en edicion, recuperarlo if ($project->enable($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Edicion</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Edicion</span>'; } break; case 'fulfill': // marcar que el proyecto ha cumplido con los retornos colectivos if ($project->satisfied($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Retorno cumplido</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Retorno cumplido</span>'; } break; case 'unfulfill': // dar un proyecto por financiado manualmente if ($project->rollback($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Financiado</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Financiado</span>'; } break; } if (isset($log_text)) { // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate(Text::_('Cambio estado/fechas/cuentas/nodo de un proyecto desde el admin'), '/admin/projects', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('project', $project->name, $project->id)))); $log->doAdmin('admin'); Message::Info($log->html); if (!empty($errors)) { Message::Error(implode('<br />', $errors)); } if ($action == 'publish') { // si es publicado, hay un evento publico $log->populate($project->name, '/project/' . $project->id, Text::html('feed-new_project'), $project->gallery[0]->id); $log->doPublic('projects'); } unset($log); if (empty($redir)) { throw new Redirection('/admin/projects/list'); } else { throw new Redirection($redir); } } if ($action == 'report') { // informe financiero // Datos para el informe de transacciones correctas $Data = Model\Invest::getReportData($project->id, $project->status, $project->round, $project->passed); return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'report', 'project' => $project, 'Data' => $Data)); } if ($action == 'dates') { // cambiar fechas return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'dates', 'project' => $project)); } if ($action == 'accounts') { $accounts = Model\Project\Account::get($project->id); // cambiar fechas return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'accounts', 'project' => $project, 'accounts' => $accounts)); } if ($action == 'images') { // imagenes $images = array(); // secciones $sections = Model\Project\Image::sections(); foreach ($sections as $sec => $secName) { $secImages = Model\Project\Image::get($project->id, $sec); foreach ($secImages as $img) { $images[$sec][] = $img; } } return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'images', 'project' => $project, 'images' => $images, 'sections' => $sections)); } if ($action == 'move') { // cambiar el nodo return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'move', 'project' => $project, 'nodes' => $nodes)); } if ($action == 'rebase') { // cambiar la id return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'rebase', 'project' => $project)); } // Rechazo express if ($action == 'reject') { if (empty($project)) { Message::Error(Text::_('No hay proyecto sobre el que operar')); } else { // Obtenemos la plantilla para asunto y contenido $template = Template::get(40); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $project->name, $template->title); $search = array('%USERNAME%', '%PROJECTNAME%'); $replace = array($project->user->name, $project->name); $content = \str_replace($search, $replace, $template->text); // iniciamos mail $mailHandler = new Mail(); $mailHandler->to = $project->user->email; $mailHandler->toName = $project->user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; if ($mailHandler->send()) { Message::Info('Se ha enviado un email a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>'); } else { Message::Error('Ha fallado al enviar el mail a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>'); } unset($mailHandler); } throw new Redirection('/admin/projects/list'); } if (!empty($filters['filtered'])) { $projects = Model\Project::getList($filters, $_SESSION['admin_node']); } else { $projects = array(); } $status = Model\Project::status(); $categories = Model\Project\Category::getAll(); //@CONTRACTSYS $calls = array(); // la lista de nodos la hemos cargado arriba $orders = array('name' => Text::_('Nombre'), 'updated' => Text::_('Enviado a revision')); return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'list', 'projects' => $projects, 'filters' => $filters, 'status' => $status, 'categories' => $categories, 'calls' => $calls, 'nodes' => $nodes, 'orders' => $orders)); }
Goteo\Model\Project\Category, Goteo\Model\Project\Skill, Goteo\Model\Blog, Goteo\Library\Text; $project = $this['project']; $show = $this['show']; $step = $this['step']; $post = $this['post']; $blog = $this['blog']; $thread = $this['thread']; $user = $_SESSION['user']; $personalData = ($user instanceof User) ? User::getPersonal($user->id) : new stdClass(); $categories = Category::getNames($project->id); $skills = Skill::getNames($project->id); if (!empty($project->investors)) { $supporters = ' (' . $project->num_investors . ')'; } else { $supporters = ''; } if (!empty($project->messages)) { $messages = ' (' . $project->num_messages . ')'; } else { $messages = ''; } if (!empty($blog->posts)) { $updates = ' (' . count($blog->posts) . ')';
/** * actualiza en la tabla los datos del proyecto * @param array $project->errors para guardar los errores de datos del formulario, los errores de proceso se guardan en $project->errors['process'] */ public function save(&$errors = array()) { if ($this->dontsave) { return false; } if (!$this->validate($errors)) { return false; } try { // fail para pasar por todo antes de devolver false $fail = false; // los nif sin guiones, espacios ni puntos $this->contract_nif = str_replace(array('_', '.', ' ', '-', ',', ')', '('), '', $this->contract_nif); $this->entity_cif = str_replace(array('_', '.', ' ', '-', ',', ')', '('), '', $this->entity_cif); // Image if (is_array($this->image) && !empty($this->image['name'])) { $image = new Image($this->image); if ($image->save($errors)) { $this->gallery[] = $image; $this->image = $image->id; /** * Guarda la relación NM en la tabla 'project_image'. */ if (!empty($image->id)) { self::query("REPLACE project_image (project, image) VALUES (:project, :image)", array(':project' => $this->id, ':image' => $image->id)); } } } $fields = array('contract_name', 'contract_nif', 'contract_email', 'contract_entity', 'contract_birthdate', 'entity_office', 'entity_name', 'entity_cif', 'phone', 'address', 'zipcode', 'location', 'country', 'secondary_address', 'post_address', 'post_zipcode', 'post_location', 'post_country', 'name', 'subtitle', 'image', 'description', 'motivation', 'video', 'video_usubs', 'about', 'goal', 'related', 'reward', 'keywords', 'media', 'media_usubs', 'currently', 'project_location', 'scope', 'resource', 'comment', 'evaluation'); $set = ''; $values = array(); foreach ($fields as $field) { if ($set != '') { $set .= ', '; } $set .= "{$field} = :{$field}"; $values[":{$field}"] = $this->{$field}; } // Solamente marcamos updated cuando se envia a revision desde el superform o el admin // $set .= ", updated = :updated"; // $values[':updated'] = date('Y-m-d'); $values[':id'] = $this->id; $sql = "UPDATE project SET " . $set . " WHERE id = :id"; if (!self::query($sql, $values)) { $errors[] = $sql . '<pre>' . print_r($values, 1) . '</pre>'; $fail = true; } // echo "$sql<br />"; // y aquí todas las tablas relacionadas // cada una con sus save, sus new y sus remove // quitar las que tiene y no vienen // añadir las que vienen y no tiene //categorias $tiene = Project\Category::get($this->id); $viene = $this->categories; $quita = array_diff_assoc($tiene, $viene); $guarda = array_diff_assoc($viene, $tiene); foreach ($quita as $key => $item) { $category = new Project\Category(array('id' => $item, 'project' => $this->id)); if (!$category->remove($errors)) { $fail = true; } } foreach ($guarda as $key => $item) { if (!$item->save($errors)) { $fail = true; } } // recuperamos las que le quedan si ha cambiado alguna if (!empty($quita) || !empty($guarda)) { $this->categories = Project\Category::get($this->id); } //skills $tiene = Project\Skill::get($this->id); $viene = $this->skills; $quita = array_diff_assoc($tiene, $viene); $guarda = array_diff_assoc($viene, $tiene); foreach ($quita as $key => $item) { $skill = new Project\Skill(array('id' => $item, 'project' => $this->id)); if (!$skill->remove($errors)) { $fail = true; } } foreach ($guarda as $key => $item) { if (!$item->save($errors)) { $fail = true; } } // recuperamos las que le quedan si ha cambiado alguna if (!empty($quita) || !empty($guarda)) { $this->skills = Project\Skill::get($this->id); } //costes $tiene = Project\Cost::getAll($this->id); $viene = $this->costs; $quita = array_diff_key($tiene, $viene); $guarda = array_diff_key($viene, $tiene); foreach ($quita as $key => $item) { if (!$item->remove($errors)) { $fail = true; } else { unset($tiene[$key]); } } foreach ($guarda as $key => $item) { if (!$item->save($errors)) { $fail = true; } } /* Ahora, los que tiene y vienen. Si el contenido es diferente, hay que guardarlo*/ foreach ($tiene as $key => $row) { // a ver la diferencia con el que viene if ($row != $viene[$key]) { if (!$viene[$key]->save($errors)) { $fail = true; } } } if (!empty($quita) || !empty($guarda)) { $this->costs = Project\Cost::getAll($this->id); } // recalculo de minmax $this->minmax(); //retornos colectivos $tiene = Project\Reward::getAll($this->id, 'social'); $viene = $this->social_rewards; $quita = array_diff_key($tiene, $viene); $guarda = array_diff_key($viene, $tiene); foreach ($quita as $key => $item) { if (!$item->remove($errors)) { $fail = true; } else { unset($tiene[$key]); } } foreach ($guarda as $key => $item) { if (!$item->save($errors)) { $fail = true; } } /* Ahora, los que tiene y vienen. Si el contenido es diferente, hay que guardarlo*/ foreach ($tiene as $key => $row) { // a ver la diferencia con el que viene if ($row != $viene[$key]) { if (!$viene[$key]->save($errors)) { $fail = true; } } } if (!empty($quita) || !empty($guarda)) { $this->social_rewards = Project\Reward::getAll($this->id, 'social'); } //recompenssas individuales $tiene = Project\Reward::getAll($this->id, 'individual'); $viene = $this->individual_rewards; $quita = array_diff_key($tiene, $viene); $guarda = array_diff_key($viene, $tiene); foreach ($quita as $key => $item) { if (!$item->remove($errors)) { $fail = true; } else { unset($tiene[$key]); } } foreach ($guarda as $key => $item) { if (!$item->save($errors)) { $fail = true; } } /* Ahora, los que tiene y vienen. Si el contenido es diferente, hay que guardarlo*/ foreach ($tiene as $key => $row) { // a ver la diferencia con el que viene if ($row != $viene[$key]) { if (!$viene[$key]->save($errors)) { $fail = true; } } } if (!empty($quita) || !empty($guarda)) { $this->individual_rewards = Project\Reward::getAll($this->id, 'individual'); } // colaboraciones $tiene = Project\Support::getAll($this->id); $viene = $this->supports; $quita = array_diff_key($tiene, $viene); // quitar los que tiene y no viene $guarda = array_diff_key($viene, $tiene); // añadir los que viene y no tiene foreach ($quita as $key => $item) { if (!$item->remove($errors)) { $fail = true; } else { unset($tiene[$key]); } } foreach ($guarda as $key => $item) { if (!$item->save($errors)) { $fail = true; } } /* Ahora, los que tiene y vienen. Si el contenido es diferente, hay que guardarlo*/ foreach ($tiene as $key => $row) { // a ver la diferencia con el que viene if ($row != $viene[$key]) { if (!$viene[$key]->save($errors)) { $fail = true; } } } if (!empty($quita) || !empty($guarda)) { $this->supports = Project\Support::getAll($this->id); } //listo return !$fail; } catch (\PDOException $e) { $errors[] = Text::_('No se ha grabado correctamente. ') . $e->getMessage(); //Text::get('save-project-fail'); return false; } }