SilverStripe 3.7: как отобразить синтаксис шаблона или вывод PHP без пробелов? - PullRequest
2 голосов
/ 11 ноября 2019

Как я могу удалить вывод пробелов в моем шаблоне? Например, у меня есть $ Brand для некоторых из этих выходных данных в виде двух слов, которые есть в моих переменных php как TommyHilfiger. Выходом становится «Томми Хилфигер». Это отлично подходит для внешнего интерфейса, но как я могу отобразить его как TommyHilfiger или Tommy-Hifiger? Я хочу использовать их в качестве классов CSS в моем HTML. Как, например, $ 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 с его пробелами для отображаемого текста.

Ответы [ 4 ]

2 голосов
/ 13 ноября 2019

Нам нужно создать функцию PHP для преобразования нашей строки, поскольку в шаблоне Silverstripe нет встроенного способа сделать это.

Silverstripe имеет встроенный класс URLSegmentFilter, который удаляетопределенные символы из строки. Мы можем использовать это для преобразования нашей строки в строку, понятную для имени класса.

Мы можем создать функцию getBrandClass в нашем классе ProductPage, чтобы преобразовать 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. Это потому, что в шаблоне используется другой контроллер.

2 голосов
/ 12 ноября 2019

Один простой подход - изменить строку в контроллере 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 голосов
/ 12 ноября 2019

Пользовательская функция в вашем контроллере будет намного проще для того, что вы хотите.

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

В вашем шаблоне:

<li class="$BrandNoSpaces">

«United Colors of Benetton» становится

<li class="United-Colors-of-Benetton">
1 голос
/ 11 ноября 2019

Если вы просто хотите удалить пробелы в начале или конце строки, используйте

strip($string)

, если вы хотите удалить все пробелы, используйте

str_replace(' ', '', $string)

, если вы хотите изменитьпробел до -

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

, если вы хотите удалить все возможные пробелы, используйте

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

...