-
Notifications
You must be signed in to change notification settings - Fork 260
/
Feeds.php
212 lines (198 loc) · 8.93 KB
/
Feeds.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
<?php
/**
* Copyright 2019 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Google\Ads\GoogleAds\Examples\Utils;
use Google\Ads\GoogleAds\Lib\V6\GoogleAdsClient;
use Google\Ads\GoogleAds\V6\Enums\FlightPlaceholderFieldEnum\FlightPlaceholderField;
use Google\Ads\GoogleAds\V6\Enums\RealEstatePlaceholderFieldEnum\RealEstatePlaceholderField;
use Google\Ads\GoogleAds\V6\Resources\FeedAttribute;
use Google\Ads\GoogleAds\V6\Resources\FeedItem;
use Google\Ads\GoogleAds\V6\Resources\FeedItemAttributeValue;
use Google\Ads\GoogleAds\V6\Services\GoogleAdsRow;
/**
* Utilities that are shared between code examples related to feeds.
*/
final class Feeds
{
private const PAGE_SIZE = 1000;
/**
* Retrieves a feed item and its attribute values given a resource name.
*
* @param string $feedItemResourceName the feed item resource name
* @param int $customerId the customer ID
* @param GoogleAdsClient $googleAdsClient the Google Ads API client
* @return FeedItem the feed item
*/
public static function feedItemFor(
string $feedItemResourceName,
int $customerId,
GoogleAdsClient $googleAdsClient
) {
$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
// Constructs the query to get the feed item with attribute values.
$query = "SELECT feed_item.attribute_values FROM feed_item"
. " WHERE feed_item.resource_name = '$feedItemResourceName'";
// Issues a search request by specifying page size.
$response =
$googleAdsServiceClient->search($customerId, $query, ['pageSize' => self::PAGE_SIZE]);
// Returns the feed item attribute values, which belongs to the first item. We can ensure
// it belongs to the first one because we specified the feed item resource name in the
// query.
return $response->getIterator()->current()->getFeedItem();
}
/**
* Gets the index of the target feed item attribute value. This is needed to specify which feed
* item attribute value will be updated in the given feed item.
*
* @param FeedItemAttributeValue $targetFeedItemAttributeValue the new feed item attribute value
* that will be updated
* @param FeedItem $feedItem the feed item that will be updated. It should be populated with
* the current attribute values
* @return int the attribute index
*/
public static function attributeIndexFor(
FeedItemAttributeValue $targetFeedItemAttributeValue,
FeedItem $feedItem
) {
$attributeIndex = -1;
// Loops through attribute values to find the index of the feed item attribute value to
// update.
foreach ($feedItem->getAttributeValues() as $feedItemAttributeValue) {
/** @var FeedItemAttributeValue $feedItemAttributeValue */
$attributeIndex++;
// Checks if the current feedItemAttributeValue is the one we are updating
if (
$feedItemAttributeValue->getFeedAttributeId()
=== $targetFeedItemAttributeValue->getFeedAttributeId()
) {
break;
}
}
if ($attributeIndex === -1) {
throw new \InvalidArgumentException(
'No matching feed attribute for feed item attribute ID: '
. $targetFeedItemAttributeValue->getFeedAttributeId()
);
}
return $attributeIndex;
}
/**
* Retrieves the place holder fields to feed attributes map for a flights feed.
* See FlightPlaceholderField.php for all available placeholder field values.
*
* @see Feeds::placeholderFieldsMapFor()
*
* @param string $feedResourceName the feed resource name to get the attributes from
* @param int $customerId the customer ID
* @param GoogleAdsClient $googleAdsClient the Google Ads API client
* @return array the map from placeholder fields to feed attributes
*/
public static function flightPlaceholderFieldsMapFor(
string $feedResourceName,
int $customerId,
GoogleAdsClient $googleAdsClient
) {
return self::placeholderFieldsMapFor(
$feedResourceName,
$customerId,
$googleAdsClient,
[
'Flight Description' => FlightPlaceholderField::FLIGHT_DESCRIPTION,
'Destination ID' => FlightPlaceholderField::DESTINATION_ID,
'Flight Price' => FlightPlaceholderField::FLIGHT_PRICE,
'Flight Sale Price' => FlightPlaceholderField::FLIGHT_SALE_PRICE,
'Final URLs' => FlightPlaceholderField::FINAL_URLS
]
);
}
/**
* Retrieves the place holder fields to feed attributes map for a real estate feed.
* See RealEstatePlaceholderField.php for all available placeholder field values.
*
* @see Feeds::placeholderFieldsMapFor()
*
* @param string $feedResourceName the feed resource name to get the attributes from
* @param int $customerId the customer ID
* @param GoogleAdsClient $googleAdsClient the Google Ads API client
* @return array the map from placeholder fields to feed attributes
*/
// [START add_real_estate_feed]
public static function realEstatePlaceholderFieldsMapFor(
string $feedResourceName,
int $customerId,
GoogleAdsClient $googleAdsClient
) {
return self::placeholderFieldsMapFor(
$feedResourceName,
$customerId,
$googleAdsClient,
[
'Listing ID' => RealEstatePlaceholderField::LISTING_ID,
'Listing Name' => RealEstatePlaceholderField::LISTING_NAME,
'Final URLs' => RealEstatePlaceholderField::FINAL_URLS,
'Image URL' => RealEstatePlaceholderField::IMAGE_URL,
'Contextual Keywords' => RealEstatePlaceholderField::CONTEXTUAL_KEYWORDS
]
);
}
// [END add_real_estate_feed]
/**
* Retrieves the placeholder fields to feed attributes map for a feed. The initial
* query retrieves the feed attributes, or columns, of the feed. Each feed attribute will also
* include the feed attribute ID, which will be used in a subsequent step.
*
* Then a map is created for the feed attributes (columns) and returned:
* - The keys are the placeholder types that the columns will be.
* - The values are the feed attributes.
*
* @param string $feedResourceName the feed resource name to get the attributes from
* @param int $customerId the customer ID
* @param GoogleAdsClient $googleAdsClient the Google Ads API client
* @param array $feedAttributeNamesMap the associative array mapping from feed attribute names
* to placeholder fields
* @return array the map from placeholder fields to feed attributes
*/
private static function placeholderFieldsMapFor(
string $feedResourceName,
int $customerId,
GoogleAdsClient $googleAdsClient,
array $feedAttributeNamesMap
) {
$googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient();
// Constructs the query to get the feed attributes for the specified feed resource name.
$query = "SELECT feed.attributes FROM feed WHERE feed.resource_name = '$feedResourceName'";
// Issues a search request by specifying page size.
$response =
$googleAdsServiceClient->search($customerId, $query, ['pageSize' => self::PAGE_SIZE]);
// Gets the first result because we only need the single feed we created previously.
/** @var GoogleAdsRow $googleAdsRow */
$googleAdsRow = $response->getIterator()->current();
// Gets the attributes list from the feed and creates a map with keys of placeholder fields
// and values of feed attributes.
$feedAttributes =
iterator_to_array($googleAdsRow->getFeed()->getAttributes()->getIterator());
$placeholderFields = array_map(
function (FeedAttribute $feedAttribute) use ($feedAttributeNamesMap) {
if (!array_key_exists($feedAttribute->getName(), $feedAttributeNamesMap)) {
throw new \RuntimeException('Invalid feed attribute name.');
}
return $feedAttributeNamesMap[$feedAttribute->getName()];
},
$feedAttributes
);
return array_combine($placeholderFields, $feedAttributes);
}
}