我使用名为SilverStripe的框架...我们目前正在将旧网站迁移到此框架上.问题是旧站点URL以.php或.html结尾,而在新站点中则没有.
我需要修改第二个重写规则,以便将请求泵送到main.php而不使用任何.html或.php扩展名.
在我目前的.htaccess中,我有以下规则:
# Turn off index.php handling requests to the homepage fixes issue in apache >=2.4
<IfModule mod_dir.c>
DirectoryIndex disabled
</IfModule>
SetEnv HTTP_MOD_REWRITE On
RewriteEngine On
# Enable HTTP Basic authentication workaround for PHP running in CGI mode
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Deny access to potentially sensitive files and folders
RewriteRule ^vendor(/|$) - [F,L,NC]
RewriteRule silverstripe-cache(/|$) - [F,L,NC]
RewriteRule composer\.(json|lock) - [F,L,NC]
# Process through SilverStripe if no file with the requested name exists.
# Pass through the …Run Code Online (Sandbox Code Playgroud) 我试着用jquery构建标签.但我认识到我的链接
<a href="#tab-1">Tab 1</a>
Run Code Online (Sandbox Code Playgroud)
转换为
<a href="/#tab-1">Tab 1</a>
Run Code Online (Sandbox Code Playgroud)
由于开头的斜线,标签不起作用.为什么Silverstripe会修改我的锚链接?如何阻止它进行此操作?
在Silverstripe中,如果右键单击Sitetree中的页面,则可以复制单个页面或页面及其所有子项.
我们发现用户偶尔会复制包含大量子项的网页,并希望通过删除"此页面和子页面"选项或仅将其限制为管理员用户来阻止此操作.
怎么能实现这一目标?
有没有办法将URL变量传递给表单操作?我已经将它用于用户详细信息表单,但是当我尝试使用用户文件上传时,它将无法正常工作.
正如您将在下面看到的,我有一个用于保存用户详细信息的表单和保存操作.这很好.
当我尝试将URL变量传递给"用户文件上载"表单时,它不起作用.它说我试图得到一个非对象的值.
// Get Client ID from URL Parameters
public function getUser() {
if( isset($this->urlParams['ID']) && is_numeric($this->urlParams['ID']) ) {
return $user = Member::get()->byID($this->urlParams['ID']);
} else {
return $user = $this->request->postVars();
}
}
// Edit/Save a User's details
public function EditUserDetails() {
//Include JS for updating details
Requirements::javascript('module-memberprofiles/javascript/MemberProfileUpdate.js');
Requirements::set_force_js_to_bottom(true);
$fields = new FieldList(
$leftCol = CompositeField::create(
TextField::create('FirstName', 'First Name')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
TextField::create('Surname', 'Surname')
->setFieldHolderTemplate('UserDetails_FieldHolder'),
CompositeField::create(
TextField::create('Address', ''),
TextField::create('Suburb', ''),
CompositeField::create(
DropdownField::create('State', '', singleton('Member')->dbObject('State')->enumValues())->setFieldHolderTemplate('UserDetails_StatePostCode'),
TextField::create('PostCode', '')->setFieldHolderTemplate('UserDetails_StatePostCode')
)->addExtraClass('row')
)
->addExtraClass('userdetails-address wrap')
->setFieldHolderTemplate('UserDetails_AddressHolder'),
TextField::create('Phone', …Run Code Online (Sandbox Code Playgroud) 如何在模板中的AdditionalCategories上过滤$ Product?
我试过了:
$Product.filter('AdditionalCategories', $MyFilter)
Run Code Online (Sandbox Code Playgroud)
但是数据库中的Product上没有AdditionalCategories列
我正在尝试为SilverStripe站点做一些非常不同的事情:在几个子页面上是数据表,这些表每个都有自己的列标题集,有些表的列比其他表多.我想避免在富文本编辑器中构建表格,因为这容易出现很多错误,并且随着时间的推移维护是一件麻烦事.
我想要做的是创建一个DataObject,它允许第n个列和第n个相应的行.这样我可以在模板中调用一个循环(或可能是两个),我已经有了HTML表结构.内容管理员可以完全控制任何给定子页面的表格中的哪些列,并且他们不必担心维护HTML表格设置.
我有几个想法没有产生我想要的结果,没有a)使内容管理器的UI体验过于复杂,b)无法正确地将列与行链接.
我曾想过为Table Headers创建一个DataObject,为Table Rows创建一个DataObject,但后来我很难理解如何以一种有意义的方式组合它们,特别是因为可能有任意数量的列.
有人会有任何建议来接近这个吗?
更新:好的,我有一些可用的TableRowItem数据对象,并且接近工作.但是,现在的问题是:当我基本上即时创建它们时,如何将字段值保存到数据库?就像现在一样,保存到数据库的唯一字段是PDF文件上载字段,其他所有内容在点击"创建"时都会被删除.
<?php
class TruckBodyPdfTableRowItem extends DataObject {
private static $db = array(
);
// One-to-one relationship with gallery page
private static $has_one = array(
'TablePage'=> 'Page',
'TableColumnSet' => 'TableColumnSet',
'PDF' => 'File',
);
// tidy up the CMS by not showing these fields
public function getCMSFields() {
$fields = parent::getCMSFields();
$fields->removeFieldFromTab("Root.Main","TablePageID");
$fields->removeFieldFromTab("Root.Main","TableColumnSetID");
$fields->removeFieldFromTab("Root.Main","SortOrder");
$fields->addFieldsToTab("Root.Main", $this->getMyColumnOptions());
return $fields;
}
public function getMyColumnOptions()
{
$columnArray = [];
$Columns = DataObject::get('TableColumnSet');
foreach($Columns as $Column){
$columnArray[] = …Run Code Online (Sandbox Code Playgroud) 假设您显示每页请求的随机语句并使用函数返回一个随机对象,如:
Statement::get()->sort("RAND()")->limit("1");
Run Code Online (Sandbox Code Playgroud)
但是现在在模板中你想在不同的地方引用它两次但它应该是相同的语句而不是随机不同的语句.您如何确保每页请求获得相同的随机对象?
有没有办法让ModelAdmin过滤器更持久?目前,如果您过滤,编辑DataObject并返回,则过滤器将消失.来自unclecheese/betterbuttons的prev/next也不尊重过滤器.它跳转到下一个Object但不一定是过滤后的对象之一.我认为有一个名为RemodelAdmin的2.4模块可以做到这一点,但是现在所有这些都是基于GridFiled的,这种接缝就像是完全不同的东西.有没有人为SilverStripe> 3或者某些提示如何实现这一目标?
我有一个相对简单的设置,使用SilverStripe 3.2.1与restfulserver插件运行,并使用各种小部件,这些小部件使用元素插件与页面相关联.
当我通过API发出GET请求以检索页面#1的一些数据时,我可以看到相关的ElementAreaID:
# GET /api/v1/Page/1.json?fields=Title,URLSegment,Content,ElementArea
{
"Title": "Welcome",
"URLSegment": "home",
"Content": "A bunch of HTML here from all the widgets in the page...",
"ElementArea": {
"className": "ElementalArea",
"href": "http://ss.local:3000/api/v1/ElementalArea/11.json",
"id": "11"
}
}
Run Code Online (Sandbox Code Playgroud)
如果我通过ElementalArea API调用跟踪链接,它将列出我页面中的所有元素:
# GET /api/v1/ElementalArea/11.json
{
"ID": "11",
"Widgets": [
{
"className": "Widget",
"href": "http://ss.local:3000/api/v1/Widget/9.json",
"id": 9
},
{
"className": "Widget",
"href": "http://ss.local:3000/api/v1/Widget/8.json",
"id": 8
},
...
]
}
Run Code Online (Sandbox Code Playgroud)
如果我遵循这些API路径,它将提供每个窗口小部件的最新版本的内容.
我的问题是如何在原始页面字段列表中包含Widget DataObjects中的某些字段?
理想情况下,我希望将每个Widget的Content字段返回到具有初始Page API请求的数组中.
以供参考:
ElementAreaElementArea有很多Widget …在SilverStripe 3.4.1中,我想_config.php通过管理员设置来控制文件值.我想在管理 > 设置 > MyTab中设置一些变量,然后在中访问这些变量_config.php.
有没有办法访问文件中的SiteConfig变量_config.php?
我尝试使用几种不同的方法来获取配置数据:
Config::inst()
print_r/ var_dump将所有值作为数组Config::inst()->get($this->class, 'PropertyName') 要么 $this->config()-> get('PropertyName')
SiteConfig::current_site_config() 或基于前两个的任何其他类似变化
我想这样做的原因是我有一个插件替换了一些SilverStripe默认操作,但它需要插入一些数据.如果未插入此数据,则应保留默认值.
以下是我读过的一些资源,试图找到解决方案:
silverstripe ×10
php ×6
.htaccess ×1
api ×1
data-objects ×1
file-upload ×1
forms ×1
javascript ×1
silvershop ×1