Development

/doc/branches/1.0/askeet/es/12.txt

You must first sign up to be able to contribute.

root/doc/branches/1.0/askeet/es/12.txt

Revision 5352, 12.9 kB (checked in by francois, 2 years ago)

Added Askeet Spanish translation 7-24 (Contribution by Marc Torres)

Line 
1 Calendario de Symfony día doce: Correo Electrónico
2 ==================================================
3
4 Previamente en symfony
5 ----------------------
6
7 Ayer, la aplicación askeet fue extendida para transmitir contenido en otro medio, canales RSS. Symfony no es solo acerca de páginas web, y el tutorial de hoy lo ilustrara nuevamente. Enviaremos un correo electrónico aprovechándonos de la implementación MVC
8    
9 Recuperación de password
10 ------------------------
11
12 El formulario de login (el AJAX en todas las página, y el clásico accedido por el menú superior) requiere un apodo y un password, pero ocurre muy a menudo que los usuarios lo olvidan. Debemos proporcionar un mecanismo para permitirle conectarse nuevamente en este caso.
13
14 Como no guardamos el password en limpio, estaremos obligados a resetearlo a un password aleatorio, y enviarlo al usuario por correo electrónico. Por ahora, un usuario no puede modificar su password, así que el password aleatorio no será fácil de recordar, pero corregiremos esto más tarde.
15
16 ### Formulario de reset password
17
18 En el modulo del usuario `user`, crearemos una nueva acción que mostrara un formulario solicitando una dirección de correo. En `askeet/apps/frontend/modules/user/actions/action.class.php`, agregue:
19
20     [php]
21     public function executePasswordRequest()
22     {
23     }
24    
25 En `modules/user/templates/`, crea lo siguiente `passwordRequestSuccess.php`:
26
27     [php]
28     <h2>Receive your login details by email</h2>
29     <p>Did you forget your password? Enter your email to receive your login details:</p>
30     <?php echo form_tag('@user_require_password') ?>
31       <?php echo form_error('email') ?>
32       <label for="email">email:</label>
33       <?php echo input_tag('email', $sf_params->get('email'), 'style=width:150px') ?><br />
34       <?php echo submit_tag('Send') ?>
35     </form>
36
37 Este formulario debe ser accesible desde el formulario de login, así que agregué en cada uno de ellos (en `layout.php` y en `loginSuccess.php`):
38
39     [php]
40     <?php echo link_to('Forgot your password?', '@user_require_password') ?>
41
42 Agregue la regla de solicitud de password en el `routing.yml` de la aplicación:
43
44     user_require_password:
45       url:   /password_request
46       param: { module: user, action: passwordRequest }
47
48 ### Validación del formulario
49
50 Primero, estableceremos las reglas de validación para el envió del formulario. Cree un archive `passwordRequest.yml` en el directorio `modules/user/validate/`:
51
52     methods:
53       post:            [email]
54    
55     names:
56       email:
57         required:      Yes
58         required_msg:  You must provide an email
59         validators:    emailValidator
60
61     emailValidator:
62         class:         sfEmailValidator
63         param:
64           email_error: 'You didn''t enter a valid email address (for example: name@domain.com). Please try again.'
65
66 A continuación, has que el formulario `passwordRequest` sea mostrado con el mensaje de error si un error es detectado agregando al `askeet/apps/frontend/modules/user/actions/actions.class.php`:
67
68     [php]
69     public function handleErrorPasswordRequest()
70     {
71       return sfView::SUCCESS;
72     }
73
74 ### Manejando la solicitud
75
76 Como fue descripto durante el [día seis](6.txt), utilizaremos la misma acción para manejar el envío del formulario, así que modifíquelo para:
77
78     [php]
79     public function executePasswordRequest()
80     {
81       if ($this->getRequest()->getMethod() != sfRequest::POST)
82       {
83         // display the form
84         return sfView::SUCCESS;
85       }
86
87       // handle the form submission
88       $c = new Criteria();
89       $c->add(UserPeer::EMAIL, $this->getRequestParameter('email'));
90       $user = UserPeer::doSelectOne($c);
91
92       // email exists?
93       if ($user)
94       {
95         // set new random password
96         $password = substr(md5(rand(100000, 999999)), 0, 6);
97         $user->setPassword($password);
98
99         $this->getRequest()->setAttribute('password', $password);
100         $this->getRequest()->setAttribute('nickname', $user->getNickname());
101
102         $raw_email = $this->sendEmail('mail', 'sendPassword');
103         $this->logMessage($raw_email, 'debug');
104
105         // save new password
106         $user->save();
107
108         return 'MailSent';
109       }
110       else
111       {
112         $this->getRequest()->setError('email', 'There is no askeet user with this email address. Please try again');
113
114         return sfView::SUCCESS;
115       }
116     }
117
118 Si el usuario existe, la acción determina un password aleatorio para proporcionarle al usuario. Entonces pasa la solicitud a otra acción (`mail/sendPassword`) y obtiene el resultado en la variable `#raw_email`. El método `->sendEmail()` de la clase `sfAction` es una especie de `->forward()` especial que ejecuta otra acción pero retorna después (no detiene la ejecución de la acción actual). Además, retorna un correo electrónico crudo que puede ser escrito a un archivo de registro (encontrara más información acerca de el modo de loguear información en el [capitulo de depuración](http://www.symfony-project.com/content/book/page/debug.html) del libro de symfony).
119
120 Si el correo electrónico se envía exitosamente, la acción específica que la plantilla especial debe utilizar en lugar del la que usa por defecto `passwordRequestMailSent.php`: `return 'mailsent';` lanzará la plantilla `passwordRequestMailSent.php`.
121
122 >**Nota**: Hemos seguido el ejemplo de [día 6](6.txt), la verificación de la existencia de la dirección de correos electrónicos deberían haber sido realizado en un validador custom. Pero ud. sabe que "Existe Más De Una Forma De Hacerlo", y el uso del método `->setError()` evita una doble petición a la base de datos, y la creación de un archivo de validación más largo.
123
124 Así que cree una nueva plantilla `passwordRequestMailSent.php` para la página de confirmación:
125
126     [php]
127     <h2>Confirmation - login information sent</h2>
128    
129     <p>Your login information was sent to</p>
130     <p><?php echo $sf_params->get('email') ?></p>
131     <p>You should receive it shortly, so you can proceed to
132     the <?php echo link_to('login page', '@login') ?>.</p>
133
134 Enviar un correos electrónico
135 -----------------------------
136
137 Vale, así que si un usuario ingresa una dirección de correo electrónico valido, una acción es llamada. Ahora necesitamos crearla.
138    
139 ### Acción de envió de correo electrónico
140
141 Cree un nuevo modulo `mail`:
142
143     $ symfony init-module frontend mail
144
145 Agregue una nueva acción `sendPassword` a este módulo:
146
147     [php]
148     public function executeSendPassword()
149     {
150       $mail = new sfMail();
151       $mail->addAddress($this->getRequestParameter('email'));
152       $mail->setFrom('Askeet <askeet@symfony-project.com>');
153       $mail->setSubject('Askeet password recovery');
154  
155       $mail->setPriority(1);
156    
157       $mail->addEmbeddedImage(sfConfig::get('sf_web_dir').'/images/askeet_logo.gif', 'CID1', 'Askeet Logo', 'base64', 'image/gif');
158  
159       $this->mail = $mail;
160
161       $this->nickname = $this->getRequest()->getAttribute('nickname');
162       $this->password = $this->getRequest()->getAttribute('password');
163     }
164
165 La acción utiliza el objeto `sfMail`, que es una interfaz a un sender de correo. Todos las cabeceras del correo electrónico están definidas en la acción, pero como el cuerpo será más complicado que un simple texto, elegiremos utilizar una plantilla para esto, de otro modo, podríamos usar un simple método `->setBody()`.
166
167 Imágenes embebida son agregados por una llamada al método `->addEmbeddedImage()`, y el path de la imagen en el servidor, una única ID para insertarlo en la plantilla, y alterar texto y una descripción del formato deben ser pasado como argumento.
168
169 >**Nota**: El objeto `sfMail` es también un buena forma de agregar adjunto a un correo:
170 >
171 >     [php]
172 >     // document attachment
173 >     $mail->addAttachment(sfConfig::get('sf_data_dir').'/MyDocument.doc');
174 >     // string attachment
175 >     $mail->addStringAttachment('this is some cool text to embed', 'file.txt');
176 >
177
178 Encontrara más detalles acerca del objeto `sfMail` en el [capítulo de correo](http://www.symfony-project.com/content/book/page/email.html) del libro de symfony.
179
180 ### Plantilla de correo
181
182 Una vez que la acción es ejecutada, la vista del correo maneja las variables definidas `sendPasswordSuccess.php`, que es la plantilla HTML por defecto para el cuerpo del correo electrónico:
183
184     [php]
185     <p>Dear askeet user,</p>
186    
187     <p>A request for <?php echo $mail->getSubject() ?> was sent to this address.</p>
188    
189     <p>For safety reasons, the askeet website does not store passwords in clear.
190     When you forget your password, askeet creates a new one that can be used in place.</p>
191    
192     <p>You can now connect to your askeet profile with:</p>
193    
194     <p>
195     nickname: <strong><?php echo $nickname ?></strong><br/>
196     password: <strong><?php echo $password ?></strong>
197     </p>
198    
199     <p>To get connected, go to the <?php echo link_to('login page', '@login') ?>
200     and enter these codes.</p>
201    
202     <p>We hope to see you soon on <img src="cid:CID1" /></p>
203
204     <p>The askeet email robot</p>   
205
206 Justo como cualquier otra plantilla, los helpers estándares (como el `link_to()` utilizado aquí) trabaja sin problemas en una plantilla de correo electrónico. También puede insertar cualquier HTML para la presentación que necesite para hacer el correo electrónico luzca bien.
207
208 Embebiendo una imagen es tan simple como pasar un parámetro `sid`: correspondiente a la id única de la imagen cargada en la acción.
209
210 ### Plantilla de correo alternativa
211
212 Si la vista encuentra un `sendPasswordSuccess.altbody.php`, será utilizado para agregar un cuerpo (texto) alternativo al correo electrónico. Esto le permite definir plantillas solo-texto para cliente que no acepten HTML:
213
214     [php]
215     Dear askeet user,
216    
217     A request for <?php echo $mail->getSubject() ?> was sent to this address.
218    
219     For safety reasons, the askeet website does not store passwords in clear.
220     When you forget your password, askeet creates a new one that can be used in place.
221    
222     You can now connect to your askeet profile with:
223    
224     nickname: <?php echo $nickname ?>
225     password: <?php echo $password ?>
226    
227     To get connected, go to the login page (http://www.askeet.com/login)
228     and enter these codes.
229    
230     We hope to see you soon on askeet!
231    
232     The askeet email robot
233
234 ### Configuración
235
236 El `sfMail` siendo la vista definida para la acción, puede aceptar configuración adicional. Cree un archivo de configuración `mailer.yml`:
237
238     dev:
239       deliver:    off
240    
241     all:
242       mailer:     sendmail
243
244 Este señala el programa a ser utilizado par enviar correos, y desactiva el envió de correo en el entorno de desarrollo - los correo electrónico en los datos de prueba son falsos igualmente.
245
246 No quiere que los usuario tengan acceso directo a esta acción. Así que cree un `module.yml` en el directorio del modulo ` config/` con:
247
248     all:
249       is_internal: on   
250
251 ### Pruebas
252
253 Pruebe el nuevo sistema de recuperación de password creando un usuario custom en la data de prueba con su correo electrónico personal, lance el batch `import_data.php`
254
255 Limpie el cache y navegue a la página de recuperación de password en el entorno de producción. Después de entrar su dirección de correo electrónico y enviando el formulario, debería recibir el correo electrónico próximamente.
256
257 ![email](XXX.gif)
258
259 Le veo mañana
260 -------------
261
262 El sistema de correo electrónico en symfony es ambos simple y poderoso. Correos electrónico simples son fáciles de enviar como es posible; correos electrónico complejos no son más complejos de escribir que complejo página HTML, y toma completo ventaja de la arquitectura MVC. Así que para su próxima campaña de correo electrónico, quizás debería utilizar symfony en lugar de una solución de mailing comercial...
263
264 Sin embargo, mañana será el día de etiquetas. Las preguntas Askeet serán etiquetadas, las etiquetas se podrán buscar, y le dará la más simpática nube de etiquetas que alguna vez haya soñado.
265
266 Como es usual, el código de hoy estará disponible en el [repositorio SVN de askeet](http://svn.askeet.com/tags/release_day_12/), etiquetado `/tags/release_day_12`. Todavía estamos indeciso acerca de que platicar durante el día 21, así que deje su sugerencia en el [lista de correo de askeet](mailto:askeet-subscribe@symfony-project.com) o en el [foro de askeet](http://www.symfony-project.com/forum/index.php/f/8/).
Note: See TracBrowser for help on using the browser.

The Sensio Labs Network

Since 1998, Sensio Labs has been promoting the Open-Source software movement by providing quality web application development, training, consulting.
Sensio Labs also supports several large Open-Source projects.