【问题标题】:SilverStripe 3.7: How to render template syntax or PHP output with out spaces?SilverStripe 3.7:如何在没有空格的情况下呈现模板语法或 PHP 输出?
【发布时间】:2020-03-07 00:42:41
【问题描述】:

如何删除模板中的空格输出?例如,我有一个 $Brand,其中一些输出是两个单词,就像我的 php 变量中的 TommyHilfiger 一样。输出变为“Tommy Hilfiger”。这非常适合前端显示,但我如何将其渲染为 TommyHilfiger 或 Tommy-Hifiger?我想在我的 html 中将它们用作 css 类。例如,像 $Brand.Nospaces。还是需要在PHP中完成?

PHP

class ProductPage extends Page {

    // Contact object's fields
    public static $db = array(
        'Brand' => 'Varchar(255)'
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $fields->addFieldToTab("Root.Details", 
            new DropdownField("Brand", "Brand", 
                array( 
                    "Adidas" => "Adidas",
                    "AmericanSportsTeams" => "American Sports Teams",
                    "United Colors of Benetton" => "United Colors of Benetton",
                    "Valentino" => "Valentino",
                )
            )
        );

        return $fields;
    }
}

class ProductPage_Controller extends Page_Controller {

}

模板 ProductPage.ss

<% loop Children %>
    <li class="$Brand">
        <a href="$Link">
            <figure style="background-image: URL(<% loop $ProductImages.limit(1,1) %>$Fill(400,600).URL<% end_loop %>);">
                <img src="<% loop $ProductImages.limit(1) %>$Fill(400,600).URL<% end_loop %>" alt="$Title" 
                    class="snipcart-add-item"
                    data-item-id="P$ID $MenuTitle"
                    data-item-max-quantity="1"
                    data-item-stock="1"
                    data-item-name="$Title"
                    data-item-price="<% if $SalePrice %>$SalePrice<% else %>$Price<% end_if %>"
                    data-item-description="$Content"
                    data-item-image="<% loop $ProductImages.limit(1) %>$Pad(50,50).URL<% end_loop %>">
            </figure>
            <div id="pro-deets">
                <h3>$Title</h3>
                $Brand
            </div>
        </a>
    </li>
<% end_loop %>

也许有:

$filter = URLSegmentFilter::create();
$className = $filter->filter($title);

我只是不清楚如何将它应用于 $Brand 它需要将模板作为 $BrandNoSpace 或其他东西,因为我需要将 $Brand 及其空格也用于显示的 txt。

【问题讨论】:

    标签: php html templates silverstripe


    【解决方案1】:

    一种简单的方法是修改 SilverStripe 控制器中的字符串:

    class ProductPage_Controller extends Page_Controller
    {
        /**
         * returns the brand name as a class (with dash instead of space)
         *
         * @return string
         */
        public function BrandAsClass()
        {
            return str_replace(' ', '-', $this->Brand);
        }
    }
    

    然后在你的模板中调用$BrandAsClass

    <% loop Children %>
        <li class="$BrandAsClass">
            <a href="$Link">
            <figure style="background-image: URL(<% loop $ProductImages.limit(1,1) %>$Fill(400,600).URL<% end_loop %>);">
                <img src="<% loop $ProductImages.limit(1) %>$Fill(400,600).URL<% end_loop %>" alt="$Title" 
                class="snipcart-add-item"
                data-item-id="P$ID $MenuTitle"
                data-item-max-quantity="1"
                data-item-stock="1"
                data-item-name="$Title"
                data-item-price="<% if $SalePrice %>$SalePrice<% else %>$Price<% end_if %>"
                data-item-description="$Content"
                data-item-image="<% loop $ProductImages.limit(1) %>$Pad(50,50).URL<% end_loop %>">
            </figure>
            <div id="pro-deets">
            <h3>$Title</h3>
             $Brand
            </div></a>
        </li>
    <% end_loop %>
    

    【讨论】:

      【解决方案2】:

      控制器中的自定义函数将更容易满足您的需求。

      class ProductPage_Controller extends Page_Controller
      {
          public function BrandNoSpaces()
          {
              return str_replace(' ', '-', $this->Brand);
          }
      }
      

      在您的模板中:

      <li class="$BrandNoSpaces">
      

      “贝纳通的统一色彩”变为

      <li class="United-Colors-of-Benetton">
      

      【讨论】:

        【解决方案3】:

        我们需要创建一个 PHP 函数来转换我们的字符串,因为在 Silverstripe 模板中没有内置的方法来执行此操作。

        Silverstripe 有一个内置的URLSegmentFilter 类,可以从字符串中删除某些字符。我们可以使用它来将我们的字符串转换为类名友好的字符串。

        我们可以在我们的ProductPage 类中创建一个getBrandClass 函数来将Brand 转换为没有空格或特殊字符的漂亮字符串:

        class ProductPage extends Page
        {
            public static $db = [
                'Brand' => 'Varchar(255)',
            ];
        
            // Other ProductPage class code
            // ...
        
            public function getBrandClass()
            {
                $urlSegmentFilter = URLSegmentFilter::create();
                return $urlSegmentFilter->filter($this->Brand);
            }
        }
        

        然后在我们的模板中,我们像这样调用$BrandClass

        <% loop $Children %>
            <li class="$BrandClass">
        

        这会将American Sports Teams 转换为american-sports-teams

        注意getBrandClass 函数必须在ProductPage 类中,而不是在ProductPage_Controller 类中。这是因为在模板中使用了不同的控制器。

        【讨论】:

          【解决方案4】:

          如果您只想从字符串的开头或结尾删除空格,请使用

          strip($string)
          

          如果要删除所有空格,请使用

          str_replace(' ', '', $string)
          

          如果您想将空格更改为 -

          str_replace(' ', '-', $string)
          

          如果您想删除所有可能的空格,请使用

          preg_replace('/\s+/', '', $string)
          
          

          【讨论】:

          • 这个问题似乎有点含糊,所以如果这不能回答,请改写。
          • 抱歉含糊不清,我添加了更多细节。
          【解决方案5】:

          这几乎是Display Multi Word Categories As 1 Word With Dashes的复制品

          您可以为此使用extension。这意味着该方法将适用于任何 varchar 字段。

          mysite/code/extensions/VarcharDecorator.php

          <?php
          class VarcharDecorator extends Extension {
              function Slugify() {
                  return FileNameFilter::create()->filter(trim($this->owner->value);
              }
          }
          

          mysite/_config/extensions.yml

          Varchar:
            extensions:
              - VarcharDecorator
          

          现在您可以在模板中使用$Brand.Slugify

          【讨论】:

            猜你喜欢
            • 2021-01-02
            • 2012-10-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-21
            相关资源
            最近更新 更多