edo1z blog

プログラミングなどに関するブログです

twitterプロフィール画像をFilebinderに関連づけつつ保存する

全然汎用的じゃないけどtwitter画像を保存してみた。

/**
 * Twitter画像の取得関数
 */
public function save_twitter_profile_img($model, $twitter_img_url, $user_id){
    $args = array(array(18, 18), array(48, 48)); //サムネイルのサイズ

    $save_dir_path = '/upload/User/' . $user_id . '/img';
    $dir = new Folder(WWW_ROOT . $save_dir_path);
    if($dir->find('.*')) return true;
    $dir->create(WWW_ROOT . $save_dir_path);

    $url = str_replace('_normal', "", $twitter_img_url); //_normalを削除
    $url_info = parse_url($url);
    $path_info = pathinfo($url_info['path']);
    $save_path = WWW_ROOT . $save_dir_path . '/' . $path_info['filename'] . '.' . $path_info['extension'];

    if($this->resize_image_from_out($model, $url, $save_path, 100, 100)){ //100*100の画像
        if($this->create_thumbnail($model, $save_path, $args)){
            //FileBinderのattachmentsテーブルに登録
            $Attachment = $this->_getModelObject('Attachment', 'attachments');
            $data = array(
                'Attachment' => array(
                    'model' => 'User',
                    'model_id' => $user_id,
                    'field_name' => USER_IMG_FIELD_NAME,
                    'file_name' => $path_info['filename'] . '.' . $path_info['extension'],
                    'file_content_type' => 'image/' . $path_info['extension'],
                    'file_size' => 10
                )
            );
            $Attachment->create();
            $Attachment->save($data);
            return true;
        }
    }

    return false;
}

いやー汎用的じゃない。あとまだしっかりチェックしてない。でもできた。$this->resize_image_from_outとかは、GDでリサイズする関数に渡してる。$this->_getModelObjectは、BakeのModelTaskに書いてあったテーブルをモデルとして扱えるようにできる関数だから使ってみた。

/**
 * テーブルをモデルにしてくれる関数
 * @param      $className
 * @param null $table
 *
 * @return Model
 */
public function _getModelObject($className, $table = null) {
    if (!$table) {
        $table = Inflector::tableize($className);
    }
    $object = new Model(array('name' => $className, 'table' => $table, 'ds' => null));
    $fields = $object->schema(true);
    foreach ($fields as $name => $field) {
        if (isset($field['key']) && $field['key'] === 'primary') {
            $object->primaryKey = $name;
            break;
        }
    }
    return $object;
}