Сделать переменные за пределами узла доступными для pathauto

Я пытаюсь перенести сайт на Drupal 7. Структура состоит из местоположений, которые имеют ссылку на сущность для региона, который имеет ссылку на сущность для страны:

  

местоположение & л; -области & л; -Страна & л; -continent

Все это работает нормально. Узел местоположения напрямую не знает, в какой стране он находится, но он знает, в каком регионе он находится.

Проблема заключается в том, что я хочу использовать старую структуру URL:

  

/континент /страна /регион /место

До сих пор я могу заставить его работать для /region/location (как регион ссылается из местоположения), но затем я застреваю.

Что мне интересно, есть ли способ вытащить эти другие поля (страну /континент) в узел и сделать их доступными для pathauto?

Если это помогает, не имеет значения, какой континент и страна являются регионом и amp; местоположение предоставит достаточно информации. Так что подстановочный знак будет в порядке.

Итак, во-первых, возможно ли это с этой структурой. И если да, то как?

Любая помощь очень ценится.

5 голосов | спросил Chris Leather 12 MarpmTue, 12 Mar 2013 14:02:55 +04002013-03-12T14:02:55+04:0002 2013, 14:02:55

1 ответ


0

Я был в похожей лодке с сайтом, над которым я работал недавно. К сожалению, Drupal 7 не полностью поддерживает токены на объектах поля; см. http://drupal.org/node/691078 . Вот почему тип «location node» существует в модуле location - легче определить маркеры для ваши местоположения. Однако мне не понравился UX для узлов местоположения; Я очень предпочел результат, который можно легко получить с помощью cck-местоположений.

Так как было невозможно легко поддерживать токены в местах cck, я вместо этого написал свой собственный код токена в своем настраиваемом модуле для моего сайта. Я потратил немало часов, пытаясь сделать первый первый, прежде чем отказаться от него слишком много усилий.

Я не уверен, если вы используете модуль местоположения, или если вы просто определяете свои собственные сущности, которые содержат локации. Тот факт, что у вас есть ваши объекты местоположения, скованные вместе, подразумевает, что вы используете свои собственные типы сущностей. Вот результат, который я придумал для модуля местоположения; вы должны иметь возможность адаптировать его для стандартных объектов без особых проблем. В приведенном ниже коде могут быть некоторые незначительные улучшения; 'und' должен быть LANGUAGE_NONE, специальная проверка для определенного типа содержимого, вероятно, не нужна и т.д .; вам не должно быть слишком сложно адаптироваться в каком-то коде, который разрешает ваши привязанные ссылки на объекты для создания нужных вам токенов.

После того, как вы написали свой код, вы легко можете выбрать новые маркеры в pathauto, чтобы определить свою структуру URL.

function MYMODULE_token_info() {
  // Because of http://drupal.org/node/691078, we just hack in our own
  // field-based tokens here for now (cough).
  // These tokens are only available for nodes of type MY_CONTENT_TYPE_WITH_LOCATION_FIELD
  $node['field_location_street'] = array(
    'name' => t("Location Street"),
    'description' => t('The street address that a location is located at.'),
  );
  $node['field_location_city'] = array(
    'name' => t("Location City"),
    'description' => t('The city that a location is in.'),
  );
  $node['field_location_province'] = array(
    'name' => t("Location Province"),
    'description' => t('The abbreviation for the province (State) that a location is in.'),
  );
  $node['field_location_province_name'] = array(
    'name' => t("Location Province Name"),
    'description' => t('The full name of the province (State) that a location is in.'),
  );
  $node['field_location_country'] = array(
    'name' => t("Location Country"),
    'description' => t('The country that a location is in.'),
  );
  $node['field_location_country_name'] = array(
    'name' => t("Location Country Name"),
    'description' => t('The full name of the country that a location is in.'),
  );
  $node['field_location_summary'] = array(
    'name' => t("Location Summary"),
    'description' => t('A parenthesized summary of the location (City, State).'),
  );
  return array(
    'tokens' => array('node' => $node),
  );
}

function MYMODULE_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();
  if ($type == 'node' && !empty($data['node'])) {
    $node = $data['node'];
    $location_field = array();
    if (($node->type == 'MY_CONTENT_TYPE_WITH_LOCATION_FIELD') && (isset($node->field_location['und'][0]))) {
      $location_field = $node->field_location['und'][0];
    }
    if (($node->type == 'MY_CONTENT_TYPE_WITH_NODE_REF_TO_TYPE_WITH_LOCATION_FIELD') && (isset($node->field_event_site['und'][0]))) {
      $location_nid = $node->field_event_site['und'][0]['nid'];
      $location_node = node_load($location_nid);
      if (isset($location_node->field_location['und'][0])) {
        $location_field = $location_node->field_location['und'][0];
      }
    }
    if (!empty($location_field)) {
      $location_field['summary'] = "(" . $location_field['city'] . ", " . $location_field['province'] . ")";
      foreach ($tokens as $name => $original) {
        if (substr($name,0,15) == 'field_location_') {
          // $name is always 'field_location_xxx', so key is 'xxx'.
          $key = substr($name, 15);
          if (isset($location_field[$key])) {
            $replacements[$original] = $location_field[$key];
          }
          else {
            $replacements[$original] = '';
          }
        }
      }
    }
  }
  return $replacements;
}
ответил greg_1_anderson 13 MaramWed, 13 Mar 2013 00:12:27 +04002013-03-13T00:12:27+04:0012 2013, 00:12:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132