Как я могу загрузить изображение из поля Drupal в UIImageView?

#mysql #ios #drupal #uiimageview

#mysql #iOS #drupal #uiimageview

Вопрос:

Я создаю приложение для своего веб-сайта на основе Drupal. В настоящее время мое приложение для iOS извлекает данные из базы данных MySQL (например, названия и описания статей). Кто-нибудь знает, какой код я бы использовал для отображения соответствующего изображения статьи (загруженного через поле Drupal) в UIImageView?

Вот краткий фрагмент кода, который я использую для извлечения текста с моего сайта Drupal.

DoctorsViewController.h

 @interface DoctorsViewController : UIViewController {

    IBOutlet UITableView *DoctorsTableView;

    NSArray *Doctors;
    NSMutableData *data;

}
  

DoctorsViewController.m

 - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.


[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSURL *url = [NSURL URLWithString:@"MY URL HERE"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

// Do any additional setup after loading the view, typically from a nib.
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    data = [[NSMutableData alloc] init];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)theData
{
    [data appendData:theData];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

    Doctors = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];
    [DoctorsTableView reloadData];

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error" message:@"The download could not complete - please make sure that you're connected to 3G or Wi-Fi." delegate:nil
                                              cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
    [errorView show];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;


}
- (int)numberOfSectionsInTableView: (UITableView *)tableview

{
    return 1;

}

- (int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [Doctors count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *DoctorsTableIdentifier = @"DoctorsCell";

    DoctorsCell *cell = (DoctorsCell *)[tableView dequeueReusableCellWithIdentifier:DoctorsTableIdentifier];
    if (cell == nil) 
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"DoctorsCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    } 

    cell.firstnameLabel.text = [[Doctors objectAtIndex:indexPath.row] objectForKey:@"node_title"];

    cell.descriptionLabel.text = [[Doctors objectAtIndex:indexPath.row] objectForKey:@"Opening Paragraph"];


    return cell;

}
  

Ответ №1:

Это не так просто, как кажется — Drupal хранит данные своего поля очень специфическим образом, а URI для изображений адресуются схемой, а не относительным или абсолютным путем (например public://path/to/image.jpg в отличие от /sites/default/files/path/to/image.jpg )

Вы можете получить URI изображения для узла прямо из базы данных следующим образом (при условии, что ваш тип статьи использует стандартное поле field_image):

 SELECT fm.uri
FROM {file_managed} fm
INNER JOIN field_data_field_image fi ON fi.entity_type = 'node' AND fi.bundle = 'article' AND fi.deleted = 0 AND fi.field_image_fid = fm.fid
WHERE fi.entity_id = <nid>
  

Где <nid> идентификатор узла. Оттуда вам нужно будет выполнить любую логику, необходимую для преобразования путей во что-то полезное для вашего приложения iOS. Drupal использует file_create_url() для выполнения той же задачи, так что это лучшая отправная точка для вдохновения. В зависимости от ваших настроек вам вполне может сойти с рук просто замена строки на public:// http://example.com/sites/default/files/ .

В долгосрочной перспективе вы можете захотеть добавить модуль Services и использовать REST API в своем приложении вместо прямого запроса к БД. Вам потребуется много усилий для подготовки данных Drupal, чтобы вы могли просто справиться с тем, что вам нужно.

Комментарии:

1. Привет @Clive! Спасибо за ваш ответ. В итоге я установил модуль Services на свой сайт Drupal, как вы предложили, создал конечную точку views (с выводом JSON) и получил доступ к URL-адресу изображения таким образом 🙂 Работает как шарм.