212 lines
8.9 KiB
PHP
212 lines
8.9 KiB
PHP
<?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 app\util;
|
|
|
|
use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClient;
|
|
use Google\Ads\GoogleAds\V18\Enums\FlightPlaceholderFieldEnum\FlightPlaceholderField;
|
|
use Google\Ads\GoogleAds\V18\Enums\RealEstatePlaceholderFieldEnum\RealEstatePlaceholderField;
|
|
use Google\Ads\GoogleAds\V18\Resources\FeedAttribute;
|
|
use Google\Ads\GoogleAds\V18\Resources\FeedItem;
|
|
use Google\Ads\GoogleAds\V18\Resources\FeedItemAttributeValue;
|
|
use Google\Ads\GoogleAds\V18\Services\GoogleAdsRow;
|
|
use Google\Ads\GoogleAds\V18\Services\SearchGoogleAdsRequest;
|
|
|
|
/**
|
|
* Utilities that are shared between code examples related to feeds.
|
|
*/
|
|
final class Feeds
|
|
{
|
|
/**
|
|
* 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.
|
|
$response =
|
|
$googleAdsServiceClient->search(SearchGoogleAdsRequest::build($customerId, $query));
|
|
|
|
// 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.
|
|
$response =
|
|
$googleAdsServiceClient->search(SearchGoogleAdsRequest::build($customerId, $query));
|
|
|
|
// 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);
|
|
}
|
|
}
|