sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるPHP5ライブラリです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/
今日はdelete, undelete について説明します。非常に簡単です。
delete()の引数にIdを指定する方法と、エンティティのプロパティにIdをセットする方法があります。
$result = Sobject_Account::neu()->delete('xxxxxxxxxxxxxxxx');
または
$account = new Sobject_Account();
$account->Id = 'xxxxxxxxxxxxxxxx';
$result = $account->delete();
undeleteは削除を取り消す機能です。こちらも使い方はdeleteと同じです。
$result = Sobject_Account::neu()->undelete('xxxxxxxxxxxxxxxx');
または
$account = new Sobject_Account();
$account->Id = 'xxxxxxxxxxxxxxxx';
$result = $account->undelete();
SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(7) はコメントを受け付けていません
sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるPHP5ライブラリです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/
今日はupsertについて説明します。
指定したカラムの値が同じレコードが存在したらUPDATE,存在しなければINSERTを行なう機能です。
upsert()メソッドの第一引数に`外部ID`となるカラム名をセットします。指定したカラム名でUPDATE or INSERTを判断します。
下記の例では JyugyoinBango__c の値が 123456 でupsertを行ないます。
$extid = '123456';
$j = new Sobject_Jyugyoin__c();
$j->Name = "Test Member";
$j->JyugyoinBango__c = $extid;
$j->Age__c = 30;
$result = $j->upsert('JyugyoinBango__c');
戻り値はBooleanです。成功した場合はエンティティのIdに値がセットされます。
エラーとなった場合は getErrors()メソッドでerrorオブジェクト(エラーに関する情報)を取得できます。
SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(6) はコメントを受け付けていません
sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるPHP5ライブラリです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/
今日はupdate(データの更新)について説明します。
エンティティにセットしたプロパティのみ更新する update()と、全プロパティ(値がセットされていなければNULLになる)を更新するupdateEntity()があります。
更新したいプロパティに新しい値をセットし update() を実行します。
プロパティにNULLをセットしたいときは fieldnull() を使うか、update()メソッドの第一引数に配列(NULLにしたいプロパティ名)で渡します。
$account = new Sobject_Account();
$account->Id = '0018000000UoDxpAAF';
$account->Name = 'Tigger';
$account->fieldnull('ParentId');
$result = $account->update();
if (! $result) {
print_r($account->getErrors());
}
update()は空のプロパティを更新しないのに対して updateEntity()は全てのプロパティを更新します。(空のプロパティはNULLになります。)
このメソッドは select()で取得したものを更新するのに役立ちます。
$account = Sobject_Account::neu()->find('0018000000UoDxpAAF');
$account->Name = 'Tigger';
$account->ParentId = NULL;
$result = $account->updateEntity();
SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(5) はコメントを受け付けていません
sRecordは seasar2の S2JDBC, それをまねて作った拙作teeple2のActiveRecordと似たような使い方でSalesforceのデータを取り扱うことができるPHP5ライブラリです。google codeにオープンソースとして公開していますので是非ご利用ください。
http://code.google.com/p/srecord4p/
今日はcreate(データのINSERT)について説明します。
特に難しいところはありません。オブジェクトを作ってプロパティに値をセットして、create()メソッドを呼び出す、、それだけです。
$account = Sobject_Account::neu(); // same as new Sobject_Account();
$account->Name = 'Scott';
$result = $account->create();
if ($result) {
echo("Account was created. ID is {$account->Id}");
} else {
echo("Account creation failed.");
print_r($account->getErrors());
}
戻り値はBooleanです。create()が成功した場合はオブジェクトに払い出されたIDがセットされます。
エラーが発生した場合は getErrors()メソッドでエラーオブジェクトが取得できます。
(Errorオブジェクトの構造は PHP Toolkit からの戻り値そのままです。)
SalesforceのデータにアクセスするためのPHP5ライブラリ「sRecord」の使い方(4) はコメントを受け付けていません
appengineでJSON-RPCサーバーのようなものを作りたいときなど ServletRequest#getInputStream()で取得できるInputStreamを使いたい場合があります。ところがslim3のcontrollerでこれをやろうとするとInputStreamのIllegalStateExceptionが発生します。
Jettyや大概のサーブレットサーバーは getInputStreamとgetParameter(s)を同時には使えないようです。
JSON-RPCならslim3のcontrollerは使う必要ないじゃんといえばそれまでなのですができれば慣れているもので全てやってしまいたいというのも事実。そこで以下のようなworkaroundで回避します。
- StreamFilterを作って、そこでServletRequestをWrapperクラスに置き換える (一番最初にこのFilterが動くようにする)
- RequestWrapperでは getInputStreamをoverrideし、Streamを再利用可能にする
なお、このworkaroundは http://d.hatena.ne.jp/machi_pon/20090120/1232420325 にて紹介されているやり方とほぼ同じです。(ナイスポストありがとうございました!)
public class StreamFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
request = new BufferedServletRequestWrapper( req );
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {
private byte[] buffer;
public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
super( request );
InputStream is = request.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buff[] = new byte[ 1024 ];
int read;
while( ( read = is.read( buff ) ) > 0 ) {
baos.write( buff, 0, read );
}
this.buffer = baos.toByteArray();
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new BufferedServletInputStream( this.buffer );
}
}
public class BufferedServletInputStream extends ServletInputStream {
private ByteArrayInputStream inputStream;
public BufferedServletInputStream(byte[] buffer) {
this.inputStream = new ByteArrayInputStream( buffer );
}
@Override
public int available() throws IOException {
return inputStream.available();
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return inputStream.read( b, off, len );
}
}
slim3のcontrollerでServletInputStreamを使いたいとき はコメントを受け付けていません