במאמר הקודם למדנו על קונטרולרים ו-Actions בזנד פריימוורק, במאמר הזה אנו נלמד ונתרגל יצירת אפליקציה שלמה לדוגמא.
מטרת האפליקציה – להכניס טקסט כלשהו ולקבל בחזרה את התוצאות מחיפוש בטוויטים האחרונים של טוויטר!
בואו ונתחיל! ראשית, ניצור פרויקט בשם mytwit. בפרויקט אנו נשתמש בקונטרולר הדפולטיבי index. לא יודעים איך ליצור פרויקט? הגיע הזמן לעבור על המאמרים הקודמים במדריך!
הכנת ה-view שלנו
ראשית אנחנו צריכים להכין את הטופס, ניגש ל: mytwit/application/views/scripts/index ושם נפתח את קובץ index.phtml, מכאן זה פשט רק להדביק HTML פשוט של טופס עם כותרת:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/
xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Search Tweets!</title>
</head>
<body>
<form method="POST" action="http://192.168.123.100/mytwit/public/index/extract" name="mainform">
<label for="tsearch">Twitter search phrase:</label>
<input name="tsearch" id="tsearch" value="Israel" />
<input type="Submit" name="submit" id="submit" value="Get My Tweets!" />
</form>
</body>
</html>
הכנת Action ב-Index Controller
נשים לב שהטופס שלנו מכיל הפניה ל:/index/extract (במקרה של הדוגמא מדובר במלוא הנתיב לתיקיה שלי כי היא נמצאת בשרת הפיתוח והתעצלתי עד מאד להגדיר לאפליקציה Virtual Domain), אם נזכר במאמר הקודם אנו מבינים ש-extract הוא בעצם action. ניצור עם הכלי שלנו action חדש ששמו בישראל הוא extract. (שוב, למי שלא מבין לכל הרוחות על מה אני מדבר – קרא שוב את המאמר הקודם במדריך). נוצרה לנו פונקציה חדשה וחביבה בקונטרולר index הדיפולטיבי:
< ?php
class IndexController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
// action body
}
public function extractAction()
{
// action body
}
}
ה-Action הזה מופעל כאשר הטופס נשלח, מה שהוא צריך זה לקבל את השדה 'tsearch', לפנות אל ה-API של טוויטר ואז לשלוח את מערך התוצאות ל-view שלנו.
ראשית, אנו נקבל את מחרוזת הטקסט שלנו מהטופס שטרחנו והכנו אותו מבעוד מועד באמצעות השורה הבאה שממוקמת בפונקצית ה-Action:
$tsearch = Zend_Filter::get($this->getRequest()->getPost('tsearch'), 'StripTags');
ראשית, אנו משתמשים באמצעות $this->getRequest לקבל את אובייקט ה-Request ואז אנו משתמשים במתודת getPost.
אגב, אם מישהו לא מכיר את שיטת העבודה הזו: this-> method->method2->method3 – זה נקרא מחלקות משורשרות ומשתמשים בזה די הרבה ב-PHP OOP. הסבר מפורט על המחלקות המשורשרות אפשר למצוא בבלוג websupport.
את המשתנה שקיבלנו אנו מעבירים דרך Zend_Filter על מנת לבצע strip tag. נכון שזו לא שיטת האבטחה הכי טובה, אבל אנו נלמד על אבטחה מאוחר יותר. כרגע נסתפק בזה.
עולה השאלה, מאיפה לי בדיוק ש-Zend_Filter קיים בכלל ויש לו את המתודה get שמקבלת שני פרמטרים? את זה אני יודע כמובן באמצעות Zend Framework Reference מדריך שבו יש את כל המתודות, המחלקות ומה שתרצו בכל מה שקשור לזנד פריימוורק. נסו לאתר שם את Zend_Filter ותראו שם את כל המתודות שלו ומה הוא בדיוק עושה.
Twitter API
אחרי שקיבלתי את הפרמטר, כל מה שעלי לעשות זה לבצע קריאה ל- API של טוויטר. בטח עכשיו מי שקורא את המאמר משנס את איזור חלציו כדי לראות איזה יישום מבריק אני הולך לכתוב על מנת שיתקשר עם ה-API הלז אל האפליקציה שלי. אך צר לי לאכזב את מי שחושב שאני הולך לכתוב כאן משהו מורכב. בזנד פריימוורק יש Services רבים כולל לטוויטר! כלומר, אם חשקה נפשי להתחבר לענן של אמאזון, לאזור של מיקרוסופט או אפילו סתם לטוויטר, פליקר או דלישס – ישנם שפע של שירותים שקיימים כבר בזנד! אם תכנסו ל-Zend Framework Reference ותחפשו 'Twitter', תגלו שיש ספריה שלמה שמטפלת בחיבור לטוויטר. כל מה שעלי לעשות זה לזמן אותה, להשתמש במתודה הנכונה עם טקסט החיפוש שלי ולקבל את המידע חזרה. הוריי!
$twitterSearch = new Zend_Service_Twitter_Search('json');
$searchResults = $twitterSearch->search("$tsearch", array('lang' => 'en'));
$result = $searchResults['results'];
אין דבר שמתכנתים אוהבים לעשות מלא לעבוד קשה. באמצעות שלוש שורות בלבד יצרתי קשר עם טוויטר וקיבלתי את מה שרציתי. כל מה שעלי לעשות זה להעביר את התוצרת אל ה-view שלי, ואת זה אני עושה באמצעות:
$this->view->tsearch = $tsearch;
$this->view->result = $result;
כלומר, אני מוסיף את המשתנים result ו-tsearch לשימוש ה-view. ה-Action המלא יראה כך:
public function extractAction()
{
$tsearch = Zend_Filter::get($this->getRequest()->getPost('tsearch'), 'StripTags');
$twitterSearch = new Zend_Service_Twitter_Search('json');
$searchResults = $twitterSearch->search("$tsearch", array('lang' => 'en'));
$result = $searchResults['results'];
$this->view->tsearch = $tsearch;
$this->view->result = $result;
}
יצירת ה-View להצגת המידע
עכשיו נשאר לכתוב את ה-View. ניגש אל mytwit/application/views/scripts/index
ונפתח את קובץ extract.phtml. נכניס את הקוד הבא שאמור להיות מובן לכל מתכנת PHP ולו ברמה הבסיסית ביותר:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Results Page</title>
</head>
<body >
<h1>
<?php echo $this->escape($this->tsearch);?>
</h1>
<hr />
<ul>
<?php foreach ($this->result as $item) {
echo '<li>'.$item['text'].'</li>';
}
?>
</ul>
</body>
</html>
ו… זהו! יש לנו אפליקציה שעובדת! אתם יכולים לנסות וליצור אפליקציה כזו תוך שימוש בקוד או לנסות וליצור אחת משלכם. אבל ללא ספק כאן אפשר לראות את היעילות הרבה שיש בזנד פריימוורק.
במאמר הבא אנו נלמד על base controllers בזנד פריימוורק.