public function index($show = 'activity', $category = null) { if (defined('GOTEO_EASY') && \GOTEO_EASY === true) { throw new Redirection('/'); } $page = Page::get('community'); $items = array(); $shares = array(); if (!in_array($show, array('sharemates', 'activity'))) { $show = 'activity'; } $viewData = array('description' => $page->description, 'show' => $show); switch ($show) { // compartiendo intereses global case 'sharemates': $categories = Interest::getAll(); foreach ($categories as $catId => $catName) { $gente = Interest::shareAll($catId); if (count($gente) == 0) { continue; } $shares[$catId] = $gente; } $viewData['category'] = $category; $viewData['categories'] = $categories; $viewData['shares'] = $shares; // top ten cofinanciadores en Goteo $projects = Invest::projects(true); $investors = array(); foreach ($projects as $projectId => $projectName) { foreach (Invest::investors($projectId) as $key => $investor) { if (\array_key_exists($investor->user, $investors)) { // si es otro proyecto y ya está en el array, añadir uno if ($investors[$investor->user]->lastproject != $projectId) { ++$investors[$investor->user]->projects; $investors[$investor->user]->lastproject = $projectId; } $investors[$investor->user]->amount += $investor->amount; $investors[$investor->user]->date = $investor->date; } else { $investors[$investor->user] = (object) array('user' => $investor->user, 'name' => $investor->name, 'projects' => 1, 'lastproject' => $projectId, 'avatar' => $investor->avatar, 'worth' => $investor->worth, 'amount' => $investor->amount, 'date' => $investor->date); } } } $viewData['investors'] = $investors; break; // feed público // feed público case 'activity': $items = array(); $items['goteo'] = Feed::getAll('goteo', 'public', 50); $items['projects'] = Feed::getAll('projects', 'public', 50); $items['community'] = Feed::getAll('community', 'public', 50); $viewData['items'] = $items; break; } return new View('view/community.html.php', $viewData); }
* GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Goteo. If not, see <http://www.gnu.org/licenses/agpl.txt>. * */ use Goteo\Model\User\Interest, Goteo\Model\User\Skill, Goteo\Library\Text; $user = $this['user']; $user->about = nl2br(Text::urlink($user->about)); $interests = Interest::getAll(); $skills = Skill::getAll(null,true); ?> <div class="widget user-about"> <?php if (!empty($user->about)): ?> <div class="about"> <h4><?php echo Text::get('profile-about-header'); ?></h4> <p><?php echo $user->about ?></p> </div> <?php endif ?> <?php if (!empty($user->interests)): ?> <div class="interests">
* */ use Goteo\Core\View, Goteo\Library\Worth, Goteo\Library\Text, Goteo\Model\User\Interest, Goteo\Core\Redirection; $bodyClass = 'user-profile'; include 'view/prologue.html.php'; include 'view/header.html.php'; $user = $this['user']; $worthcracy = Worth::getAll(); $categories = Interest::getAll($user->id); if (empty($categories)) { throw new Redirection('/user/profile/' . $this['user']->id); } $limit = empty($this['category']) ? 6 : 20; $shares = array(); foreach ($categories as $catId => $catName) { $gente = Interest::share($user->id, $catId, $limit); if (count($gente) == 0) { continue; } $shares[$catId] = $gente; } if (empty($shares)) { throw new Redirection('/user/profile/' . $this['user']->id); } ?> <?php echo new View('view/user/widget/header.html.php', array('user' => $user)); ?> <?php
/** * Usuario. * * @param string $id Nombre de usuario * @return obj|false Objeto de usuario, en caso contrario devolverá 'false'. */ public static function get($id, $lang = null) { try { $sql = "\r\n SELECT\r\n user.id as id,\r\n user.email as email,\r\n user.name as name,\r\n user.location as location,\r\n user.avatar as avatar,\r\n IFNULL(user_lang.about, user.about) as about,\r\n IFNULL(user_lang.contribution, user.contribution) as contribution,\r\n IFNULL(user_lang.keywords, user.keywords) as keywords,\r\n user.facebook as facebook,\r\n user.google as google,\r\n user.twitter as twitter,\r\n user.identica as identica,\r\n user.linkedin as linkedin,\r\n user.active as active,\r\n user.confirmed as confirmed,\r\n user.hide as hide,\r\n user.created as created,\r\n user.modified as modified\r\n FROM user\r\n LEFT JOIN user_lang\r\n ON user_lang.id = user.id\r\n AND user_lang.lang = :lang\r\n WHERE user.id = :id\r\n "; $query = static::query($sql, array(':id' => $id, ':lang' => $lang)); $user = $query->fetchObject(__CLASS__); if (!$user instanceof \Goteo\Model\User) { return false; } $user->roles = $user->getRoles(); $user->avatar = Image::get($user->avatar); if (empty($user->avatar->id) || !$user->avatar instanceof Image) { $user->avatar = Image::get(1); } $user->interests = User\Interest::get($id); $user->webs = User\Web::get($id); // si es traductor cargamos sus idiomas if (isset($user->roles['translator'])) { $user->translangs = User\Translate::getLangs($user->id); } return $user; } catch (\PDOException $e) { return false; } }
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(), $subaction = '') { // @NODESYS $nodes = array(); // @NODESYS $node = \GOTEO_NODE; $errors = array(); switch ($action) { case 'add': // si llega post: creamos if ($_SERVER['REQUEST_METHOD'] == 'POST') { // para crear se usa el mismo método save del modelo, hay que montar el objeto $user = new Model\User(); $user->userid = $_POST['userid']; $user->name = $_POST['name']; $user->email = $_POST['email']; $user->password = $_POST['password']; $user->node = !empty($_POST['node']) ? $_POST['node'] : \GOTEO_NODE; if (isset($_SESSION['admin_node']) && $user->node != $_SESSION['admin_node']) { $user->node = $_SESSION['admin_node']; } $user->save($errors); if (empty($errors)) { // mensaje de ok y volvemos a la lista de usuarios Message::Info(Text::get('user-register-success')); throw new Redirection('/admin/users/manage/' . $user->id); } else { // si hay algun error volvemos a poner los datos en el formulario $data = $_POST; Message::Error(implode('<br />', $errors)); } } // vista de crear usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'add', 'data' => $data, 'nodes' => $nodes)); break; case 'edit': $user = Model\User::get($id); // si llega post: actualizamos if ($_SERVER['REQUEST_METHOD'] == 'POST') { $tocado = array(); // para crear se usa el mismo método save del modelo, hay que montar el objeto if (!empty($_POST['email'])) { $user->email = $_POST['email']; $tocado[] = Text::_('el email'); } if (!empty($_POST['password'])) { $user->password = $_POST['password']; $tocado[] = Text::_('la contraseña'); } if (!empty($tocado) && $user->update($errors)) { // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate(Text::_('Operación sobre usuario'), '/admin/users', \vsprintf('El admin %s ha %s del usuario %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Tocado ' . implode(' y ', $tocado)), Feed::item('user', $user->name, $user->id)))); $log->doAdmin('user'); unset($log); // mensaje de ok y volvemos a la lista de usuarios Message::Info(Text::_('Datos actualizados')); throw new Redirection('/admin/users'); } else { // si hay algun error volvemos a poner los datos en el formulario $data = $_POST; Message::Error(Text::_('No se ha guardado correctamente. ') . implode('<br />', $errors)); } } // vista de editar usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'edit', 'user' => $user, 'data' => $data, 'nodes' => $nodes)); break; case 'manage': // si llega post: ejecutamos + mensaje + seguimos editando // operación y acción para el feed $mngSa = static::_manageSubAct(); $sql = $mngSa[$subaction]['sql']; $log_action = $mngSa[$subaction]['log']; if (!empty($sql)) { $user = Model\User::getMini($id); if (Model\User::query($sql, array(':user' => $id))) { // mensaje de ok y volvemos a la gestion del usuario // Message::Info('Ha <strong>' . $log_action . '</strong> al usuario <strong>'.$user->name.'</strong> CORRECTAMENTE'); $log_text = 'El admin %s ha %s al usuario %s'; // procesos adicionales switch ($subaction) { case 'admin': case 'noadmin': // @NODESYS : this admin/noadmin subactions are here for NODESYS module extra break; case 'translator': // le ponemos todos los idiomas (excepto el español) $sql = "INSERT INTO user_translang (user, lang) SELECT '{$id}' as user, id as lang FROM `lang` WHERE id != 'es'"; Model\User::query($sql); break; case 'notranslator': // quitamos los idiomas $sql = "DELETE FROM user_translang WHERE user = :user"; Model\User::query($sql, array(':user' => $id)); break; } } else { // mensaje de error y volvemos a la gestion del usuario Message::Error('Ha FALLADO cuando ha <strong>' . $log_action . '</strong> al usuario <strong>' . $id . '</strong>'); $log_text = 'Al admin %s le ha <strong>FALLADO</strong> cuando ha %s al usuario %s'; } // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate(Text::_('Operación sobre usuario'), '/admin/users', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', $log_action), Feed::item('user', $user->name, $user->id)))); $log->doAdmin('user'); unset($log); throw new Redirection('/admin/users/manage/' . $id); } $user = Model\User::get($id); $viewData = array('folder' => 'users', 'file' => 'manage', 'user' => $user, 'nodes' => $nodes); $viewData['roles'] = Model\User::getRolesList(); $viewData['langs'] = Lang::getAll(); // quitamos el español unset($viewData['langs']['es']); // vista de gestión de usuario return new View('view/admin/index.html.php', $viewData); break; // aplicar idiomas // aplicar idiomas case 'translang': if (!isset($_POST['user'])) { Message::Error(Text::_('Hemos perdido de vista al usuario')); throw new Redirection('/admin/users'); } else { $user = $_POST['user']; } $sql = "DELETE FROM user_translang WHERE user = :user"; Model\User::query($sql, array(':user' => $user)); $anylang = false; foreach ($_POST as $key => $value) { if (\substr($key, 0, \strlen('lang_')) == 'lang_') { $sql = "INSERT INTO user_translang (user, lang) VALUES (:user, :lang)"; if (Model\User::query($sql, array(':user' => $user, ':lang' => $value))) { $anylang = true; } } } if (!$anylang) { Message::Error(Text::_('No se ha seleccionado ningún idioma, este usuario tendrá problemas en su panel de traducción!')); } else { Message::Info(Text::_('Se han aplicado al traductor los idiomas seleccionados')); } throw new Redirection('/admin/users/manage/' . $user); break; case 'impersonate': $user = Model\User::get($id); // vista de acceso a suplantación de usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'impersonate', 'user' => $user, 'nodes' => $nodes)); break; case 'move': $user = Model\User::get($id); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $values = array(':id' => $id, ':node' => $_POST['node']); try { $sql = "UPDATE user SET node = :node WHERE id = :id"; if (Model\User::query($sql, $values)) { $log_text = 'El admin %s ha <span class="red">movido</span> el usuario %s al nodo %s'; } else { $log_text = 'Al admin %s le ha <span class="red">fallado al mover</span> el usuario %s al nodo %s'; } // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate('User cambiado de nodo (admin)', '/admin/users', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $user->name, $user->id), Feed::item('user', $nodes[$_POST['node']])))); Message::Error($log->html); $log->doAdmin('user'); unset($log); throw new Redirection('/admin/users'); } catch (\PDOException $e) { Message::Error("Ha fallado! " . $e->getMessage()); } } // vista de acceso a suplantación de usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'move', 'user' => $user, 'nodes' => $nodes)); break; case 'list': default: if (!empty($filters['filtered'])) { $users = Model\User::getAll($filters, $node); } else { $users = array(); } $status = array('active' => Text::_('Activo'), 'inactive' => Text::_('Inactivo')); $interests = Model\User\Interest::getAll(); $roles = Model\User::getRolesList(); $roles['user'] = Text::_('Solo usuario'); $types = array('creators' => Text::_('Impulsores'), 'investors' => Text::_('Cofinanciadores'), 'supporters' => Text::_('Colaboradores')); $orders = array('created' => Text::_('Fecha de alta'), 'name' => Text::_('Alias'), 'id' => Text::_('User'), 'amount' => Text::_('Cantidad'), 'projects' => Text::_('Proyectos')); // proyectos con aportes válidos $projects = Model\Invest::projects(true, $node); return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'list', 'users' => $users, 'filters' => $filters, 'status' => $status, 'interests' => $interests, 'roles' => $roles, 'types' => $types, 'nodes' => $nodes, 'projects' => $projects, 'orders' => $orders)); break; } }
/** * Perfil público de usuario. * * @param string $id Nombre de usuario */ public function profile($id, $show = 'profile', $category = null) { if (!in_array($show, array('profile', 'investors', 'sharemates', 'message'))) { $show = 'profile'; } $user = Model\User::get($id, LANG); if (!$user instanceof Model\User || $user->hide) { throw new Error('404', Text::html('fatal-error-user')); } //--- para usuarios públicos--- if (empty($_SESSION['user'])) { // la subpágina de mensaje también está restringida if ($show == 'message') { $_SESSION['jumpto'] = '/user/profile/' . $id . '/message'; Message::Info(Text::get('user-login-required-to_message')); throw new Redirection(SEC_URL . "/user/login"); } // a menos que este perfil sea de un vip, no pueden verlo if (!isset($user->roles['vip'])) { $_SESSION['jumpto'] = '/user/profile/' . $id . '/' . $show; Message::Info(Text::get('user-login-required-to_see')); throw new Redirection(SEC_URL . "/user/login"); } /* // subpágina de cofinanciadores if ($show == 'investors') { Message::Info(Text::get('user-login-required-to_see-supporters')); throw new Redirection('/user/profile/' . $id); } */ } //--- el resto pueden seguir --- // impulsor y usuario solamente pueden comunicarse si: if ($show == 'message') { $is_author = false; // si es autor de un proyecto publicado $is_investor = false; // si es cofinanciador $is_messeger = false; // si es participante // si el usuario logueado es impulsor (autro de proyecto publicado $user_created = Model\Project::ofmine($_SESSION['user']->id, true); if (!empty($user_created)) { $is_author = true; } // si el usuario del perfil es cofin. o partic. // proyectos que es cofinanciador este usuario (el del perfil) $user_invested = Model\User::invested($id, true); foreach ($user_invested as $a_project) { if ($a_project->owner == $_SESSION['user']->id) { $is_investor = true; break; } } // proyectos que es participante este usuario (el del perfil) (que ha enviado algún mensaje) $user_messeged = Model\Message::getMesseged($id, true); foreach ($user_messeged as $a_project) { if ($a_project->owner == $_SESSION['user']->id) { $is_messeger = true; break; } } // si el usuario logueado es el usuario cofin./partic. // si el usuario del perfil es impulsor de un proyecto cofinanciado o en el que ha participado // proyectos que es cofinanciador el usuario logueado $user_invested = Model\User::invested($_SESSION['user']->id, true); foreach ($user_invested as $a_project) { if ($a_project->owner == $id) { $is_investor = true; break; } } // proyectos que es participante el usuario logueado (que ha enviado algún mensaje) $user_messeged = Model\Message::getMesseged($_SESSION['user']->id, true); foreach ($user_messeged as $a_project) { if ($a_project->owner == $id) { $is_messeger = true; break; } } if (!$is_investor && !$is_messeger && !$is_author) { Message::Info(Text::get('user-message-restricted')); throw new Redirection('/user/profile/' . $id); } else { $_SESSION['message_autorized'] = true; } } // vip profile $viewData = array(); $viewData['user'] = $user; $projects = Model\Project::ofmine($id, true); $viewData['projects'] = $projects; //mis cofinanciadores // array de usuarios con: // foto, nombre, nivel, cantidad a mis proyectos, fecha ultimo aporte, nº proyectos que cofinancia $investors = array(); foreach ($projects as $kay => $project) { // quitamos los caducados if ($project->status == 0) { unset($projects[$kay]); continue; } foreach (Model\Invest::investors($project->id) as $key => $investor) { // convocadores no, gracias if (!empty($investor->campaign)) { continue; } if (\array_key_exists($investor->user, $investors)) { // ya está en el array, quiere decir que cofinancia este otro proyecto // , añadir uno, sumar su aporte, actualizar la fecha ++$investors[$investor->user]->projects; $investors[$investor->user]->amount += $investor->amount; $investors[$investor->user]->date = $investor->date; } else { $investors[$investor->user] = (object) array('user' => $investor->user, 'name' => $investor->name, 'projects' => 1, 'avatar' => $investor->avatar, 'worth' => $investor->worth, 'amount' => $investor->amount, 'date' => $investor->date); } } } $viewData['investors'] = $investors; // comparten intereses $viewData['shares'] = Model\User\Interest::share($id, $category); if ($show == 'sharemates' && empty($viewData['shares'])) { $show = 'profile'; } if (!empty($category)) { $viewData['category'] = $category; } // proyectos que cofinancio $invested = Model\User::invested($id, true); // agrupacion de proyectos que cofinancia y proyectos suyos $viewData['lists'] = array(); if (!empty($invested)) { $viewData['lists']['invest_on'] = Listing::get($invested, 2); } if (!empty($projects)) { $viewData['lists']['my_projects'] = Listing::get($projects, 2); } return new View('view/user/' . $show . '.html.php', $viewData); }
public static function process($action = 'list', $id = null, $filters = array()) { // año fiscal $year = Model\User\Donor::$currYear; $year0 = $year; $year1 = $year - 1; $errors = array(); $node = isset($_SESSION['admin_node']) ? $_SESSION['admin_node'] : \GOTEO_NODE; // Valores de filtro $interests = Model\User\Interest::getAll(); $status = Model\Project::status(); $methods = Model\Invest::methods(); $types = array('investor' => 'Cofinanciadores', 'owner' => 'Autores', 'user' => 'Usuarios'); $roles = array('admin' => 'Administrador', 'checker' => 'Revisor', 'translator' => 'Traductor'); // una variable de sesion para mantener los datos de todo esto if (!isset($_SESSION['mailing'])) { $_SESSION['mailing'] = array(); } switch ($action) { case 'edit': $_SESSION['mailing']['receivers'] = array(); $values = array(); $sqlFields = ''; $sqlInner = ''; $sqlFilter = ''; // cargamos los destiantarios //---------------------------- // por tipo de usuario switch ($filters['type']) { case 'investor': $sqlInner .= "INNER JOIN invest\n ON invest.user = user.id\n AND (invest.status = 0 OR invest.status = 1 OR invest.status = 3 OR invest.status = 4)\n INNER JOIN project\n ON project.id = invest.project\n "; $sqlFields .= ", project.name as project"; $sqlFields .= ", project.id as projectId"; break; case 'owner': $sqlInner .= "INNER JOIN project\n ON project.owner = user.id\n "; $sqlFields .= ", project.name as project"; $sqlFields .= ", project.id as projectId"; break; default: break; } $_SESSION['mailing']['filters_txt'] = 'los <strong>' . $types[$filters['type']] . '</strong> '; if (!empty($filters['project']) && !empty($sqlInner)) { $sqlFilter .= " AND project.name LIKE (:project) "; $values[':project'] = '%' . $filters['project'] . '%'; $_SESSION['mailing']['filters_txt'] .= 'de proyectos que su nombre contenga <strong>\'' . $filters['project'] . '\'</strong> '; } elseif (empty($filters['project']) && !empty($sqlInner)) { $_SESSION['mailing']['filters_txt'] .= 'de cualquier proyecto '; } if (isset($filters['status']) && $filters['status'] > -1 && !empty($sqlInner)) { $sqlFilter .= "AND project.status = :status "; $values[':status'] = $filters['status']; $_SESSION['mailing']['filters_txt'] .= 'en estado <strong>' . $status[$filters['status']] . '</strong> '; } elseif ($filters['status'] < 0 && !empty($sqlInner)) { $_SESSION['mailing']['filters_txt'] .= 'en cualquier estado '; } if ($filters['type'] == 'investor') { if (!empty($filters['method']) && !empty($sqlInner)) { $sqlFilter .= "AND invest.method = :method "; $values[':method'] = $filters['method']; $_SESSION['mailing']['filters_txt'] .= 'mediante <strong>' . $methods[$filters['method']] . '</strong> '; } elseif (empty($filters['method']) && !empty($sqlInner)) { $_SESSION['mailing']['filters_txt'] .= 'mediante cualquier metodo '; } } if (!empty($filters['interest'])) { $sqlInner .= "INNER JOIN user_interest\n ON user_interest.user = user.id\n AND user_interest.interest = :interest\n "; $values[':interest'] = $filters['interest']; if ($filters['interest'] == 15) { $_SESSION['mailing']['filters_txt'] .= 'del grupo de testeo '; } else { $_SESSION['mailing']['filters_txt'] .= 'interesados en fin <strong>' . $interests[$filters['interest']] . '</strong> '; } } if (!empty($filters['role'])) { $sqlInner .= "INNER JOIN user_role\n ON user_role.user_id = user.id\n AND user_role.role_id = :role\n "; $values[':role'] = $filters['role']; $_SESSION['mailing']['filters_txt'] .= 'que sean <strong>' . $roles[$filters['role']] . '</strong> '; } if (!empty($filters['name'])) { $sqlFilter .= " AND ( user.name LIKE (:name) OR user.email LIKE (:name) ) "; $values[':name'] = '%' . $filters['name'] . '%'; $_SESSION['mailing']['filters_txt'] .= 'que su nombre o email contenga <strong>\'' . $filters['name'] . '\'</strong> '; } if (!empty($filters['donant'])) { if ($filters['type'] == 'investor') { $sqlFilter .= " AND invest.resign = 1\n AND invest.status IN (1, 3)\n AND invest.charged >= '{$year0}-01-01'\n AND invest.charged < '{$year1}-01-01'\n AND (project.passed IS NOT NULL AND project.passed != '0000-00-00')\n "; $_SESSION['mailing']['filters_txt'] .= 'que haya hecho algun donativo '; } else { Message::Error('Solo se filtran donantes si se envia "A los: Cofinanciadores"'); } } if ($node != \GOTEO_NODE) { $sqlFilter .= " AND user.node = :node"; $values[':node'] = $node; if (!empty($sqlInner)) { $sqlFilter .= " AND project.node = :node"; } } $sql = "SELECT\n user.id as id,\n user.id as user,\n user.name as name,\n user.email as email\n {$sqlFields}\n FROM user\n {$sqlInner}\n WHERE user.active = 1\n {$sqlFilter}\n GROUP BY user.id\n ORDER BY user.name ASC\n "; // die('<pre>'.$sql . '<br />'.print_r($values, 1).'</pre>'); if ($query = Model\User::query($sql, $values)) { foreach ($query->fetchAll(\PDO::FETCH_OBJ) as $receiver) { $_SESSION['mailing']['receivers'][$receiver->id] = $receiver; } } else { Message::Error('Fallo el SQL!!!!! <br />' . $sql . '<pre>' . print_r($values, 1) . '</pre>'); } // si no hay destinatarios, salta a la lista con mensaje de error if (empty($_SESSION['mailing']['receivers'])) { Message::Error('No se han encontrado destinatarios para ' . $_SESSION['mailing']['filters_txt']); throw new Redirection('/admin/mailing/list'); } // si hay, mostramos el formulario de envio return new View('view/admin/index.html.php', array('folder' => 'mailing', 'file' => 'edit', 'filters' => $filters, 'interests' => $interests, 'status' => $status, 'types' => $types, 'roles' => $roles)); break; case 'send': // die(\trace($_POST)); $URL = NODE_ID != GOTEO_NODE ? NODE_URL : SITE_URL; // Enviando contenido recibido a destinatarios recibidos $receivers = array(); $subject = $_POST['subject']; $templateId = !empty($_POST['template']) ? $_POST['template'] : 11; $content = \str_replace('%SITEURL%', $URL, $_POST['content']); // quito usuarios desmarcados foreach ($_SESSION['mailing']['receivers'] as $usr => $userData) { $errors = array(); $campo = 'receiver_' . $usr; if (!isset($_POST[$campo])) { $_SESSION['mailing']['receivers'][$usr]->ok = null; } else { $receivers[] = $userData; } } // montamos el mailing // - se crea un registro de tabla mail $sql = "INSERT INTO mail (id, email, html, template, node) VALUES ('', :email, :html, :template, :node)"; $values = array(':email' => 'any', ':html' => $content, ':template' => $templateId, ':node' => $node); $query = \Goteo\Core\Model::query($sql, $values); $mailId = \Goteo\Core\Model::insertId(); // - se usa el metodo initializeSending para grabar el envío (parametro para autoactivar) // - initiateSending ($mailId, $subject, $receivers, $autoactive = 0) if (\Goteo\Library\Sender::initiateSending($mailId, $subject, $receivers, 1)) { $ok = true; // Evento Feed $log = new Feed(); $log->populate('comunicación masiva a usuarios (admin)', '/admin/mailing', \vsprintf("El admin %s ha iniciado una %s a %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Comunicacion masiva'), $_SESSION['mailing']['filters_txt']))); $log->doAdmin('admin'); unset($log); } else { $ok = false; // Evento Feed $log = new Feed(); $log->populate('comunicación masiva a usuarios (admin)', '/admin/mailing', \vsprintf("El admin %s le ha %s una %s a %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'fallado'), Feed::item('relevant', 'Comunicacion masiva'), $_SESSION['mailing']['filters_txt']))); $log->doAdmin('admin'); unset($log); } return new View('view/admin/index.html.php', array('folder' => 'mailing', 'file' => 'send', 'subject' => $subject, 'interests' => $interests, 'status' => $status, 'methods' => $methods, 'types' => $types, 'roles' => $roles, 'users' => $receivers, 'ok' => $ok)); break; } return new View('view/admin/index.html.php', array('folder' => 'mailing', 'file' => 'list', 'interests' => $interests, 'status' => $status, 'methods' => $methods, 'types' => $types, 'roles' => $roles, 'filters' => $filters)); }
* * Goteo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Goteo. If not, see <http://www.gnu.org/licenses/agpl.txt>. * */ use Goteo\Core\View, Goteo\Library\Text, Goteo\Model\User\Interest; $user = $this['user']; $categories = Interest::getAll($user->id); $shares = array(); foreach ($categories as $catId => $catName) { $shares[$catId] = Interest::share($user->id, $catId, 6); } ?> <script type="text/javascript"> function displayCategories(categoryId1,categoryId2){ $("div.users").css("display","none"); $("#mates-" + categoryId1).fadeIn("slow"); $("#mates-" + categoryId2).fadeIn("slow"); } </script> <div class="widget user-mates"> <!-- categorias --> <h3 class="supertitle"><?php echo Text::get('profile-sharing_interests-header'); ?> </h3>
public function profile($option = 'profile', $action = 'edit') { // tratamos el post segun la opcion y la acion $user = $_SESSION['user']; // salto al perfil público if ($option == 'public') { throw new Redirection('/user/profile/' . $user->id); } // vip/recomendador tiene una imagen adicional $vip = $option == 'profile' && isset($user->roles['vip']) ? Model\User\Vip::get($user->id) : null; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $log_action = null; $errors = array(); switch ($option) { // perfil publico case 'profile': Dashboard\Profile::process_profile($user, $vip, $errors, $log_action); break; // datos personales // datos personales case 'personal': Dashboard\Profile::process_personal($user->id, $errors, $log_action); break; //cambio de email y contraseña //cambio de email y contraseña case 'access': Dashboard\Profile::process_access($user, $errors, $log_action); break; // preferencias de notificación // preferencias de notificación case 'preferences': Dashboard\Profile::process_preferences($user->id, $errors, $log_action); break; } if (!empty($log_action)) { // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate('usuario ' . $log_action . ' (dashboard)', '/admin/users', \vsprintf('%s ha %s desde su dashboard', array(Feed::item('user', $user->name, $user->id), Feed::item('relevant', $log_action)))); $log->doAdmin('user'); unset($log); } } $viewData = array('menu' => self::menu(), 'section' => __FUNCTION__, 'option' => $option, 'action' => $action, 'errors' => $errors, 'user' => $user); switch ($option) { case 'profile': $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; break; } } } if (!empty($_POST['web-add'])) { $last = end($user->webs); if ($last !== false) { $viewData["web-{$last->id}-edit"] = true; } } if (isset($user->roles['vip'])) { $viewData['vip'] = Model\User\Vip::get($user->id); } break; case 'personal': $viewData['personal'] = Model\User::getPersonal($user->id); break; case 'access': // si es recover, en contraseña actual tendran que poner el username if ($action == 'recover') { $viewData['message'] = Text::get('dashboard-password-recover-advice'); } break; case 'preferences': $viewData['preferences'] = Model\User::getPreferences($user->id); break; } return new View('view/dashboard/index.html.php', $viewData); }