- 首先下載及安裝 Composer-Setup.exe, 這個程式將會幫忙我們下載各類型的程式庫,包括我們即將使用的doctrine.
網址為: http://getcomposer.org/doc/00-intro.md - 安裝後,我們建立新專案的資料夾,例如new_project,然後在新專案的root目錄裏(即根目錄),新增檔案composer.json,然後於檔案中輸入以下json code:{
"require": {
"doctrine/orm": "2.*",
"symfony/yaml": "2.*"
},
"autoload": {
"psr-0": {"": "src/"}
}
}
這個檔案是告訴Composer我們即將安裝什麼程式庫到我們的新專案。 - 然後我們打開command mode,前往我們專案的root目錄,並輸入以下指令:composer install
如無意外,你將會看到正在下載的畫面,等待片刻程式庫將會自動安裝到我們的專案目錄裏。 - 另外,我們需要為doctrine準備以下的資料夾,架構如下:new_project
|-- composer.json
|-- config
| |-- xml
| `-- yaml
`-- src - 然後,讓我們於root目錄中新增一個檔案名為bootstrap.php,並加入以下代碼:<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;
require_once "vendor/autoload.php";
// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
//$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/entities"), $isDevMode);
// or if you prefer yaml or XML
//$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode);
$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);
// database configuration parameters
//$conn = array(
// 'driver' => 'pdo_sqlite',
// 'path' => __DIR__ . '/db.sqlite',
//);
$conn = array(
'driver' => 'pdo_mysql',
'host' => '127.0.0.1',
'dbname' => 'test',
'user' => 'root',
'password' => ''
);
// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);
使用什麼資料格式進行orm請自行決定,以上我使用了yaml. - 於root目錄中再新增一個檔案名為cli-config.php,並加入以下代碼:<?php
// cli-config.php
require_once "bootstrap.php";
$helperSet = new \Symfony\Component\Console\Helper\HelperSet(array(
'em' => new \Doctrine\ORM\Tools\Console\Helper\EntityManagerHelper($entityManager)
)); - 初步設定已經完成,接下來讓我們建立資料表架構,我們使用yaml建立一個資料表架構,代碼如下:# config/yaml/Product.dcm.yml
Product:
type: entity
table: products
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string - 然後我們再使用以下指令,讓doctrine為我們建立mapper class:vendor\bin\doctrine orm:generate-entities config/yaml
建立完成後,請將建立的mapper class於config/yaml中移到 root/src. - 再來讓我們在資料庫中建立資料表:vendor\bin\doctrine orm:schema-tool:create
- 現在就可以使用doctrine來操作資料表了,以下為簡單例子:<?php
// create_product.php
require_once "bootstrap.php";
$newProductName = $argv[1];
$product = new Product();
$product->setName($newProductName);
$entityManager->persist($product);
$entityManager->flush();
echo "Created Product with ID " . $product->getId() . "\n";
**執行指令測試輸入資料到資料表:
php create_product.php ORM<?php
// list_products.php
$productRepository = $entityManager->getRepository('Product');
$products = $productRepository->findAll();
foreach ($products as $product) {
echo sprintf("-%s\n", $product->getName());
}<?php
// show_product.php
$id = $argv[1];
$product = $entityManager->find('Product', $id);
echo sprintf("-%s\n", $product->getName()); - 以下指令可以依現時的mapper class格式轉換成為xml格式vendor\bin\doctrine orm:convert-mapping xml /path/to/mapping-path-converted-to-xml
doctrine2 已經安裝完成,以後可以輕鬆地透過orm操作資料庫了。
學習的足跡,人生的點滴。
記下我的錯誤,我的發現和我的感想...
Doctrine2 安裝教學
**本文假設php.exe已經安裝完成,並新增到windows的環境變數中。
2013年。。。
由小時候開始,我就有自已的夢想列表,一個又一個天馬行空的、不切實際的夢想。這個夢想列表有推動人生的作用,像海中的燈塔。漸漸人大了,夢想列表的夢想也變得實際,不會將夢想設得太遙遠,最起碼能在短期內實踐。
人生太短,如果我們沒有把握時間,實踐自己的夢想,原地踏步過著平凡的生活,最終時間會將青春及夢想一起帶走。
2013年,又迎來新一年的開始,每年這個時候我也會為接下來的一整年計劃要做的事,順便更新自已的夢想列表。回望2012年為自已設下的目標完成進度雖說不是全部完成,但總算完成過半。
人越大,感覺時間過得越快,每天也想把時間留住,最後也無奈地送走了2012年。實踐夢想需要付出一定的代價,值不值得就視乎自已的判斷,不顧一切去實踐夢想還是原地踏步過著安全的生活?反正人生本來就一無所有,有什麼好怕?放下一切去做自已喜歡的事,實踐自已的夢想。。。
人生太短,如果我們沒有把握時間,實踐自己的夢想,原地踏步過著平凡的生活,最終時間會將青春及夢想一起帶走。
2013年,又迎來新一年的開始,每年這個時候我也會為接下來的一整年計劃要做的事,順便更新自已的夢想列表。回望2012年為自已設下的目標完成進度雖說不是全部完成,但總算完成過半。
人越大,感覺時間過得越快,每天也想把時間留住,最後也無奈地送走了2012年。實踐夢想需要付出一定的代價,值不值得就視乎自已的判斷,不顧一切去實踐夢想還是原地踏步過著安全的生活?反正人生本來就一無所有,有什麼好怕?放下一切去做自已喜歡的事,實踐自已的夢想。。。
自訂UITableViewCell風格
- 於project中建立一個新file,選擇Cocoa Touch後再選擇Object-C class.
- 於Class中輸入自訂的Cell名稱,例如MovieTableViewCell,於Subclass of中輸入UITableViewCell.
- 我們需要為自訂的UITableViewCell增加一個UIView,讓我們可以自訂Cell的風格。建立一個新file,選擇User Interface後再選擇View.
- 建立View後,xcode為我們預設的並不是正確的UITableViewCell,所以我們手動將預設的View刪除,再於Ojbect Library中拉出Table View Cell。
- 現在我們可以自由地在Table View Cell中設計風格,例如加入圖片及文字等等。
- 將我們自訂的UITableViewCell加入到UITableViewController//設定Section數量
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
//設定Section總行數
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
//設定每行的Cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
MovieTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
NSArray* views = [[NSBundle mainBundle] loadNibNamed:@"MovieTableViewCell" owner:nil options:nil];
cell=[views objectAtIndex:0];
cell.title.text=@"this is title";
NSURL *imageURL=[NSURL URLWithString:@"http://www.yoursite.com/hello.png"];
NSData *imageData=[NSData dataWithContentsOfURL:imageURL];
cell.img.image=[UIImage imageWithData:imageData];
}
return cell;
}
//為每行的Cell設定高度
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 77;
} - 取消預設的UITableViewCell風格,於UITableViewController中的viewDidLoad加入:[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
- 如果像這個例子,每個Cell都會透過網絡下載不同的圖片顯示,那麼當使用者進行Scroll時,將會出現累格的情況,這時我們只需要在MovieTableViewCell.m中加入以下語法,即可解決這個問題:-(NSString *)reuseIdentifier
{
return @"Cell";
}
原因是以下語法將我們自訂的UITableViewCell與dequeueReusableCellWithIdentifier進行了連結,令app不需要浪費資源每次進行提取。
Labels:
XCode
0
comments
為UIWebView加上Loading
在app中使用in app browser並不會自動顯示下載進度,當網站尚未下載完成時,很多時候會出現白屏,這樣很容易令用戶出現錯覺以為app當掉。以下有個簡單的方式加入下載中的圖示,讓用戶知道我們的app還在工作中。
- 在Object Library中將UIWebView及Activity Indicator View拉到ViewController中,並將這兩個Object連到property://interface
@property (nonatomic, retain) IBOutlet UIWebView *webview;
@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *activityIndicator;
//implementation
@synthesize webview,activityIndicator;
- 選擇Activity Indicator View,在Attributes inspector中點選Hides When Stopped 這個選項。
- 然後在UIWebView上點擊滑鼠右鍵,將delegate連結到本身的ViewController。
- 在implementation中加入兩個delegate的function:-(void)webViewDidStartLoad:(UIWebView *)webView
{
[activityIndicator startAnimating];
}
-(void)webViewDidFinishLoad:(UIWebView *)webView
{
[activityIndicator stopAnimating];
}
Labels:
XCode
0
comments
得到金錢,卻失去了財富
我們努力地工作、投資、創業,為的是賺取更多金錢。我們都相信有更多的金錢,就可以改善自已的生活,滿足自已的慾望,從而得到快樂及幸福。
可是當我們將所有時間都花在為金錢奮鬥時,其實我們失去的可能更多。。。因為忙碌而沒有時間陪伴家人、朋友,沒有好好享受生活,最後即使得到金錢,但回頭看才驚覺失去的其實更多,時間已經無法再回頭。
我們要懂得知足,當擁有一個幸福的家庭,過著快樂的生活其實已經足夠。為了滿足更多的慾望,不斷地為金錢而苦惱,投資失敗導致負債而煩惱、一整天埋頭苦幹導致與家人的距離拉遠,最後失去了原本幸福快樂的生活,這代價實在太沉重。
金錢並不是我們的財富,我們的財富是我們的親情、友情、愛情、知識、時間。。。如果為了獲得更多金錢最後令我們失去了財富,根本不值得,我們的財富是金錢無法購買的。
如果現在的生活過得幸福快樂沒有煩惱,請珍惜。。。
可是當我們將所有時間都花在為金錢奮鬥時,其實我們失去的可能更多。。。因為忙碌而沒有時間陪伴家人、朋友,沒有好好享受生活,最後即使得到金錢,但回頭看才驚覺失去的其實更多,時間已經無法再回頭。
我們要懂得知足,當擁有一個幸福的家庭,過著快樂的生活其實已經足夠。為了滿足更多的慾望,不斷地為金錢而苦惱,投資失敗導致負債而煩惱、一整天埋頭苦幹導致與家人的距離拉遠,最後失去了原本幸福快樂的生活,這代價實在太沉重。
金錢並不是我們的財富,我們的財富是我們的親情、友情、愛情、知識、時間。。。如果為了獲得更多金錢最後令我們失去了財富,根本不值得,我們的財富是金錢無法購買的。
如果現在的生活過得幸福快樂沒有煩惱,請珍惜。。。
Labels:
其他
0
comments
resignFirstResponder 關閉鍵盤
按下return鍵將鍵盤關閉
- 建立一個IBAction,將目標從first responder的狀態解除。-(IBAction)textFieldReture:(id)sender
{
[sender resignFirstResponder];
} - 然後將這個IBAction連結到textField的Did End On Exit。當在這個textField輸入完成後,按下鍵盤的return就可以關閉鍵盤。
- 建立IBAction,將所有textField都執行resignFirstResponder-(IBAction)closeKeyboard:(id)sender
{
[fieldone resignFirstResponder];
[fieldtwo resignFirstResponder];
} - 點擊背景的View,將View的class由UIView轉變成UIControl,那麼View就可以傳送events。
- 輸變class後,再將View的TouchDown連結到IBAction。
Labels:
XCode
0
comments
Ben Franklin 的十三項「美德」
Ben Franklin 在 20 歲時就給自己立下了這些人生哲學,然後一輩子不斷的實踐它們。
- 節制,不囫圇吞棗,不狂飲
- 沉默,發言一定要能夠為對方或自己創造價值
- 秩序,生活中的所有事物都要有它們自己的位置,所有業務都要有它們自己的時間
- 意志,說到的就要做到,做到跟你說到的一樣好
- 節儉,花費一定要能夠為別人或自己帶來價值
- 產出,時間跟精力必花在有用的事物上面
- 誠懇,不用詭計,用純粹而平等的角度思考,如果要發言,就照著你的思想說
- 公平,不冤枉人,應得的就要取
- 中道,避免極端,不要落井下石
- 整潔,絕不容忍身上、衣服與家中的髒亂
- 平靜,不被世俗所擾,也不為無法改變的事情所困
- 潔身,性愛是健康與生育的,不是發洩或是報復的管道
- 謙遜,像耶穌或與蘇格拉底一般
Labels:
其他
0
comments
訂閱:
文章 (Atom)