В TYPO3 6.x вам рекомендуется использовать классы с именами и указать configurePlugin
метод вашего имени поставщика.
Поскольку вы не указали какой-либо из вашего кода контроллера, я попытаюсь набросать it:
*Action
suffix EXT: myext / Classes / Controller / HotelController
namespace MyVendor\MyExt\Controller;
class HotelController {
/**
* @return void
*/
public function listAction(){
}
}
Затем укажите пространство имен в configurePlugin следующим образом:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
'MyVendor.' . $_EXTKEY,
// UpperCamelCase please, refer to [1]
'Hotels',
array('Hotel' => 'list,single,display,update,save,preview,edit')
);
Это позволяет локатору классов правильно разрешать классы.
Чтобы убедиться в этом, убедитесь, что вы повторно установили расширение.
PS: Пожалуйста, используйте классы с именами, когда это возможно, в 6.x. Старые классы Tx_*
- это только псевдонимы и добавили дополнительную нагрузку на ваш интерпретатор.
1 - Документы API TYPO3 для ExtensionUtility :: configurePlugin ()
Обновление:
Существует множество возможных ошибок.
switchableControllerActions
соответствующим образом? f:link.action
(или f: uri.action соответственно) не любит быть без соответствующего атрибута controller
HotelController
, и файл должен жить в Classes/Controller/HotelController.php
, затем выполните настройки configurePlugin()
, чтобы отразить имя поставщика, как я описал Вы можете сгруппировать по cumsum(Field == "Name")
. С dplyr ...
library(dplyr)
originalDF %>%
group_by(Name = Value[Field == "Name"][cumsum(Field == "Name")]) %>%
slice(-1) %>% select(c("Name", "Field", "Value"))
# A tibble: 10 x 3
# Groups: Name [4]
Name Field Value
<fct> <fct> <fct>
1 Bob Weight 158
2 Bob Age 22
3 Bob Height 72
4 Fred Age 155
5 Fred Height 65
6 Irv Weight 210
7 Irv Age 42
8 Irv Height 68
9 Sara Weight 115
10 Sara Age 17
С таблицей данных ...
library(data.table)
data.table(originalDF)[,
.SD[-1],
by=.(Name = Value[Field == "Name"][cumsum(Field == "Name")]), .SDcols=c("Field", "Value")]
Я рекомендую подходить к нему по-другому, отслеживая самое последнее значение «Имя» в каждой точке. fill()
из пакета tidyr полезен для этого.
library(dplyr)
library(tidyr)
originalDF %>%
mutate(Name = ifelse(Field == "Name", as.character(Value), NA)) %>%
fill(Name) %>%
filter(Field != "Name")
Вывод:
Index Field Value Name
1 2 Weight 115 Sara
2 3 Age 17 Sara
3 5 Weight 158 Bob
4 6 Age 22 Bob
5 7 Height 72 Bob
6 9 Weight 210 Irv
7 10 Age 42 Irv
8 11 Height 68 Irv
9 13 Age 155 Fred
10 14 Height 65 Fred
Однако, если вы действительно хотите использовать подход fuzzyjoin, вы можете добиться этого с помощью group_by()
и slice()
в своем результате, где вы возьмите последнюю строку для каждого значения Index.x
.
fuzzy_left_join(detailsDF, namesDF, by = "Index", match_fun = list(`>`)) %>%
group_by(Index.x) %>%
slice(n()) %>%
ungroup()
Вывод:
# A tibble: 10 x 6
Index.x Field.x Value.x Index.y Field.y Value.y
<int> <fct> <fct> <int> <fct> <fct>
1 2 Weight 115 1 Name Sara
2 3 Age 17 1 Name Sara
3 5 Weight 158 4 Name Bob
4 6 Age 22 4 Name Bob
5 7 Height 72 4 Name Bob
6 9 Weight 210 8 Name Irv
7 10 Age 42 8 Name Irv
8 11 Height 68 8 Name Irv
9 13 Age 155 12 Name Fred
10 14 Height 65 12 Name Fred
Вы можете использовать
x = which(originalDF$Field == "Name")
originalDF$Name = rep(originalDF$Value[x], times = diff(c(x, NROW(originalDF)+1)))
NewDF = originalDF[originalDF$Field != 'Name', c(4,2,3)]
# Name Field Value
# 2 Sara Weight 115
# 3 Sara Age 17
# 5 Bob Weight 158
# 6 Bob Age 22
# 7 Bob Height 72
# 9 Irv Weight 210
# 10 Irv Age 42
# 11 Irv Height 68
# 13 Fred Age 155
# 14 Fred Height 65